summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/.gitignore6
-rw-r--r--src/CMakeLists.txt83
-rw-r--r--src/ability_type.hpp44
-rw-r--r--src/ability_type_fwd.hpp3
-rw-r--r--src/alloc.hpp29
-rw-r--r--src/alloc_entry.hpp10
-rw-r--r--src/artifact_type.hpp54
-rw-r--r--src/artifact_type_fwd.hpp3
-rw-r--r--src/birth.cc1380
-rw-r--r--src/birth.h14
-rw-r--r--src/birth.hpp12
-rw-r--r--src/birther.hpp12
-rw-r--r--src/bldg.cc272
-rw-r--r--src/bldg.hpp9
-rw-r--r--src/cave.cc617
-rw-r--r--src/cave.hpp100
-rw-r--r--src/cave_type.hpp2
-rw-r--r--src/cmd1.cc834
-rw-r--r--src/cmd1.hpp38
-rw-r--r--src/cmd2.cc802
-rw-r--r--src/cmd2.hpp53
-rw-r--r--src/cmd3.cc421
-rw-r--r--src/cmd3.hpp39
-rw-r--r--src/cmd4.cc1055
-rw-r--r--src/cmd4.hpp48
-rw-r--r--src/cmd5.cc847
-rw-r--r--src/cmd5.hpp29
-rw-r--r--src/cmd6.cc919
-rw-r--r--src/cmd6.hpp26
-rw-r--r--src/cmd7.cc1362
-rw-r--r--src/cmd7.hpp43
-rw-r--r--src/corrupt.cc103
-rw-r--r--src/corrupt.hpp14
-rw-r--r--src/defines.h1311
-rw-r--r--src/dungeon.cc745
-rw-r--r--src/dungeon.h4
-rw-r--r--src/dungeon.hpp4
-rw-r--r--src/dungeon_flag.hpp12
-rw-r--r--src/dungeon_flag_list.hpp55
-rw-r--r--src/dungeon_flag_set.hpp7
-rw-r--r--src/dungeon_info_type.hpp118
-rw-r--r--src/ego_flag.hpp12
-rw-r--r--src/ego_flag_list.hpp38
-rw-r--r--src/ego_flag_set.hpp7
-rw-r--r--src/ego_item_type.hpp100
-rw-r--r--src/ego_item_type_fwd.hpp3
-rw-r--r--src/feature_flag.hpp12
-rw-r--r--src/feature_flag_list.hpp25
-rw-r--r--src/feature_flag_set.hpp7
-rw-r--r--src/feature_type.hpp37
-rw-r--r--src/feature_type_fwd.hpp3
-rw-r--r--src/files.cc2157
-rw-r--r--src/files.h6
-rw-r--r--src/files.hpp50
-rw-r--r--src/flag_set.hpp201
-rw-r--r--src/flags_group.hpp13
-rw-r--r--src/game.cc3
-rw-r--r--src/game.hpp97
-rw-r--r--src/game_edit_data.hpp138
-rw-r--r--src/game_edit_data_fwd.hpp3
-rw-r--r--src/game_fwd.hpp4
-rw-r--r--src/gen_evol.cc18
-rw-r--r--src/gen_evol.hpp4
-rw-r--r--src/gen_maze.hpp2
-rw-r--r--src/generate.cc1399
-rw-r--r--src/generate.hpp16
-rw-r--r--src/gods.cc11
-rw-r--r--src/gods.hpp18
-rw-r--r--src/grid.hpp72
-rw-r--r--src/help.cc103
-rw-r--r--src/help.hpp16
-rw-r--r--src/help_info.hpp4
-rw-r--r--src/hiscore.hpp1
-rw-r--r--src/hist_type.hpp16
-rw-r--r--src/hist_type_fwd.hpp3
-rw-r--r--src/hooks.cc6
-rw-r--r--src/hooks.hpp8
-rw-r--r--src/include/tome/enum_string_map.hpp6
-rw-r--r--src/include/tome/pp/global_constexpr.hpp21
-rw-r--r--src/include/tome/squelch/automatizer.hpp16
-rw-r--r--src/include/tome/squelch/condition.hpp90
-rw-r--r--src/include/tome/squelch/rule.hpp14
-rw-r--r--src/include/tome/squelch/tree_printer.hpp4
-rw-r--r--src/init1.cc5180
-rw-r--r--src/init1.hpp43
-rw-r--r--src/init2.cc470
-rw-r--r--src/init2.h5
-rw-r--r--src/init2.hpp6
-rw-r--r--src/inscription_info_type.hpp1
-rw-r--r--src/joke.cc4
-rw-r--r--src/joke.hpp2
-rw-r--r--src/level_marker.cc12
-rw-r--r--src/level_marker.hpp25
-rw-r--r--src/levels.cc25
-rw-r--r--src/levels.hpp18
-rw-r--r--src/loadsave.cc2451
-rw-r--r--src/loadsave.h5
-rw-r--r--src/loadsave.hpp5
-rw-r--r--src/lua_bind.cc44
-rw-r--r--src/lua_bind.hpp24
-rw-r--r--src/main-gcu.c18
-rw-r--r--src/main-gtk2.c24
-rw-r--r--src/main-sdl.c267
-rw-r--r--src/main-win.c16
-rw-r--r--src/main-x11.c19
-rw-r--r--src/main.c374
-rw-r--r--src/main.cc270
-rw-r--r--src/main.h11
-rw-r--r--src/melee1.cc501
-rw-r--r--src/melee1.hpp6
-rw-r--r--src/melee2.cc3358
-rw-r--r--src/melee2.hpp12
-rw-r--r--src/message.cc15
-rw-r--r--src/message.hpp31
-rw-r--r--src/messages.cc377
-rw-r--r--src/messages.hpp57
-rw-r--r--src/meta_class_type.hpp10
-rw-r--r--src/meta_class_type_fwd.hpp3
-rw-r--r--src/mimic.cc163
-rw-r--r--src/mimic.hpp16
-rw-r--r--src/module_type.hpp3
-rw-r--r--src/modules.cc75
-rw-r--r--src/modules.h15
-rw-r--r--src/modules.hpp17
-rw-r--r--src/monoid.hpp37
-rw-r--r--src/monster1.cc814
-rw-r--r--src/monster1.hpp6
-rw-r--r--src/monster2.cc783
-rw-r--r--src/monster2.hpp78
-rw-r--r--src/monster3.cc107
-rw-r--r--src/monster3.hpp30
-rw-r--r--src/monster_blow.hpp8
-rw-r--r--src/monster_ego.hpp106
-rw-r--r--src/monster_ego_fwd.hpp3
-rw-r--r--src/monster_power.hpp4
-rw-r--r--src/monster_power_fwd.hpp3
-rw-r--r--src/monster_race.hpp98
-rw-r--r--src/monster_race_flag.hpp12
-rw-r--r--src/monster_race_flag_list.hpp152
-rw-r--r--src/monster_race_flag_set.hpp7
-rw-r--r--src/monster_spell.cc36
-rw-r--r--src/monster_spell.hpp91
-rw-r--r--src/monster_spell_flag.hpp20
-rw-r--r--src/monster_spell_flag_list.hpp101
-rw-r--r--src/monster_spell_flag_set.hpp7
-rw-r--r--src/monster_type.hpp8
-rw-r--r--src/notes.cc20
-rw-r--r--src/notes.hpp8
-rw-r--r--src/obj_theme.hpp45
-rw-r--r--src/object1.cc2414
-rw-r--r--src/object1.hpp73
-rw-r--r--src/object2.cc1576
-rw-r--r--src/object2.hpp116
-rw-r--r--src/object_filter.cc29
-rw-r--r--src/object_filter.hpp15
-rw-r--r--src/object_flag.hpp12
-rw-r--r--src/object_flag_list.hpp185
-rw-r--r--src/object_flag_meta.cc59
-rw-r--r--src/object_flag_meta.hpp75
-rw-r--r--src/object_flag_set.hpp7
-rw-r--r--src/object_kind.hpp76
-rw-r--r--src/object_kind_fwd.hpp3
-rw-r--r--src/object_proto.hpp12
-rw-r--r--src/object_type.hpp90
-rw-r--r--src/option_type.hpp8
-rw-r--r--src/options.cc95
-rw-r--r--src/options.hpp296
-rw-r--r--src/owner_type.hpp14
-rw-r--r--src/owner_type_fwd.hpp3
-rw-r--r--src/player_class.hpp104
-rw-r--r--src/player_level_flag.hpp13
-rw-r--r--src/player_race.hpp85
-rw-r--r--src/player_race_ability_type.hpp9
-rw-r--r--src/player_race_flag.hpp12
-rw-r--r--src/player_race_flag_list.hpp26
-rw-r--r--src/player_race_flag_set.hpp7
-rw-r--r--src/player_race_mod.hpp95
-rw-r--r--src/player_sex.hpp17
-rw-r--r--src/player_sex_fwd.hpp3
-rw-r--r--src/player_shared.hpp16
-rw-r--r--src/player_spec.hpp37
-rw-r--r--src/player_type.cc28
-rw-r--r--src/player_type.hpp737
-rw-r--r--src/point.hpp24
-rw-r--r--src/powers.cc89
-rw-r--r--src/powers.hpp3
-rw-r--r--src/q_betwen.cc70
-rw-r--r--src/q_betwen.hpp2
-rw-r--r--src/q_bounty.cc56
-rw-r--r--src/q_bounty.hpp10
-rw-r--r--src/q_dragons.cc50
-rw-r--r--src/q_dragons.hpp2
-rw-r--r--src/q_eol.cc77
-rw-r--r--src/q_eol.hpp2
-rw-r--r--src/q_evil.cc48
-rw-r--r--src/q_evil.hpp2
-rw-r--r--src/q_fireprof.cc153
-rw-r--r--src/q_fireprof.hpp8
-rw-r--r--src/q_god.cc358
-rw-r--r--src/q_god.hpp6
-rw-r--r--src/q_haunted.cc75
-rw-r--r--src/q_haunted.hpp2
-rw-r--r--src/q_hobbit.cc59
-rw-r--r--src/q_hobbit.hpp2
-rw-r--r--src/q_invas.cc56
-rw-r--r--src/q_invas.hpp2
-rw-r--r--src/q_library.cc66
-rw-r--r--src/q_library.hpp6
-rw-r--r--src/q_main.cc83
-rw-r--r--src/q_main.hpp6
-rw-r--r--src/q_narsil.cc30
-rw-r--r--src/q_narsil.hpp2
-rw-r--r--src/q_nazgul.cc54
-rw-r--r--src/q_nazgul.hpp2
-rw-r--r--src/q_nirna.cc41
-rw-r--r--src/q_nirna.hpp2
-rw-r--r--src/q_one.cc156
-rw-r--r--src/q_one.hpp2
-rw-r--r--src/q_poison.cc160
-rw-r--r--src/q_poison.hpp2
-rw-r--r--src/q_rand.cc230
-rw-r--r--src/q_rand.hpp6
-rw-r--r--src/q_shroom.cc88
-rw-r--r--src/q_shroom.hpp2
-rw-r--r--src/q_spider.cc46
-rw-r--r--src/q_spider.hpp2
-rw-r--r--src/q_thief.cc63
-rw-r--r--src/q_thief.hpp2
-rw-r--r--src/q_thrain.cc100
-rw-r--r--src/q_thrain.hpp2
-rw-r--r--src/q_troll.cc44
-rw-r--r--src/q_troll.hpp2
-rw-r--r--src/q_ultrae.cc4
-rw-r--r--src/q_ultrae.hpp2
-rw-r--r--src/q_ultrag.cc79
-rw-r--r--src/q_ultrag.hpp2
-rw-r--r--src/q_wight.cc64
-rw-r--r--src/q_wight.hpp2
-rw-r--r--src/q_wolves.cc55
-rw-r--r--src/q_wolves.hpp2
-rw-r--r--src/quark.cc96
-rw-r--r--src/quark.hpp12
-rw-r--r--src/quest.cc7
-rw-r--r--src/quest.hpp2
-rw-r--r--src/quest_type.hpp8
-rw-r--r--src/randart.cc151
-rw-r--r--src/randart.hpp7
-rw-r--r--src/randart_gen_type_fwd.hpp3
-rw-r--r--src/randart_part_type.hpp67
-rw-r--r--src/randart_part_type_fwd.hpp3
-rw-r--r--src/random_artifact.hpp6
-rw-r--r--src/random_quest.hpp2
-rw-r--r--src/random_spell.hpp21
-rw-r--r--src/random_spell_fwd.hpp3
-rw-r--r--src/rule_type.hpp19
-rw-r--r--src/rune_spell.hpp15
-rw-r--r--src/rune_spell_fwd.hpp3
-rw-r--r--src/script.cc30
-rw-r--r--src/script.h12
-rw-r--r--src/seed.cc53
-rw-r--r--src/seed.hpp51
-rw-r--r--src/seed_fwd.hpp3
-rw-r--r--src/set_component.hpp16
-rw-r--r--src/set_type.hpp26
-rw-r--r--src/set_type_fwd.hpp3
-rw-r--r--src/skill_descriptor.hpp37
-rw-r--r--src/skill_flag.hpp12
-rw-r--r--src/skill_flag_list.hpp9
-rw-r--r--src/skill_flag_set.hpp7
-rw-r--r--src/skill_modifier.hpp12
-rw-r--r--src/skill_modifiers.hpp17
-rw-r--r--src/skill_modifiers_fwd.hpp3
-rw-r--r--src/skill_type.hpp49
-rw-r--r--src/skill_type_fwd.hpp3
-rw-r--r--src/skills.cc797
-rw-r--r--src/skills.hpp45
-rw-r--r--src/skills_defs.hpp6
-rw-r--r--src/spellbinder.hpp21
-rw-r--r--src/spells1.cc1140
-rw-r--r--src/spells1.hpp57
-rw-r--r--src/spells2.cc1814
-rw-r--r--src/spells2.hpp213
-rw-r--r--src/spells3.cc182
-rw-r--r--src/spells3.hpp1
-rw-r--r--src/spells4.cc6
-rw-r--r--src/spells5.cc29
-rw-r--r--src/spells6.cc5
-rw-r--r--src/squelch/automatizer.cc35
-rw-r--r--src/squelch/condition.cc350
-rw-r--r--src/squelch/condition_metadata.cc88
-rw-r--r--src/squelch/rule.cc84
-rw-r--r--src/squelch/tree_printer.cc5
-rw-r--r--src/squeltch.cc148
-rw-r--r--src/squeltch.hpp12
-rw-r--r--src/status.cc783
-rw-r--r--src/status.hpp3
-rw-r--r--src/store.cc815
-rw-r--r--src/store.hpp20
-rw-r--r--src/store_action_type.hpp12
-rw-r--r--src/store_flag.hpp12
-rw-r--r--src/store_flag_list.hpp17
-rw-r--r--src/store_flag_set.hpp7
-rw-r--r--src/store_info_type.hpp29
-rw-r--r--src/store_info_type_fwd.hpp3
-rw-r--r--src/store_item.hpp18
-rw-r--r--src/store_type.hpp21
-rw-r--r--src/tables.cc848
-rw-r--r--src/tables.hpp12
-rw-r--r--src/tactic_info_type.hpp1
-rw-r--r--src/timer_type.hpp73
-rw-r--r--src/town_type.hpp20
-rw-r--r--src/trap_type.hpp24
-rw-r--r--src/trap_type_fwd.hpp3
-rw-r--r--src/traps.cc3174
-rw-r--r--src/traps.hpp13
-rw-r--r--src/util.cc410
-rw-r--r--src/util.h15
-rw-r--r--src/util.hpp142
-rw-r--r--src/variable.cc448
-rw-r--r--src/variable.h8
-rw-r--r--src/variable.hpp149
-rw-r--r--src/vault_type.hpp19
-rw-r--r--src/vault_type_fwd.hpp3
-rw-r--r--src/wild.cc278
-rw-r--r--src/wild.hpp8
-rw-r--r--src/wilderness_map.hpp10
-rw-r--r--src/wilderness_type_info.hpp21
-rw-r--r--src/wilderness_type_info_fwd.hpp3
-rw-r--r--src/wizard1.cc2499
-rw-r--r--src/wizard1.hpp3
-rw-r--r--src/wizard2.cc352
-rw-r--r--src/wizard2.hpp10
-rw-r--r--src/xtra1.cc1008
-rw-r--r--src/xtra1.hpp41
-rw-r--r--src/xtra2.cc749
-rw-r--r--src/xtra2.hpp161
-rw-r--r--src/z-form.h8
-rw-r--r--src/z-rand.cc434
-rw-r--r--src/z-rand.hpp54
-rw-r--r--src/z-term.h82
-rw-r--r--src/z-util.h12
341 files changed, 20751 insertions, 39667 deletions
diff --git a/src/.gitignore b/src/.gitignore
index 098f3b10..485f14c6 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -1,3 +1,7 @@
/harness
-/tome
+/tome-gcu
+/tome-gtk2
+/tome-sdl
+/tome-x11
+/tome-win
*.plist
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f4b2d2db..30ceb76c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,6 +1,9 @@
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/bandit)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/fmt)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/pcg-cpp/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/jsoncons)
# Add subdirectories
ADD_SUBDIRECTORY (squelch)
@@ -22,6 +25,7 @@ SET(SRCS_COMMON
dice.cc
dungeon.cc
files.cc
+ game.cc
gen_evol.cc
gen_maze.cc
generate.cc
@@ -32,14 +36,17 @@ SET(SRCS_COMMON
init1.cc
init2.cc
joke.cc
+ level_marker.cc
levels.cc
loadsave.cc
lua_bind.cc
melee1.cc
melee2.cc
+ message.cc
messages.cc
mimic.cc
modules.cc
+ monster_spell.cc
monster_type.cc
monster1.cc
monster2.cc
@@ -48,7 +55,9 @@ SET(SRCS_COMMON
object1.cc
object2.cc
object_filter.cc
+ object_flag_meta.cc
options.cc
+ player_type.cc
powers.cc
q_betwen.cc
q_bounty.cc
@@ -78,11 +87,9 @@ SET(SRCS_COMMON
q_ultrag.cc
q_wight.cc
q_wolves.cc
- quark.cc
quest.cc
randart.cc
range.cc
- script.cc
skills.cc
spell_type.cc
spells1.cc
@@ -92,15 +99,13 @@ SET(SRCS_COMMON
spells5.cc
spells6.cc
squeltch.cc
- status.cc
store.cc
tables.cc
- traps.cc
util.cc
variable.cc
wild.cc
- wizard1.cc
wizard2.cc
+ seed.cc
xtra1.cc
xtra2.cc
z-form.c
@@ -109,31 +114,27 @@ SET(SRCS_COMMON
z-util.c
)
-# Sources (PROGRAM)
-SET(SRCS_PROGRAM
- main-gcu.c
- main-gtk2.c
- main-sdl.c
- main-x11.c
- main.c
-)
-
# Sources (TEST)
SET(SRCS_TESTS
../tests/get_level_device.cc
../tests/harness.cc
../tests/lua_get_level.cc
+ ../tests/flag_set.cc
+ ../tests/grid.cc
)
ADD_LIBRARY(game
- ${SRCS_COMMON}
+ ${SRCS_COMMON} ${SRCS_VENDOR}
)
+ADD_LIBRARY(game_main
+ main.cc)
+
# Need a few additional source files for Windows.
-if(WIN32)
+IF(WIN32)
SET(SRCS ${SRCS} main-win.c)
# Resource files require a little workaround.
- if(MINGW)
+ IF(MINGW)
# Workaround for resource compilation for mingw on CMake.
# See http://www.cmake.org/Bug/view.php?id=4068
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/angband_rc.o
@@ -141,20 +142,44 @@ if(WIN32)
-i${CMAKE_CURRENT_SOURCE_DIR}/angband.rc
-o ${CMAKE_CURRENT_BINARY_DIR}/angband_rc.o)
SET(SRCS ${SRCS} ${CMAKE_CURRENT_BINARY_DIR}/angband_rc.o)
- else(MINGW)
+ ELSE(MINGW)
SET(SRCS ${SRCS} angband.rc)
- endif(MINGW)
-endif(WIN32)
+ ENDIF(MINGW)
+ # Executable for Win32
+ ADD_EXECUTABLE(tome-win WIN32 main-win.c)
+ TARGET_LINK_LIBRARIES(tome-win game squelch ${LIBS} winmm wsock32)
+ INSTALL(TARGETS tome-win RUNTIME DESTINATION bin)
+ENDIF(WIN32)
+
+# tome executables
+IF(X11_FOUND)
+ INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR})
+ ADD_EXECUTABLE(tome-x11 main-x11.c)
+ TARGET_LINK_LIBRARIES(tome-x11 game_main game squelch ${LIBS} ${X11_LIBRARIES})
+ INSTALL(TARGETS tome-x11 RUNTIME DESTINATION bin)
+ENDIF()
-# tome executable
-ADD_EXECUTABLE(tome ${EXECUTABLE_OPTIONS} ${SRCS_PROGRAM})
-TARGET_LINK_LIBRARIES(tome game squelch ${LIBS})
+IF(SDL_FOUND AND SDLIMAGE_FOUND AND SDLTTF_FOUND)
+ INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR})
+ ADD_EXECUTABLE(tome-sdl main-sdl.c)
+ TARGET_LINK_LIBRARIES(tome-sdl game_main game squelch ${LIBS} ${SDLIMAGE_LIBRARY} ${SDLTTF_LIBRARY} ${SDL_LIBRARY} m)
+ INSTALL(TARGETS tome-sdl RUNTIME DESTINATION bin)
+ENDIF()
+
+IF(CURSES_FOUND)
+ INCLUDE_DIRECTORIES(${CURSES_INCLUDE_DIR})
+ ADD_EXECUTABLE(tome-gcu main-gcu.c)
+ TARGET_LINK_LIBRARIES(tome-gcu game_main game squelch ${LIBS} ${CURSES_LIBRARIES})
+ INSTALL(TARGETS tome-gcu RUNTIME DESTINATION bin)
+ENDIF()
+
+IF(GTK2_FOUND)
+ INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS})
+ ADD_EXECUTABLE(tome-gtk2 main-gtk2.c)
+ TARGET_LINK_LIBRARIES(tome-gtk2 game_main game squelch ${LIBS} ${GTK2_LIBRARIES})
+ INSTALL(TARGETS tome-gtk2 RUNTIME DESTINATION bin)
+ENDIF()
# test harness executable
-ADD_EXECUTABLE(harness ${EXECUTABLE_OPTIONS} ${SRCS_TESTS})
+ADD_EXECUTABLE(harness ${SRCS_TESTS})
TARGET_LINK_LIBRARIES(harness game squelch ${LIBS})
-
-# Installation
-INSTALL(TARGETS tome
- RUNTIME DESTINATION games
-)
diff --git a/src/ability_type.hpp b/src/ability_type.hpp
index ea8a921d..0ec596ba 100644
--- a/src/ability_type.hpp
+++ b/src/ability_type.hpp
@@ -1,5 +1,8 @@
#pragma once
+#include <string>
+#include <vector>
+
#include "h-basic.h"
/**
@@ -7,21 +10,38 @@
*/
struct ability_type
{
- const char *name; /* Name */
- char *desc; /* Description */
+public:
+ struct skill_requirement {
+ s16b skill_idx = 0;
+ s16b level = 0;
+ };
+
+public:
+ std::string name; /* Name */
+ std::string desc; /* Description */
+
+ std::string action_desc; /* Action Description */
+
+ s16b action_mkey = 0; /* Action do to */
+
+ s16b cost = 0; /* Skill points cost */
- const char *action_desc; /* Action Description */
+ std::vector<skill_requirement> need_skills; /* List of prereq skills */
- s16b action_mkey; /* Action do to */
+ s16b stat[6] { }; /* List of prereq stats */
- s16b cost; /* Skill points cost */
+ std::vector<s16b> need_abilities; /* List of prereq abilities */
- bool_ acquired; /* Do the player actualylg ot it ? */
+ /**
+ * Default constructor
+ */
+ ability_type()
+ {
+ for (auto &stat_ref: stat)
+ {
+ // Requirement is always met unless otherwise specified.
+ stat_ref = -1;
+ }
+ }
- /* Prereqs */
- s16b skills[10]; /* List of prereq skills(10 max) */
- s16b skill_levels[10]; /* List of prereq skills(10 max) */
- s16b stat[6]; /* List of prereq stats */
- s16b need_abilities[10]; /* List of prereq abilities(10 max) */
- s16b forbid_abilities[10]; /* List of forbidden abilities(10 max) */
};
diff --git a/src/ability_type_fwd.hpp b/src/ability_type_fwd.hpp
deleted file mode 100644
index bade8638..00000000
--- a/src/ability_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct ability_type;
diff --git a/src/alloc.hpp b/src/alloc.hpp
new file mode 100644
index 00000000..1d4ce815
--- /dev/null
+++ b/src/alloc.hpp
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "h-basic.h"
+#include "alloc_entry.hpp"
+
+#include <vector>
+
+/**
+ * Allocations of object kinds and monster races.
+ */
+struct Alloc {
+
+ /*
+ * The entries in the "kind allocator table"
+ */
+ std::vector<alloc_entry> kind_table;
+
+ /*
+ * The flag to tell if kind_table contains valid entries
+ * for normal (i.e. kind_is_legal) object allocation
+ */
+ bool kind_table_valid = false;
+
+ /*
+ * The entries in the "race allocator table"
+ */
+ std::vector<alloc_entry> race_table;
+
+};
diff --git a/src/alloc_entry.hpp b/src/alloc_entry.hpp
index 41ec3b66..5e0e547f 100644
--- a/src/alloc_entry.hpp
+++ b/src/alloc_entry.hpp
@@ -11,10 +11,10 @@
*/
struct alloc_entry
{
- s16b index; /* The actual index */
+ s16b index = -1; /* The actual index */
- byte level; /* Base dungeon level */
- byte prob1; /* Probability, pass 1 */
- byte prob2; /* Probability, pass 2 */
- byte prob3; /* Probability, pass 3 */
+ byte level = 0; /* Base dungeon level */
+ byte prob1 = 0; /* Probability, pass 1 */
+ byte prob2 = 0; /* Probability, pass 2 */
+ byte prob3 = 0; /* Probability, pass 3 */
};
diff --git a/src/artifact_type.hpp b/src/artifact_type.hpp
index 7a4340aa..9f866aa7 100644
--- a/src/artifact_type.hpp
+++ b/src/artifact_type.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "h-basic.h"
+#include "object_flag_set.hpp"
/**
* Artifact descriptor.
@@ -11,50 +12,39 @@
*/
struct artifact_type
{
- char const *name; /* Artifact name */
- char *text; /* Artifact description */
+ char const *name = nullptr; /* Artifact name */
+ char *text = nullptr; /* Artifact description */
- byte tval; /* Artifact type */
- byte sval; /* Artifact sub type */
+ byte tval = 0; /* Artifact type */
+ byte sval = 0; /* Artifact sub type */
- s16b pval; /* Artifact extra info */
+ s16b pval = 0; /* Artifact extra info */
- s16b to_h; /* Bonus to hit */
- s16b to_d; /* Bonus to damage */
- s16b to_a; /* Bonus to armor */
+ s16b to_h = 0; /* Bonus to hit */
+ s16b to_d = 0; /* Bonus to damage */
+ s16b to_a = 0; /* Bonus to armor */
- s16b activate; /* Activation Number */
+ s16b activate = 0; /* Activation Number */
- s16b ac; /* Base armor */
+ s16b ac = 0; /* Base armor */
- byte dd, ds; /* Damage when hits */
+ byte dd = 0; /* Damage dice */
+ byte ds = 0; /* Damage sides */
- s16b weight; /* Weight */
+ s16b weight = 0; /* Weight */
- s32b cost; /* Artifact "cost" */
+ s32b cost = 0; /* Artifact "cost" */
- u32b flags1; /* Artifact Flags, set 1 */
- u32b flags2; /* Artifact Flags, set 2 */
- u32b flags3; /* Artifact Flags, set 3 */
- u32b flags4; /* Artifact Flags, set 4 */
- u32b flags5; /* Artifact Flags, set 5 */
+ object_flag_set flags; /* Artifact Flags */
+ object_flag_set oflags; /* Obvious Flags */
- u32b oflags1; /* Obvious Flags, set 1 */
- u32b oflags2; /* Obvious Flags, set 2 */
- u32b oflags3; /* Obvious Flags, set 3 */
- u32b oflags4; /* Obvious Flags, set 4 */
- u32b oflags5; /* Obvious Flags, set 5 */
+ byte level = 0; /* Artifact level */
+ byte rarity = 0; /* Artifact rarity */
- byte level; /* Artifact level */
- byte rarity; /* Artifact rarity */
+ byte cur_num = 0; /* Number created (0 or 1) */
- byte cur_num; /* Number created (0 or 1) */
- byte max_num; /* Unused (should be "1") */
+ s16b power = 0; /* Power granted, if any */
- u32b esp; /* ESP flags */
- u32b oesp; /* ESP flags */
+ s16b set = 0; /* Which set does it belong it, if any? */
- s16b power; /* Power granted(if any) */
-
- s16b set; /* Does it belongs to a set ?*/
};
diff --git a/src/artifact_type_fwd.hpp b/src/artifact_type_fwd.hpp
deleted file mode 100644
index f3862d5a..00000000
--- a/src/artifact_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct artifact_type;
diff --git a/src/birth.cc b/src/birth.cc
index f3897496..f677e6e1 100644
--- a/src/birth.cc
+++ b/src/birth.cc
@@ -6,27 +6,27 @@
* included in all such copies.
*/
#include "birth.hpp"
-#include "birth.h"
#include "ability_type.hpp"
#include "artifact_type.hpp"
#include "corrupt.hpp"
#include "cmd4.hpp"
#include "cmd5.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
#include "files.h"
#include "files.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "help.hpp"
-#include "hist_type.hpp"
#include "hooks.hpp"
#include "init2.hpp"
#include "mimic.hpp"
#include "messages.hpp"
-#include "meta_class_type.hpp"
#include "modules.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "notes.hpp"
#include "object1.hpp"
#include "object2.hpp"
@@ -34,6 +34,7 @@
#include "options.hpp"
#include "player_class.hpp"
#include "player_race.hpp"
+#include "player_race_flag.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
#include "q_rand.hpp"
@@ -46,7 +47,6 @@
#include "store.hpp"
#include "tables.hpp"
#include "town_type.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -56,6 +56,10 @@
#include "xtra2.hpp"
#include "z-rand.hpp"
+#include <algorithm>
+#include <boost/filesystem.hpp>
+#include <fmt/format.h>
+#include <numeric>
#include <string>
/*
@@ -100,73 +104,48 @@ static s32b auto_round;
*/
static s32b last_round;
-/* Human */
-static const char *human_syllable1[] =
-{
- "Ab", "Ac", "Ad", "Af", "Agr", "Ast", "As", "Al", "Adw", "Adr", "Ar",
- "B", "Br", "C", "Cr", "Ch", "Cad", "D", "Dr", "Dw", "Ed", "Eth", "Et",
- "Er", "El", "Eow", "F", "Fr", "G", "Gr", "Gw", "Gal", "Gl", "H", "Ha",
- "Ib", "Jer", "K", "Ka", "Ked", "L", "Loth", "Lar", "Leg", "M", "Mir",
- "N", "Nyd", "Ol", "Oc", "On", "P", "Pr", "R", "Rh", "S", "Sev", "T",
- "Tr", "Th", "V", "Y", "Z", "W", "Wic",
-};
-
-static const char *human_syllable2[] =
-{
- "a", "ae", "au", "ao", "are", "ale", "ali", "ay", "ardo", "e", "ei",
- "ea", "eri", "era", "ela", "eli", "enda", "erra", "i", "ia", "ie",
- "ire", "ira", "ila", "ili", "ira", "igo", "o", "oa", "oi", "oe",
- "ore", "u", "y",
-};
-
-static const char *human_syllable3[] =
-{
- "a", "and", "b", "bwyn", "baen", "bard", "c", "ctred", "cred", "ch",
- "can", "d", "dan", "don", "der", "dric", "dfrid", "dus", "f", "g",
- "gord", "gan", "l", "li", "lgrin", "lin", "lith", "lath", "loth",
- "ld", "ldric", "ldan", "m", "mas", "mos", "mar", "mond", "n",
- "nydd", "nidd", "nnon", "nwan", "nyth", "nad", "nn", "nnor", "nd",
- "p", "r", "ron", "rd", "s", "sh", "seth", "sean", "t", "th", "tha",
- "tlan", "trem", "tram", "v", "vudd", "w", "wan", "win", "wyn", "wyr",
- "wyr", "wyth",
-};
-
/*
* Random Name Generator
* based on a Javascript by Michael Hensley
* "http://geocities.com/timessquare/castle/6274/"
*/
-static void create_random_name(int race, char *name)
+static std::string create_random_name()
{
- const char *syl1, *syl2, *syl3;
-
- int idx;
-
-
- /* Paranoia */
- if (!name) return;
-
- /* Select the monster type */
- switch (race)
- {
- /* Create the monster name */
-
- /* Use human ones */
- default:
- {
- idx = rand_int(sizeof(human_syllable1) / sizeof(char *));
- syl1 = human_syllable1[idx];
- idx = rand_int(sizeof(human_syllable2) / sizeof(char *));
- syl2 = human_syllable2[idx];
- idx = rand_int(sizeof(human_syllable3) / sizeof(char *));
- syl3 = human_syllable3[idx];
-
- break;
- }
- }
-
- /* Concatenate selected syllables */
- strnfmt(name, 32, "%s%s%s", syl1, syl2, syl3);
+ static const std::vector<std::string> human_syllable1
+ {
+ "Ab", "Ac", "Ad", "Af", "Agr", "Ast", "As", "Al", "Adw", "Adr", "Ar",
+ "B", "Br", "C", "Cr", "Ch", "Cad", "D", "Dr", "Dw", "Ed", "Eth", "Et",
+ "Er", "El", "Eow", "F", "Fr", "G", "Gr", "Gw", "Gal", "Gl", "H", "Ha",
+ "Ib", "Jer", "K", "Ka", "Ked", "L", "Loth", "Lar", "Leg", "M", "Mir",
+ "N", "Nyd", "Ol", "Oc", "On", "P", "Pr", "R", "Rh", "S", "Sev", "T",
+ "Tr", "Th", "V", "Y", "Z", "W", "Wic",
+ };
+
+ static const std::vector<std::string> human_syllable2
+ {
+ "a", "ae", "au", "ao", "are", "ale", "ali", "ay", "ardo", "e", "ei",
+ "ea", "eri", "era", "ela", "eli", "enda", "erra", "i", "ia", "ie",
+ "ire", "ira", "ila", "ili", "ira", "igo", "o", "oa", "oi", "oe",
+ "ore", "u", "y",
+ };
+
+ static const std::vector<std::string> human_syllable3
+ {
+ "a", "and", "b", "bwyn", "baen", "bard", "c", "ctred", "cred", "ch",
+ "can", "d", "dan", "don", "der", "dric", "dfrid", "dus", "f", "g",
+ "gord", "gan", "l", "li", "lgrin", "lin", "lith", "lath", "loth",
+ "ld", "ldric", "ldan", "m", "mas", "mos", "mar", "mond", "n",
+ "nydd", "nidd", "nnon", "nwan", "nyth", "nad", "nn", "nnor", "nd",
+ "p", "r", "ron", "rd", "s", "sh", "seth", "sean", "t", "th", "tha",
+ "tlan", "trem", "tram", "v", "vudd", "w", "wan", "win", "wyn", "wyr",
+ "wyr", "wyth",
+ };
+
+ auto const &syl1 = *uniform_element(human_syllable1);
+ auto const &syl2 = *uniform_element(human_syllable2);
+ auto const &syl3 = *uniform_element(human_syllable3);
+
+ return syl1 + syl2 + syl3;
}
@@ -197,15 +176,13 @@ void print_desc(cptr txt)
/*
* Save the current data for later
*/
-static void save_prev_data(void)
+static void save_prev_data()
{
- int i;
-
+ auto &previous_char = game->previous_char;
/*** Save the current data ***/
/* Save the data */
- previous_char.sex = p_ptr->psex;
previous_char.race = p_ptr->prace;
previous_char.rmod = p_ptr->pracem;
previous_char.pclass = p_ptr->pclass;
@@ -216,24 +193,14 @@ static void save_prev_data(void)
previous_char.god = p_ptr->pgod;
previous_char.grace = p_ptr->grace;
- previous_char.age = p_ptr->age;
- previous_char.wt = p_ptr->wt;
- previous_char.ht = p_ptr->ht;
- previous_char.sc = p_ptr->sc;
previous_char.au = p_ptr->au;
/* Save the stats */
- for (i = 0; i < 6; i++)
+ for (int i = 0; i < 6; i++)
{
previous_char.stat[i] = p_ptr->stat_max[i];
}
previous_char.luck = p_ptr->luck_base;
-
- /* Save the history */
- for (i = 0; i < 4; i++)
- {
- strcpy(previous_char.history[i], history[i]);
- }
}
@@ -242,45 +209,29 @@ static void save_prev_data(void)
*/
static void load_prev_data(bool_ save)
{
- int i;
-
+ auto &previous_char = game->previous_char;
birther temp;
/*** Save the current data ***/
/* Save the data */
- temp.age = p_ptr->age;
- temp.wt = p_ptr->wt;
- temp.ht = p_ptr->ht;
- temp.sc = p_ptr->sc;
temp.au = p_ptr->au;
/* Save the stats */
- for (i = 0; i < 6; i++)
+ for (int i = 0; i < 6; i++)
{
temp.stat[i] = p_ptr->stat_max[i];
}
temp.luck = p_ptr->luck_base;
- /* Save the history */
- for (i = 0; i < 4; i++)
- {
- strcpy(temp.history[i], history[i]);
- }
-
-
/*** Load the previous data ***/
/* Load the data */
- p_ptr->age = previous_char.age;
- p_ptr->wt = previous_char.wt;
- p_ptr->ht = previous_char.ht;
- p_ptr->sc = previous_char.sc;
p_ptr->au = previous_char.au;
/* Load the stats */
- for (i = 0; i < 6; i++)
+ for (int i = 0; i < 6; i++)
{
p_ptr->stat_max[i] = previous_char.stat[i];
p_ptr->stat_cur[i] = previous_char.stat[i];
@@ -288,35 +239,19 @@ static void load_prev_data(bool_ save)
p_ptr->luck_base = previous_char.luck;
p_ptr->luck_max = previous_char.luck;
- /* Load the history */
- for (i = 0; i < 4; i++)
- {
- strcpy(history[i], previous_char.history[i]);
- }
-
/*** Save the current data ***/
if (!save) return;
/* Save the data */
- previous_char.age = temp.age;
- previous_char.wt = temp.wt;
- previous_char.ht = temp.ht;
- previous_char.sc = temp.sc;
previous_char.au = temp.au;
/* Save the stats */
- for (i = 0; i < 6; i++)
+ for (int i = 0; i < 6; i++)
{
previous_char.stat[i] = temp.stat[i];
}
previous_char.luck = temp.luck;
-
- /* Save the history */
- for (i = 0; i < 4; i++)
- {
- strcpy(previous_char.history[i], temp.history[i]);
- }
}
@@ -385,7 +320,7 @@ static int adjust_stat(int value, int amount, int auto_roll)
*
* For efficiency, we include a chunk of "calc_bonuses()".
*/
-static void get_stats(void)
+static void get_stats()
{
int i, j;
@@ -436,7 +371,7 @@ static void get_stats(void)
p_ptr->stat_max[i] = j;
/* Obtain a "bonus" for "race" and "class" */
- bonus = rp_ptr->r_adj[i] + rmp_ptr->r_adj[i] + cp_ptr->c_adj[i];
+ bonus = rp_ptr->ps.adj[i] + rmp_ptr->ps.adj[i] + cp_ptr->ps.adj[i];
/* Start fully healed */
p_ptr->stat_cur[i] = p_ptr->stat_max[i];
@@ -456,289 +391,121 @@ static void get_stats(void)
/*
- * Roll for some info that the auto-roller ignores
+ * Roll for player HP
*/
-static void get_extra(void)
+void roll_player_hp()
{
- int i, j, min_value, max_value;
+ auto &player_hp = game->player_hp;
+ // Minimum hitpoints at highest level
+ int const min_value =
+ (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 3) / 8 + PY_MAX_LEVEL;
- /* Level one */
- p_ptr->max_plv = p_ptr->lev = 1;
-
- /* Experience factor */
- p_ptr->expfact = rp_ptr->r_exp + rmp_ptr->r_exp + cp_ptr->c_exp;
+ // Maximum hitpoints at highest level
+ int const max_value =
+ (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 5) / 8 + PY_MAX_LEVEL;
- /* Initialize quest */
- p_ptr->inside_quest = 0;
-
- /* Hitdice */
- p_ptr->hitdie = rp_ptr->r_mhp + rmp_ptr->r_mhp + cp_ptr->c_mhp;
-
- /* Initial hitpoints */
- p_ptr->mhp = p_ptr->hitdie;
-
- /* Minimum hitpoints at highest level */
- min_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 3) / 8;
- min_value += PY_MAX_LEVEL;
-
- /* Maximum hitpoints at highest level */
- max_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 5) / 8;
- max_value += PY_MAX_LEVEL;
-
- /* Pre-calculate level 1 hitdice */
+ // Pre-calculate level 1 hitdice; first roll is always maximal
player_hp[0] = p_ptr->hitdie;
- /* Roll out the hitpoints */
- while (TRUE)
+ // Roll out the hitpoints
+ while (true)
{
- /* Roll the hitpoint values */
- for (i = 1; i < PY_MAX_LEVEL; i++)
- {
- j = randint(p_ptr->hitdie);
- player_hp[i] = player_hp[i - 1] + j;
- }
+ // Roll the hitpoint values
+ std::generate(
+ player_hp.begin() + 1,
+ player_hp.end(),
+ []() { return randint(p_ptr->hitdie); });
- /* XXX Could also require acceptable "mid-level" hitpoints */
+ // Sum along
+ std::partial_sum(
+ player_hp.begin(),
+ player_hp.end(),
+ player_hp.begin());
- /* Require "valid" hitpoints at highest level */
- if (player_hp[PY_MAX_LEVEL - 1] < min_value) continue;
- if (player_hp[PY_MAX_LEVEL - 1] > max_value) continue;
+ // Require "valid" hitpoints at highest level
+ if (player_hp.back() < min_value) continue;
+ if (player_hp.back() > max_value) continue;
- /* Acceptable */
+ // Acceptable
break;
}
-
- p_ptr->tactic = 4;
- p_ptr->movement = 4;
}
/*
- * Get the racial history, and social class, using the "history charts".
+ * Roll for some info that the auto-roller ignores
*/
-static void get_history(void)
+static void get_extra()
{
- int i, n, chart, roll, social_class;
-
- char *s, *t;
-
- char buf[240];
-
-
- /* Clear the previous history strings */
- for (i = 0; i < 4; i++) history[i][0] = '\0';
-
- /* Clear the history text */
- buf[0] = '\0';
-
- /* Initial social class */
- social_class = randint(4);
-
- /* Starting place */
- chart = rp_ptr->chart;
-
- /* Process the history */
- while (chart)
- {
- /* Start over */
- i = 0;
-
- /* Roll for nobility */
- roll = randint(100);
-
-
- /* Access the proper entry in the table */
- while ((chart != bg[i].chart) || (roll > bg[i].roll)) i++;
-
- /* Acquire the textual history */
- (void)strcat(buf, bg[i].info);
-
- /* Add in the social class */
- social_class += (int)(bg[i].bonus) - 50;
-
- /* Enter the next chart */
- chart = bg[i].next;
- }
-
-
-
- /* Verify social class */
- if (social_class > 100) social_class = 100;
- else if (social_class < 1) social_class = 1;
-
- /* Save the social class */
- p_ptr->sc = social_class;
-
-
- /* Skip leading spaces */
- for (s = buf; *s == ' '; s++) /* loop */;
-
- /* Get apparent length */
- n = strlen(s);
-
- /* Kill trailing spaces */
- while ((n > 0) && (s[n - 1] == ' ')) s[--n] = '\0';
-
-
- /* Start at first line */
- i = 0;
-
- /* Collect the history */
- while (TRUE)
- {
- /* Extract remaining length */
- n = strlen(s);
-
- /* All done */
- if (n < 60)
- {
- /* Save one line of history */
- strcpy(history[i++], s);
+ /* Level one */
+ p_ptr->max_plv = p_ptr->lev = 1;
- /* All done */
- break;
- }
+ /* Experience factor */
+ p_ptr->expfact = rp_ptr->ps.exp + rmp_ptr->ps.exp + cp_ptr->ps.exp;
- /* Find a reasonable break-point */
- for (n = 60; ((n > 0) && (s[n - 1] != ' ')); n--) /* loop */;
+ /* Initialize quest */
+ p_ptr->inside_quest = 0;
- /* Save next location */
- t = s + n;
+ /* Hitdice */
+ p_ptr->hitdie = rp_ptr->ps.mhp + rmp_ptr->ps.mhp + cp_ptr->ps.mhp;
- /* Wipe trailing spaces */
- while ((n > 0) && (s[n - 1] == ' ')) s[--n] = '\0';
+ /* Initial hitpoints */
+ p_ptr->mhp = p_ptr->hitdie;
- /* Save one line of history */
- strcpy(history[i++], s);
+ /* Roll for HP */
+ roll_player_hp();
- /* Start next line */
- for (s = t; *s == ' '; s++) /* loop */;
- }
+ /* Set tactics and movement */
+ p_ptr->tactic = 4;
+ p_ptr->movement = 4;
}
/*
* Fill the random_artifacts array with relevant info.
*/
-static errr init_randart(void)
+static errr init_randart()
{
- int i;
-
- long cost;
-
- random_artifact* ra_ptr;
-
char buf[80];
-
- for (i = 0; i < MAX_RANDARTS; i++)
+ for (int i = 0; i < MAX_RANDARTS; i++)
{
- ra_ptr = &random_artifacts[i];
-
- strcpy(ra_ptr->name_short,
- get_line("rart_s.txt", ANGBAND_DIR_FILE, buf, i));
- strcpy(ra_ptr->name_full,
- get_line("rart_f.txt", ANGBAND_DIR_FILE, buf, i));
-
- ra_ptr->attr = randint(15);
- ra_ptr->activation = rand_int(MAX_T_ACT);
- ra_ptr->generated = FALSE;
-
- cost = randnor(0, 250);
+ // Generate a 'cost'
+ auto cost = randnor(0, 250);
+ if (cost < 0)
+ {
+ cost = 0;
+ }
- if (cost < 0) cost = 0;
+ // Generate the random artifact
+ random_artifact ra;
+ ra.name_short = get_line("rart_s.txt", ANGBAND_DIR_FILE, buf, i);
+ ra.name_full = get_line("rart_f.txt", ANGBAND_DIR_FILE, buf, i);
+ ra.attr = randint(15);
+ ra.activation = rand_int(MAX_T_ACT);
+ ra.generated = FALSE;
+ ra.cost = cost;
- ra_ptr->cost = cost;
+ // Push
+ game->random_artifacts.push_back(ra);
}
return 0;
}
-/*
- * A helper function for get_ahw(), also called by polymorph code
- */
-void get_height_weight(void)
-{
- int h_mean, h_stddev;
-
- int w_mean, w_stddev;
-
-
- /* Extract mean and standard deviation -- Male */
- if (p_ptr->psex == SEX_MALE)
- {
- h_mean = rp_ptr->m_b_ht + rmp_ptr->m_b_ht;
- h_stddev = rp_ptr->m_m_ht + rmp_ptr->m_m_ht;
-
- w_mean = rp_ptr->m_b_wt + rmp_ptr->m_b_wt;
- w_stddev = rp_ptr->m_m_wt + rmp_ptr->m_m_wt;
- }
-
- /* Female */
- else if (p_ptr->psex == SEX_FEMALE)
- {
- h_mean = rp_ptr->f_b_ht + rmp_ptr->f_b_ht;
- h_stddev = rp_ptr->f_m_ht + rmp_ptr->f_m_ht;
-
- w_mean = rp_ptr->f_b_wt + rmp_ptr->f_b_wt;
- w_stddev = rp_ptr->f_m_wt + rmp_ptr->f_m_wt;
- }
-
- /* Neuter XXX */
- else
- {
- h_mean = (rp_ptr->m_b_ht + rmp_ptr->m_b_ht +
- rp_ptr->f_b_ht + rmp_ptr->f_b_ht) / 2,
- h_stddev = (rp_ptr->m_m_ht + rmp_ptr->m_m_ht +
- rp_ptr->f_m_ht + rmp_ptr->f_m_ht) / 2;
-
- w_mean = (rp_ptr->m_b_wt + rmp_ptr->m_b_wt +
- rp_ptr->f_b_wt + rmp_ptr->f_b_wt) / 2,
- w_stddev = (rp_ptr->m_m_wt + rmp_ptr->m_m_wt +
- rp_ptr->f_m_wt + rmp_ptr->f_m_wt) / 2;
- }
-
- /* Calculate height/weight */
- p_ptr->ht = randnor(h_mean, h_stddev);
- p_ptr->wt = randnor(w_mean, w_stddev);
-
- /* Weight/height shouldn't be negative */
- if (p_ptr->ht < 1) p_ptr->ht = 1;
- if (p_ptr->wt < 1) p_ptr->wt = 1;
-}
-
-
-/*
- * Computes character's age, height, and weight
- */
-static void get_ahw(void)
-{
- /* Calculate the age */
- p_ptr->age = rp_ptr->b_age + rmp_ptr->b_age +
- randint(rp_ptr->m_age + rmp_ptr->m_age);
-
- /* Calculate the height/weight */
- get_height_weight();
-}
-
-
-
/*
* Get the player's starting money
*/
-static void get_money(void)
+static void get_money()
{
- int i, gold;
-
-
- /* Social Class determines starting gold */
- gold = (p_ptr->sc * 6) + randint(100) + 300;
+ /* Starting gold */
+ int gold = randint(100) + 300;
/* Process the stats */
- for (i = 0; i < 6; i++)
+ for (int i = 0; i < 6; i++)
{
/* Mega-Hack -- reduce gold for high stats */
if (stat_use[i] >= 18 + 50) gold -= 300;
@@ -761,7 +528,7 @@ static void get_money(void)
*
* See 'display_player()' for basic method.
*/
-static void birth_put_stats(void)
+static void birth_put_stats()
{
int i, p;
@@ -798,17 +565,19 @@ static void birth_put_stats(void)
/*
* Clear all the global "character" data
*/
-static void player_wipe(void)
+static void player_wipe()
{
- int i, j;
-
+ auto const &d_info = game->edit_data.d_info;
+ auto &r_info = game->edit_data.r_info;
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+ auto &level_markers = game->level_markers;
/* Wipe special levels */
wipe_saved();
/* Hack -- zero the struct */
- static_assert(std::is_pod<player_type>::value, "Cannot memset non-POD type");
- memset(p_ptr, 0, sizeof(player_type));
+ *p_ptr = player_type();
/* Level 1 is the first level */
p_ptr->lev = 1;
@@ -816,33 +585,23 @@ static void player_wipe(void)
/* Not dead yet */
p_ptr->lives = 0;
- /* Wipe the history */
- for (i = 0; i < 4; i++)
- {
- for (j = 0; j < 60; j++)
- {
- if (j < 59) history[i][j] = ' ';
- else history[i][j] = '\0';
- }
- }
-
/* Wipe the towns */
- for (i = 0; i < max_d_idx; i++)
+ for (auto &&i: level_markers)
{
- for (j = 0; j < MAX_DUNGEON_DEPTH; j++)
+ for (auto &&j: i)
{
- special_lvl[j][i] = 0;
+ j = level_marker::NORMAL;
}
}
/* Wipe the towns */
- for (i = max_real_towns + 1; i < max_towns; i++)
+ for (std::size_t i = max_real_towns + 1; i < max_towns; i++)
{
town_info[i].flags = 0;
}
/* Wipe the quests */
- for (i = 0; i < MAX_Q_IDX; i++)
+ for (std::size_t i = 0; i < MAX_Q_IDX; i++)
{
quest[i].status = QUEST_STATUS_UNTAKEN;
for (auto &quest_data : quest[i].data)
@@ -851,22 +610,12 @@ static void player_wipe(void)
}
}
- /* Wipe the rune spells */
- rune_num = 0;
- for (i = 0; i < MAX_RUNES; i++)
- {
- strcpy(rune_spells[i].name, "");
- rune_spells[i].type = 0;
- rune_spells[i].rune2 = 0;
- rune_spells[i].mana = 0;
- }
-
/* No items */
inven_cnt = 0;
equip_cnt = 0;
/* Clear the inventory */
- for (i = 0; i < INVEN_TOTAL; i++)
+ for (std::size_t i = 0; i < INVEN_TOTAL; i++)
{
object_wipe(&p_ptr->inventory[i]);
}
@@ -875,32 +624,29 @@ static void player_wipe(void)
init_randart();
/* Start with no artifacts made yet */
- for (i = 0; i < max_a_idx; i++)
+ for (auto &a_ref: a_info)
{
- artifact_type *a_ptr = &a_info[i];
- a_ptr->cur_num = 0;
+ a_ref.cur_num = 0;
}
/* Reset the "objects" */
- for (i = 1; i < max_k_idx; i++)
+ for (auto &k_ref: k_info)
{
- object_kind *k_ptr = &k_info[i];
-
/* Reset "tried" */
- k_ptr->tried = FALSE;
+ k_ref.tried = FALSE;
/* Reset "aware" */
- k_ptr->aware = FALSE;
+ k_ref.aware = FALSE;
/* Reset "artifact" */
- k_ptr->artifact = 0;
+ k_ref.artifact = 0;
}
/* Reset the "monsters" */
- for (i = 1; i < max_r_idx; i++)
+ for (auto &r_ref: r_info)
{
- monster_race *r_ptr = &r_info[i];
+ auto r_ptr = &r_ref;
/* Hack -- Reset the counter */
r_ptr->cur_num = 0;
@@ -909,8 +655,7 @@ static void player_wipe(void)
r_ptr->max_num = 100;
/* Hack -- Reset the max counter */
- if (r_ptr->flags1 & RF1_UNIQUE) r_ptr->max_num = 1;
- if (r_ptr->flags3 & RF3_UNIQUE_4) r_ptr->max_num = 4;
+ if (r_ptr->flags & RF_UNIQUE) r_ptr->max_num = 1;
/* Clear player kills */
r_ptr->r_pkills = 0;
@@ -924,12 +669,7 @@ static void player_wipe(void)
p_ptr->food = PY_FOOD_FULL - 1;
/* Clear "cheat" options */
- cheat_peek = FALSE;
- cheat_hear = FALSE;
- cheat_room = FALSE;
- cheat_xtra = FALSE;
- cheat_know = FALSE;
- cheat_live = FALSE;
+ options->reset_cheat_options();
/* Assume no winning game */
total_winner = 0;
@@ -939,11 +679,8 @@ static void player_wipe(void)
noscore = 0;
wizard = 0;
- /* Assume no innate spells */
- spell_num = 0;
-
/* Clear the fate */
- for (i = 0; i < MAX_FATES; i++)
+ for (std::size_t i = 0; i < MAX_FATES; i++)
{
fates[i].fate = 0;
}
@@ -971,22 +708,15 @@ static void player_wipe(void)
doppleganger = 0;
/* Wipe the recall depths */
- for (i = 0; i < max_d_idx; i++)
+ for (std::size_t i = 0; i < d_info.size(); i++)
{
max_dlv[i] = 0;
}
/* Wipe the known inscription list */
- for (i = 0; i < MAX_INSCRIPTIONS; i++)
- {
- inscription_info[i].know = FALSE;
- }
-
- /* Wipe the known traps list */
- for (i = 0; i < max_t_idx; i++)
+ for (auto &inscription_known: p_ptr->inscriptions)
{
- t_info[i].known = 0;
- t_info[i].ident = FALSE;
+ inscription_known = false;
}
/* Reset wild_mode to FALSE */
@@ -997,7 +727,7 @@ static void player_wipe(void)
p_ptr->allow_one_death = 0;
/* Wipe the power list */
- for (i = 0; i < POWER_MAX; i++)
+ for (std::size_t i = 0; i < POWER_MAX; i++)
{
p_ptr->powers_mod[i] = 0;
}
@@ -1014,29 +744,39 @@ static void player_wipe(void)
/* Create an object */
-void outfit_obj(int tv, int sv, int pval, int dd, int ds)
+static void outfit_obj(object_proto const *proto)
{
object_type forge;
- object_type *q_ptr;
/* Get local object */
- q_ptr = &forge;
+ auto q_ptr = &forge;
q_ptr->pval = 0;
q_ptr->pval2 = 0;
/* Hack -- Give the player an object */
- object_prep(q_ptr, lookup_kind(tv, sv));
+ object_prep(q_ptr, lookup_kind(proto->tval, proto->sval));
- if (pval)
- q_ptr->pval = pval;
+ if (proto->pval)
+ {
+ q_ptr->pval = proto->pval;
+ }
/* These objects are "storebought" */
q_ptr->ident |= IDENT_MENTAL;
- q_ptr->number = damroll(dd, ds);
+ q_ptr->number = damroll(proto->dd, proto->ds);
object_aware(q_ptr);
object_known(q_ptr);
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
+}
+
+
+static void outfit_objs(std::vector<object_proto> const &protos)
+{
+ for (auto const &proto: protos)
+ {
+ outfit_obj(&proto);
+ }
}
@@ -1051,7 +791,7 @@ static void player_outfit_object(int qty, int tval, int sval)
q_ptr->number = qty;
object_aware(q_ptr);
object_known(q_ptr);
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
}
@@ -1074,11 +814,11 @@ static void player_outfit_spellbook(cptr spell_name)
*
* Having an item makes the player "aware" of its purpose.
*/
-static void player_outfit(void)
+static void player_outfit()
{
- int i;
+ // Shorthand names for convenience
cptr class_name = spp_ptr->title;
- cptr subrace_name = rmp_ptr->title;
+ auto const &subrace_name = rmp_ptr->title;
/*
* Get an adventurer guide describing a bit of the
@@ -1144,37 +884,37 @@ static void player_outfit(void)
}
/* Dragons */
- if (streq(subrace_name, "Red"))
+ if (subrace_name == "Red")
{
player_outfit_spellbook("Globe of Light");
}
- if (streq(subrace_name, "Black"))
+ if (subrace_name == "Black")
{
player_outfit_spellbook("Geyser");
}
- if (streq(subrace_name, "Green"))
+ if (subrace_name == "Green")
{
player_outfit_spellbook("Noxious Cloud");
}
- if (streq(subrace_name, "Blue"))
+ if (subrace_name == "Blue")
{
player_outfit_spellbook("Stone Skin");
}
- if (streq(subrace_name, "White"))
+ if (subrace_name == "White")
{
player_outfit_spellbook("Sense Monsters");
}
- if (streq(subrace_name, "Ethereal"))
+ if (subrace_name == "Ethereal")
{
player_outfit_spellbook("Recharge");
}
/* Demons */
- if (streq(subrace_name, "(Aewrog)"))
+ if (subrace_name == "(Aewrog)")
{
player_outfit_spellbook("Charm");
}
- if (streq(subrace_name, "(Narrog)"))
+ if (subrace_name == "(Narrog)")
{
player_outfit_spellbook("Phase Door");
}
@@ -1212,7 +952,7 @@ static void player_outfit(void)
identify_pack_fully();
}
- if (streq(rmp_ptr->title, "Vampire"))
+ if (rmp_ptr->title == "Vampire")
{
player_gain_corruption(CORRUPT_VAMPIRE_TEETH);
player_gain_corruption(CORRUPT_VAMPIRE_STRENGTH);
@@ -1237,55 +977,29 @@ static void player_outfit(void)
q_ptr->timeout = rand_range(3, 7) * 500;
object_aware(q_ptr);
object_known(q_ptr);
- (void)inven_carry(q_ptr, FALSE);
- }
-
- /* Rogues have a better knowledge of traps */
- if (has_ability(AB_TRAPPING))
- {
- t_info[TRAP_OF_DAGGER_I].known = randint(50) + 50;
- t_info[TRAP_OF_POISON_NEEDLE].known = randint(50) + 50;
- t_info[TRAP_OF_FIRE_BOLT].known = randint(50) + 50;
- t_info[TRAP_OF_DAGGER_I].ident = TRUE;
- t_info[TRAP_OF_POISON_NEEDLE].ident = TRUE;
- t_info[TRAP_OF_FIRE_BOLT].ident = TRUE;
-
- /* Hack -- Give the player a some ammo for the traps */
- object_type forge;
- object_type *q_ptr = &forge;
- object_prep(q_ptr, lookup_kind(TV_SHOT, SV_AMMO_NORMAL));
- q_ptr->number = (byte)rand_range(5, 15);
- object_aware(q_ptr);
- object_known(q_ptr);
-
- /* These objects are "storebought" */
- q_ptr->ident |= IDENT_MENTAL;
-
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
}
- /* Hack -- Give the player some useful objects */
- for (i = 0; i < rp_ptr->obj_num; i++)
- outfit_obj(rp_ptr->obj_tval[i], rp_ptr->obj_sval[i], rp_ptr->obj_pval[i], rp_ptr->obj_dd[i], rp_ptr->obj_ds[i]);
- for (i = 0; i < rmp_ptr->obj_num; i++)
- outfit_obj(rmp_ptr->obj_tval[i], rmp_ptr->obj_sval[i], rmp_ptr->obj_pval[i], rmp_ptr->obj_dd[i], rmp_ptr->obj_ds[i]);
- for (i = 0; i < cp_ptr->obj_num; i++)
- outfit_obj(cp_ptr->obj_tval[i], cp_ptr->obj_sval[i], cp_ptr->obj_pval[i], cp_ptr->obj_dd[i], cp_ptr->obj_ds[i]);
- for (i = 0; i < cp_ptr->spec[p_ptr->pspec].obj_num; i++)
- outfit_obj(cp_ptr->spec[p_ptr->pspec].obj_tval[i], cp_ptr->spec[p_ptr->pspec].obj_sval[i], cp_ptr->spec[p_ptr->pspec].obj_pval[i], cp_ptr->spec[p_ptr->pspec].obj_dd[i], cp_ptr->spec[p_ptr->pspec].obj_ds[i]);
+ /* Outfit the player with starting items */
+ outfit_objs(rp_ptr->object_protos);
+ outfit_objs(rmp_ptr->object_protos);
+ outfit_objs(cp_ptr->object_protos);
+ outfit_objs(cp_ptr->spec[p_ptr->pspec].object_protos);
}
-int dump_classes(s16b *classes, int sel, u32b *restrictions)
+static void dump_classes(std::vector<u16b> const &classes, int sel, u32b *restrictions)
{
- int n = 0;
+ auto const &class_info = game->edit_data.class_info;
char buf[80];
/* Clean up */
clear_from(12);
- while (classes[n] != -1)
+ int n_max = static_cast<int>(classes.size()); // Warning avoidance
+
+ for (int n = 0; n < n_max; n++)
{
cptr mod = "";
char p2 = ')', p1 = ' ';
@@ -1302,7 +1016,7 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions)
/* Display */
strnfmt(buf, 80, "%c%c%c %s%s", p1,
- (n <= 25) ? I2A(n) : I2D(n - 26), p2, cp_ptr->title, mod);
+ (n <= 25) ? I2A(n) : I2D(n - 26), p2, cp_ptr->title.c_str(), mod);
/* Print some more info */
if (sel == n)
@@ -1310,7 +1024,7 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions)
std::string desc;
desc += cp_ptr->desc;
- if (cp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (cp_ptr->flags & PR_EXPERIMENTAL)
{
desc += "\nEXPERIMENTAL";
}
@@ -1318,7 +1032,7 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions)
print_desc(desc.c_str());
if (!(restrictions[classes[n] / 32] & BIT(classes[n])) ||
- cp_ptr->flags1 & PR1_EXPERIMENTAL)
+ (cp_ptr->flags & PR_EXPERIMENTAL))
c_put_str(TERM_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4));
else
c_put_str(TERM_L_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4));
@@ -1326,36 +1040,34 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions)
else
{
if (!(restrictions[classes[n] / 32] & BIT(classes[n])) ||
- cp_ptr->flags1 & PR1_EXPERIMENTAL)
+ (cp_ptr->flags & PR_EXPERIMENTAL))
c_put_str(TERM_SLATE, buf, 18 + (n / 4), 1 + 20 * (n % 4));
else
put_str(buf, 18 + (n / 4), 1 + 20 * (n % 4));
}
- n++;
- }
- return (n);
+ }
}
-int dump_specs(int sel)
+static void dump_specs(int sel_)
{
- int n = 0;
+ auto const &class_info = game->edit_data.class_info;
- char buf[80];
+ assert(sel_ >= 0);
+ std::size_t sel = sel_;
- /* Clean up */
clear_from(12);
- for (n = 0; n < MAX_SPEC; n++)
- {
- char p2 = ')', p1 = ' ';
+ auto specs = &class_info[p_ptr->pclass].spec;
- /* Found the last one ? */
- if (!class_info[p_ptr->pclass].spec[n].title) break;
+ for (std::size_t n = 0; n < specs->size(); n++)
+ {
+ char p2 = ')';
+ char p1 = ' ';
/* Analyze */
p_ptr->pspec = n;
- spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec];
+ spp_ptr = &(*specs)[p_ptr->pspec];
if (sel == n)
{
@@ -1364,6 +1076,7 @@ int dump_specs(int sel)
}
/* Display */
+ char buf[80];
strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, spp_ptr->title);
/* Print some more info */
@@ -1372,32 +1085,40 @@ int dump_specs(int sel)
std::string desc;
desc += spp_ptr->desc;
- if (spp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (spp_ptr->flags & PR_EXPERIMENTAL)
{
desc += "\nEXPERIMENTAL";
}
print_desc(desc.c_str());
- if (spp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (spp_ptr->flags & PR_EXPERIMENTAL)
+ {
c_put_str(TERM_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4));
+ }
else
+ {
c_put_str(TERM_L_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4));
+ }
}
else
{
- if (spp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (spp_ptr->flags & PR_EXPERIMENTAL)
+ {
c_put_str(TERM_SLATE, buf, 18 + (n / 4), 1 + 20 * (n % 4));
+ }
else
+ {
put_str(buf, 18 + (n / 4), 1 + 20 * (n % 4));
+ }
}
}
-
- return (n);
}
-int dump_races(int sel)
+static int dump_races(int sel)
{
+ auto const &race_info = game->edit_data.race_info;
+
int n = 0;
char buf[80];
@@ -1405,7 +1126,7 @@ int dump_races(int sel)
/* Clean up */
clear_from(12);
- for (n = 0; n < max_rp_idx; n++)
+ for (n = 0; n < static_cast<int>(race_info.size()); n++)
{
char p2 = ')', p1 = ' ';
@@ -1420,7 +1141,7 @@ int dump_races(int sel)
}
/* Display */
- strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rp_ptr->title);
+ strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rp_ptr->title.c_str());
/* Print some more info */
if (sel == n)
@@ -1428,21 +1149,21 @@ int dump_races(int sel)
std::string desc;
desc += rp_ptr->desc;
- if (rp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (rp_ptr->flags & PR_EXPERIMENTAL)
{
desc += "\nEXPERIMENTAL";
}
print_desc(desc.c_str());
- if (rp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (rp_ptr->flags & PR_EXPERIMENTAL)
c_put_str(TERM_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5));
else
c_put_str(TERM_L_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5));
}
else
{
- if (rp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (rp_ptr->flags & PR_EXPERIMENTAL)
c_put_str(TERM_SLATE, buf, 18 + (n / 5), 1 + 15 * (n % 5));
else
put_str(buf, 18 + (n / 5), 1 + 15 * (n % 5));
@@ -1453,8 +1174,10 @@ int dump_races(int sel)
}
-int dump_rmods(int sel, int *racem, int max)
+static int dump_rmods(int sel, int *racem, int max)
{
+ auto const &race_mod_info = game->edit_data.race_mod_info;
+
int n = 0;
char buf[80];
@@ -1479,7 +1202,7 @@ int dump_rmods(int sel, int *racem, int max)
/* Display */
if (racem[n])
- strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rmp_ptr->title);
+ strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rmp_ptr->title.c_str());
else
strnfmt(buf, 80, "%c%c%c Classical", p1, I2A(n), p2);
@@ -1488,22 +1211,22 @@ int dump_rmods(int sel, int *racem, int max)
{
std::string desc;
- desc += rmp_ptr->desc;
- if (rmp_ptr->flags1 & PR1_EXPERIMENTAL)
+ desc += rmp_ptr->description;
+ if (rmp_ptr->flags & PR_EXPERIMENTAL)
{
desc += "\nEXPERIMENTAL";
}
print_desc(desc.c_str());
- if (rmp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (rmp_ptr->flags & PR_EXPERIMENTAL)
c_put_str(TERM_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5));
else
c_put_str(TERM_L_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5));
}
else
{
- if (rmp_ptr->flags1 & PR1_EXPERIMENTAL)
+ if (rmp_ptr->flags & PR_EXPERIMENTAL)
c_put_str(TERM_SLATE, buf, 18 + (n / 5), 1 + 15 * (n % 5));
else
put_str(buf, 18 + (n / 5), 1 + 15 * (n % 5));
@@ -1513,7 +1236,7 @@ int dump_rmods(int sel, int *racem, int max)
return (n);
}
-int dump_gods(int sel, int *choice, int max)
+static int dump_gods(int sel, int *choice, int max)
{
int i, j;
char buf[80];
@@ -1576,7 +1299,12 @@ static bool_ do_quick_start = FALSE;
static bool_ player_birth_aux_ask()
{
- int i, k, n, v, sel;
+ auto &class_info = game->edit_data.class_info;
+ auto const &race_info = game->edit_data.race_info;
+ auto const &race_mod_info = game->edit_data.race_mod_info;
+ auto const &d_info = game->edit_data.d_info;
+
+ int k, n, v, sel;
int racem[100], max_racem = 0;
@@ -1584,12 +1312,12 @@ static bool_ player_birth_aux_ask()
char c;
- char p2 = ')';
-
char buf[200];
char inp[200];
- s16b *class_types;
+ int const NAME_ROW = 2;
+ int const RACE_ROW = 3;
+ int const CLASS_ROW = 4;
/*** Intro ***/
@@ -1597,14 +1325,12 @@ static bool_ player_birth_aux_ask()
Term_clear();
/* Title everything */
- put_str("Name :", 2, 1);
- put_str("Sex :", 3, 1);
- put_str("Race :", 4, 1);
- put_str("Class :", 5, 1);
+ put_str("Name :", NAME_ROW, 1);
+ c_put_str(TERM_L_BLUE, game->player_name.c_str(), NAME_ROW, 9);
- /* Dump the default name */
- c_put_str(TERM_L_BLUE, player_name, 2, 9);
+ put_str("Race :", RACE_ROW, 1);
+ put_str("Class :", CLASS_ROW, 1);
/*** Instructions ***/
@@ -1621,16 +1347,12 @@ static bool_ player_birth_aux_ask()
/*** Quick Start ***/
- if (previous_char.quick_ok)
+ if (game->previous_char.quick_ok)
{
- /* Extra info */
- Term_putstr(1, 15, -1, TERM_WHITE,
- "Do you want to use the quick start function(same character as your last one).");
-
/* Choose */
while (1)
{
- put_str("Use quick start (y/n)?", 20, 2);
+ put_str("Use same character as last time (y/n)? ", 20, 2);
c = inkey();
if (c == 'Q') quit(NULL);
else if (c == 'S') return (FALSE);
@@ -1650,78 +1372,22 @@ static bool_ player_birth_aux_ask()
/* Clean up */
clear_from(15);
- /*** Player sex ***/
-
- if (do_quick_start)
- {
- k = previous_char.sex;
- }
- else
- {
- /* Extra info */
- Term_putstr(5, 15, -1, TERM_WHITE,
- "Your 'sex' does not have any significant gameplay effects.");
-
- /* Prompt for "Sex" */
- for (n = 0; n < MAX_SEXES; n++)
- {
- /* Analyze */
- p_ptr->psex = n;
- sp_ptr = &sex_info[p_ptr->psex];
-
- /* Display */
- strnfmt(buf, 200, "%c%c %s", I2A(n), p2, sp_ptr->title);
- put_str(buf, 21 + (n / 5), 2 + 15 * (n % 5));
- }
-
- /* Choose */
- while (1)
- {
- strnfmt(buf, 200, "Choose a sex (%c-%c), * for random, = for options: ", I2A(0), I2A(n - 1));
- put_str(buf, 20, 2);
- c = inkey();
- if (c == 'Q') quit(NULL);
- if (c == 'S') return (FALSE);
- if (c == '*')
- {
- k = rand_int(MAX_SEXES);
- break;
- }
- k = (islower(c) ? A2I(c) : -1);
- if ((k >= 0) && (k < n)) break;
- if (c == '?') do_cmd_help();
- else if (c == '=')
- {
- screen_save();
- do_cmd_options_aux(6, "Startup Options", FALSE);
- screen_load();
- }
- else bell();
- }
- }
-
- /* Set sex */
- p_ptr->psex = k;
- sp_ptr = &sex_info[p_ptr->psex];
-
- /* Display */
- c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9);
-
/* Clean up */
clear_from(15);
/*** Player race ***/
-
if (do_quick_start)
{
- k = previous_char.race;
+ k = game->previous_char.race;
}
else
{
/* Only one choice = instant choice */
- if (max_rp_idx == 1)
+ if (race_info.size() == 1)
+ {
k = 0;
+ }
else
{
/* Extra info */
@@ -1736,7 +1402,7 @@ static bool_ player_birth_aux_ask()
while (1)
{
strnfmt(buf, 200, "Choose a race (%c-%c), * for a random choice, = for options, 8/2/4/6 for movement: ",
- I2A(0), I2A(max_rp_idx - 1));
+ I2A(0), I2A(race_info.size() - 1));
put_str(buf, 17, 2);
c = inkey();
@@ -1744,7 +1410,7 @@ static bool_ player_birth_aux_ask()
if (c == 'S') return (FALSE);
if (c == '*')
{
- k = rand_int(max_rp_idx);
+ k = rand_int(race_info.size());
break;
}
k = (islower(c) ? A2I(c) : -1);
@@ -1799,13 +1465,16 @@ static bool_ player_birth_aux_ask()
rp_ptr = &race_info[p_ptr->prace];
/* Display */
- c_put_str(TERM_L_BLUE, rp_ptr->title, 4, 9);
+ c_put_str(TERM_L_BLUE, rp_ptr->title.c_str(), RACE_ROW, 9);
/* Get a random name */
- if (!do_quick_start) create_random_name(p_ptr->prace, player_name);
+ if (!do_quick_start)
+ {
+ game->player_name = create_random_name();
+ }
/* Display */
- c_put_str(TERM_L_BLUE, player_name, 2, 9);
+ c_put_str(TERM_L_BLUE, game->player_name.c_str(), NAME_ROW, 9);
/* Clean up */
clear_from(12);
@@ -1814,21 +1483,23 @@ static bool_ player_birth_aux_ask()
/*** Player race mod ***/
if (do_quick_start)
{
- k = previous_char.rmod;
+ k = game->previous_char.rmod;
p_ptr->pracem = k;
rmp_ptr = &race_mod_info[p_ptr->pracem];
}
else
{
/* Only one choice = instant choice */
- if (max_rmp_idx == 1)
+ if (race_mod_info.size() == 1)
+ {
k = 0;
+ }
else
{
for (n = 0; n < 100; n++) racem[n] = 0;
max_racem = 0;
- for (n = 0; n < max_rmp_idx; n++)
+ for (n = 0; n < static_cast<int>(race_mod_info.size()); n++)
{
/* Analyze */
p_ptr->pracem = n;
@@ -1867,16 +1538,24 @@ static bool_ player_birth_aux_ask()
if (c == 'S') return (FALSE);
if (c == '*')
{
- do
- {
- k = rand_int(max_racem);
+ // Which choices are legal?
+ std::vector<int> valid_choices(max_racem);
+ for (int i = 0; i < max_racem; i++) {
+ if ((BIT(racem[i]) & rmp_ptr->choice[racem[i] / 32]))
+ {
+ valid_choices.push_back(i);
+ }
}
- while (!(BIT(racem[k]) & rmp_ptr->choice[racem[k] / 32]));
+
+ // Choose
+ assert(!valid_choices.empty());
+ k = *uniform_element(valid_choices);
+
break;
}
else if (c == '?')
{
- help_subrace(race_mod_info[racem[sel]].title);
+ help_subrace(race_mod_info[racem[sel]].title.c_str());
}
k = (islower(c) ? A2I(c) : -1);
@@ -1927,7 +1606,8 @@ static bool_ player_birth_aux_ask()
rmp_ptr = &race_mod_info[p_ptr->pracem];
/* Display */
- c_put_str(TERM_L_BLUE, get_player_race_name(p_ptr->prace, p_ptr->pracem), 4, 9);
+ auto const race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem);
+ c_put_str(TERM_L_BLUE, race_name.c_str(), RACE_ROW, 9);
}
}
@@ -1938,72 +1618,49 @@ static bool_ player_birth_aux_ask()
/*** Player class ***/
if (do_quick_start)
{
- k = previous_char.pclass;
+ k = game->previous_char.pclass;
p_ptr->pclass = k;
cp_ptr = &class_info[p_ptr->pclass];
- k = previous_char.spec;
+ k = game->previous_char.spec;
p_ptr->pspec = k;
spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec];
}
else
{
- int z;
-
- for (z = 0; z < 2; z++)
+ for (int z = 0; z < 2; z++)
+ {
restrictions[z] = (rp_ptr->choice[z] | rmp_ptr->pclass[z]) & (~rmp_ptr->mclass[z]);
+ }
- if (max_mc_idx > 1)
+ // Get list of all the classes.
+ std::vector<u16b> class_types;
+ for (std::size_t i = 0; i < class_info.size(); i++)
{
- /* Extra info */
- Term_putstr(5, 13, -1, TERM_WHITE,
- "Your 'class' determines various intrinsic abilities and bonuses.");
+ class_types.push_back(i);
+ }
- /* Get a class type */
- for (i = 0; i < max_mc_idx; i++)
- c_put_str(meta_class_info[i].color, format("%c) %s", I2A(i), meta_class_info[i].name), 16 + i, 2);
- while (1)
- {
- strnfmt(buf, 200, "Choose a class type (a-%c), * for random, = for options: ", I2A(max_mc_idx - 1));
- put_str(buf, 15, 2);
- c = inkey();
- if (c == 'Q') quit(NULL);
- if (c == 'S') return (FALSE);
- if (c == '*')
- {
- k = rand_int(max_mc_idx);
- break;
- }
- k = (islower(c) ? A2I(c) : (D2I(c) + 26));
- if ((k >= 0) && (k < max_mc_idx)) break;
- if (c == '?') do_cmd_help();
- else if (c == '=')
- {
- screen_save();
- do_cmd_options_aux(6, "Startup Options", FALSE);
- screen_load();
- }
- else bell();
+ // Sort into display order
+ std::stable_sort(
+ class_types.begin(),
+ class_types.end(),
+ [&class_info](auto i, auto j) {
+ return class_info[i].display_order_idx < class_info[j].display_order_idx;
}
- }
- else
- {
- k = 0;
- }
- class_types = meta_class_info[k].classes;
- clear_from(15);
+ );
/* Count classes */
- n = 0;
- while (class_types[n] != -1) n++;
+ n = class_types.size();
/* Only one choice = instant choice */
if (n == 1)
+ {
k = 0;
+ }
else
{
/* Dump classes */
sel = 0;
- n = dump_classes(class_types, sel, restrictions);
+ dump_classes(class_types, sel, restrictions);
/* Get a class */
while (1)
@@ -2072,11 +1729,7 @@ static bool_ player_birth_aux_ask()
clear_from(15);
/* Count choices */
- for (n = 0; n < MAX_SPEC; n++)
- {
- /* Found the last one ? */
- if (!class_info[p_ptr->pclass].spec[n].title) break;
- }
+ n = class_info[p_ptr->pclass].spec.size();
/* Only one choice = auto choice */
if (n == 1)
@@ -2085,7 +1738,7 @@ static bool_ player_birth_aux_ask()
{
/* Dump classes spec */
sel = 0;
- n = dump_specs(sel);
+ dump_specs(sel);
/* Get a class */
while (1)
@@ -2152,7 +1805,7 @@ static bool_ player_birth_aux_ask()
spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec];
/* Display */
- c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9);
+ c_put_str(TERM_L_BLUE, spp_ptr->title, CLASS_ROW, 9);
/* Clean up */
clear_from(15);
@@ -2160,11 +1813,11 @@ static bool_ player_birth_aux_ask()
/*** Player god ***/
if (do_quick_start)
{
- k = previous_char.god;
+ k = game->previous_char.god;
p_ptr->pgod = k;
- set_grace(previous_char.grace);
+ set_grace(game->previous_char.grace);
}
- else if (race_flags1_p(PR1_NO_GOD))
+ else if (race_flags_p(PR_NO_GOD))
{
p_ptr->pgod = GOD_NONE;
}
@@ -2271,7 +1924,7 @@ static bool_ player_birth_aux_ask()
}
/* A god that like us ? more grace ! */
- if (race_flags1_p(PR1_GOD_FRIEND))
+ if (race_flags_p(PR_GOD_FRIEND))
{
set_grace(200);
}
@@ -2298,10 +1951,8 @@ static bool_ player_birth_aux_ask()
}
}
- /* Set birth options: maximize, preserve, sepcial levels and astral */
- p_ptr->preserve = preserve;
- p_ptr->special = special_lvls;
- p_ptr->astral = (race_flags2_p(PR2_ASTRAL)) ? TRUE : FALSE;
+ /* Is the player an "astral" being? */
+ p_ptr->astral = (race_flags_p(PR_ASTRAL)) ? TRUE : FALSE;
/*
* A note by pelpel. (remove this please)
@@ -2335,11 +1986,11 @@ static bool_ player_birth_aux_ask()
/*** User enters number of quests ***/
/* Heino Vander Sanden and Jimmy De Laet */
- if (!ironman_rooms)
+ if (!options->ironman_rooms)
{
if (do_quick_start)
{
- v = previous_char.quests;
+ v = game->previous_char.quests;
}
else
{
@@ -2421,7 +2072,7 @@ static bool_ player_birth_aux_ask()
plots[PLOT_OTHER] = QUEST_NULL;
}
- quest_random_init_hook(QUEST_RANDOM);
+ quest_random_init_hook();
/* Ok */
return (TRUE);
@@ -2453,7 +2104,7 @@ static const int birth_stat_costs[(18-10) + 1] =
*
* Taken from V 2.9.0
*/
-static bool_ player_birth_aux_point(void)
+static bool_ player_birth_aux_point()
{
int i;
@@ -2471,8 +2122,6 @@ static bool_ player_birth_aux_point(void)
char buf[80];
- int mode = 0;
-
/* Initialize stats */
for (i = 0; i < 6; i++)
@@ -2485,12 +2134,6 @@ static bool_ player_birth_aux_point(void)
/* Roll for base hitpoints */
get_extra();
- /* Roll for age/height/weight */
- get_ahw();
-
- /* Roll for social class */
- get_history();
-
/* Get luck */
p_ptr->luck_base = rp_ptr->luck + rmp_ptr->luck + rand_range( -5, 5);
p_ptr->luck_max = p_ptr->luck_base;
@@ -2543,7 +2186,7 @@ static bool_ player_birth_aux_point(void)
p_ptr->csp = p_ptr->msp;
/* Display the player */
- display_player(mode);
+ display_player(0);
/* Display the costs header */
put_str("Cost", row - 2, col + 32);
@@ -2613,8 +2256,6 @@ static bool_ player_birth_aux_auto()
{
int i, j, m, v;
- int mode = 0;
-
bool_ flag = FALSE;
bool_ prev = FALSE;
@@ -2631,7 +2272,7 @@ static bool_ player_birth_aux_auto()
/* Initialize */
- if (autoroll)
+ if (options->autoroll)
{
int mval[6];
@@ -2655,7 +2296,7 @@ static bool_ player_birth_aux_auto()
stat_match[i] = 0;
/* Race/Class bonus */
- j = rp_ptr->r_adj[i] + rmp_ptr->r_adj[i] + cp_ptr->c_adj[i];
+ j = rp_ptr->ps.adj[i] + rmp_ptr->ps.adj[i] + cp_ptr->ps.adj[i];
/* Obtain the "maximal" stat */
m = adjust_stat(17, j, TRUE);
@@ -2694,7 +2335,7 @@ static bool_ player_birth_aux_auto()
if (!askfor_aux(inp, 8)) inp[0] = '\0';
/* Weirdos stat display .. erm .. I mean, original stat display */
- if (!linear_stats)
+ if (!options->linear_stats)
{
/* Hack -- add a fake slash */
strcat(inp, "/");
@@ -2734,20 +2375,19 @@ static bool_ player_birth_aux_auto()
while (TRUE)
{
/* Feedback */
- if (autoroll)
+ if (options->autoroll)
{
Term_clear();
put_str("Name :", 2, 1);
- put_str("Sex :", 3, 1);
- put_str("Race :", 4, 1);
- put_str("Class:", 5, 1);
+ c_put_str(TERM_L_BLUE, game->player_name.c_str(), 2, 9);
+
+ put_str("Race :", 3, 1);
+ auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem);
+ c_put_str(TERM_L_BLUE, player_race_name.c_str(), 3, 9);
- c_put_str(TERM_L_BLUE, player_name, 2, 9);
- c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9);
- strnfmt(buf, 80, "%s", get_player_race_name(p_ptr->prace, p_ptr->pracem));
- c_put_str(TERM_L_BLUE, buf, 4, 9);
- c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9);
+ put_str("Class:", 4, 1);
+ c_put_str(TERM_L_BLUE, spp_ptr->title, 4, 9);
/* Label stats */
put_str("STR:", 2 + A_STR, 61);
@@ -2775,7 +2415,7 @@ static bool_ player_birth_aux_auto()
}
/* Auto-roll */
- while (autoroll)
+ while (options->autoroll)
{
bool_ accept = TRUE;
@@ -2833,18 +2473,9 @@ static bool_ player_birth_aux_auto()
/*** Display ***/
- /* Mode */
- mode = 0;
-
/* Roll for base hitpoints */
get_extra();
- /* Roll for age/height/weight */
- get_ahw();
-
- /* Roll for social class */
- get_history();
-
/* Roll for gold */
get_money();
@@ -2864,15 +2495,13 @@ static bool_ player_birth_aux_auto()
p_ptr->csp = p_ptr->msp;
/* Display the player */
- display_player(mode);
+ display_player(0);
/* Prepare a prompt (must squeeze everything in) */
Term_gotoxy(2, 23);
Term_addch(TERM_WHITE, b1);
Term_addstr( -1, TERM_WHITE, "'r' to reroll");
if (prev) Term_addstr( -1, TERM_WHITE, ", 'p' for prev");
- if (mode) Term_addstr( -1, TERM_WHITE, ", 'h' for Misc.");
- else Term_addstr( -1, TERM_WHITE, ", 'h' for History");
Term_addstr( -1, TERM_WHITE, ", or ESC to accept");
Term_addch(TERM_WHITE, b2);
@@ -2898,13 +2527,6 @@ static bool_ player_birth_aux_auto()
continue;
}
- /* Toggle the display */
- if ((c == 'H') || (c == 'h'))
- {
- mode = ((mode != 0) ? 0 : 1);
- continue;
- }
-
/* Help */
if (c == '?')
{
@@ -2942,20 +2564,20 @@ static bool_ player_birth_aux_auto()
*/
static bool_ player_birth_aux()
{
- char c;
-
- int i, j;
-
- int y = 0, x = 0;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto &s_info = game->s_info;
- char old_history[4][60];
+ char c;
/* Ask */
if (!player_birth_aux_ask()) return (FALSE);
- for (i = 1; i < max_s_idx; i++)
- s_info[i].dev = FALSE;
- for (i = 1; i < max_s_idx; i++)
+ for (std::size_t i = 1; i < s_descriptors.size(); i++)
+ {
+ s_info[i].dev = false;
+ }
+
+ for (std::size_t i = 1; i < s_descriptors.size(); i++)
{
s32b value = 0, mod = 0;
@@ -2966,14 +2588,18 @@ static bool_ player_birth_aux()
/* Develop only revelant branches */
if (s_info[i].value || s_info[i].mod)
{
- int z = s_info[i].father;
+ int z = s_descriptors[i].father;
while (z != -1)
{
- s_info[z].dev = TRUE;
- z = s_info[z].father;
+ // Mark as developed
+ s_info[z].dev = true;
+ // Next node up the tree
+ z = s_descriptors[z].father;
if (z == 0)
+ {
break;
+ }
}
}
}
@@ -3000,7 +2626,7 @@ static bool_ player_birth_aux()
else
{
/* Point based */
- if (point_based)
+ if (options->point_based)
{
if (!player_birth_aux_point()) return FALSE;
}
@@ -3010,83 +2636,9 @@ static bool_ player_birth_aux()
if (!player_birth_aux_auto()) return FALSE;
}
- /* Edit character background */
- for (i = 0; i < 4; i++)
- {
- strnfmt(old_history[i], 60, "%s", history[i]);
- }
- /* Turn 0 to space */
- for (i = 0; i < 4; i++)
- {
- for (j = 0; history[i][j]; j++) /* loop */;
-
- for (; j < 59; j++) history[i][j] = ' ';
- }
- display_player(1);
- c_put_str(TERM_L_GREEN, "(Character Background - Edit Mode)", 15, 20);
- while (TRUE)
- {
- for (i = 0; i < 4; i++)
- {
- put_str(history[i], i + 16, 10);
- }
- c_put_str(TERM_L_BLUE, format("%c", history[y][x]), y + 16, x + 10);
-
- /* Place cursor just after cost of current stat */
- Term_gotoxy(x + 10, y + 16);
-
- c = inkey();
-
- if (c == '8')
- {
- y--;
- if (y < 0) y = 3;
- }
- else if (c == '2')
- {
- y++;
- if (y > 3) y = 0;
- }
- else if (c == '6')
- {
- x++;
- if (x > 59) x = 0;
- }
- else if (c == '4')
- {
- x--;
- if (x < 0) x = 59;
- }
- else if (c == '\r')
- {
- break;
- }
- else if (c == ESCAPE)
- {
- for (i = 0; i < 4; i++)
- {
- strnfmt(history[i], 60, "%s", old_history[i]);
- put_str(history[i], i + 16, 10);
- }
- break;
- }
- else
- {
- history[y][x++] = c;
- if (x > 58)
- {
- x = 0;
- y++;
- if (y > 3) y = 0;
- }
- }
- }
-
-
/*** Finish up ***/
/* Get a name, recolor it, prepare savefile */
-
get_name();
@@ -3104,7 +2656,7 @@ static bool_ player_birth_aux()
}
/* Save this for the next character */
- previous_char.quick_ok = TRUE;
+ game->previous_char.quick_ok = TRUE;
save_prev_data();
/* Accept */
@@ -3113,105 +2665,9 @@ static bool_ player_birth_aux()
/*
- * Helper function for validate_bg().
- */
-static void validate_bg_aux(int chart, bool_ chart_checked[], char *buf)
-{
- char *s;
-
- int i;
-
-
- /* Assume the chart does not exist */
- bool_ chart_exists = FALSE;
-
- /* Assume the chart is not complete */
- bool_ chart_complete = FALSE;
-
- int bg_max = max_bg_idx;
-
- /* No chart */
- if (!chart) return;
-
- /* Already saw this chart */
- if (chart_checked[chart]) return;
-
- /* Build a debug message */
- s = buf + strlen(buf);
-
- /* XXX XXX XXX */
- (void) strnfmt(s, -1, "%d --> ", chart);
-
- /* Check each chart */
- for (i = 0; i < bg_max; i++)
- {
- /* Require same chart */
- if (bg[i].chart != chart) continue;
-
- /* The chart exists */
- chart_exists = TRUE;
-
- /* Validate the "next" chart recursively */
- validate_bg_aux(bg[i].next, chart_checked, buf);
-
- /* Require a terminator */
- if (bg[i].roll != 100) continue;
-
- /* The chart is complete */
- chart_complete = TRUE;
- }
-
- /* Failed: The chart does not exist */
- if (!chart_exists)
- {
- quit_fmt("birth.c: bg[] chart %d does not exist\n%s", chart, buf);
- }
-
- /* Failed: The chart is not complete */
- if (!chart_complete)
- {
- quit_fmt("birth.c: bg[] chart %d is not complete", chart);
- }
-
- /* Remember we saw this chart */
- chart_checked[chart] = TRUE;
-
- /* Build a debug message */
- *s = 0;
-}
-
-
-/*
- * Verify that the bg[] table is valid.
- */
-static void validate_bg(void)
-{
- int i, race;
-
- bool_ chart_checked[512];
-
- char buf[1024];
-
-
- for (i = 0; i < 512; i++) chart_checked[i] = FALSE;
-
- /* Check each race */
- for (race = 0; race < max_rp_idx; race++)
- {
- /* Get the first chart for this race */
- int chart = race_info[race].chart;
-
- (void) strcpy(buf, "");
-
- /* Validate the chart recursively */
- validate_bg_aux(chart, chart_checked, buf);
- }
-}
-
-/*
* Initialize a random town
*/
-void init_town(int t_idx, int level)
+static void init_town(int t_idx)
{
town_type *t_ptr = &town_info[t_idx];
@@ -3222,10 +2678,7 @@ void init_town(int t_idx, int level)
t_ptr->flags &= ~(TOWN_KNOWN);
/* Generation seed for the town */
- t_ptr->seed = randint(0x10000000);
-
- /* Total hack and not even used */
- t_ptr->numstores = 8;
+ t_ptr->seed = seed_t::system();
}
/*
@@ -3234,12 +2687,14 @@ void init_town(int t_idx, int level)
* Note that we may be called with "junk" leftover in the various
* fields, so we must be sure to clear them first.
*/
-void player_birth(void)
+void player_birth()
{
- int i, j, rtown = TOWN_RANDOM;
+ auto const &st_info = game->edit_data.st_info;
+ auto &d_info = game->edit_data.d_info;
+ auto &messages = game->messages;
- /* Validate the bg[] table */
- validate_bg();
+ /* Starting index for generated towns */
+ std::size_t rtown = TOWN_RANDOM;
/* Create a new character */
while (1)
@@ -3258,14 +2713,15 @@ void player_birth(void)
recalc_skills(FALSE);
/* grab level 1 abilities */
- for (i = 0; i < max_ab_idx; i++)
- ab_info[i].acquired = FALSE;
+ p_ptr->abilities.clear();
apply_level_abilities(1);
/* Complete the god */
- i = p_ptr->pgod;
- p_ptr->pgod = 0;
- follow_god(i, TRUE);
+ {
+ byte i = p_ptr->pgod;
+ p_ptr->pgod = 0;
+ follow_god(i, TRUE);
+ }
/* Select the default melee type */
select_default_melee();
@@ -3274,19 +2730,19 @@ void player_birth(void)
add_note_type(NOTE_BIRTH);
/* Note player birth in the message recall */
- message_add(" ", TERM_L_BLUE);
- message_add(" ", TERM_L_BLUE);
- message_add("====================", TERM_L_BLUE);
- message_add(" ", TERM_L_BLUE);
- message_add(" ", TERM_L_BLUE);
+ messages.add(" ", TERM_L_BLUE);
+ messages.add(" ", TERM_L_BLUE);
+ messages.add("====================", TERM_L_BLUE);
+ messages.add(" ", TERM_L_BLUE);
+ messages.add(" ", TERM_L_BLUE);
/* Hack -- outfit the player */
player_outfit();
/* Initialize random towns in the dungeons */
- for (i = 0; i < max_d_idx; i++)
+ for (std::size_t i = 0; i < d_info.size(); i++)
{
- dungeon_info_type *d_ptr = &d_info[i];
+ auto d_ptr = &d_info[i];
int num = 0, z;
d_ptr->t_num = 0;
@@ -3295,7 +2751,7 @@ void player_birth(void)
d_ptr->t_idx[z] = 0;
d_ptr->t_level[z] = 0;
}
- if (!(d_ptr->flags1 & DF1_RANDOM_TOWNS)) continue;
+ if (!(d_ptr->flags & DF_RANDOM_TOWNS)) continue;
/* Can we add a town ? */
while (magik(TOWN_CHANCE - (num * 10)))
@@ -3307,15 +2763,17 @@ void player_birth(void)
while (TRUE)
{
- int j;
bool_ ok = TRUE;
lev = rand_range(d_ptr->mindepth, d_ptr->maxdepth - 1);
/* Be sure it wasnt already used */
- for (j = 0; j < num; j++)
+ for (int j = 0; j < num; j++)
{
- if (d_ptr->t_level[j] == lev) ok = FALSE;
+ if (d_ptr->t_level[j] == lev)
+ {
+ ok = FALSE;
+ }
}
/* Ok found one */
@@ -3325,11 +2783,11 @@ void player_birth(void)
if (wizard)
{
- message_add(format("Random dungeon town: d_idx:%d, lev:%d", i, lev), TERM_WHITE);
+ messages.add(format("Random dungeon town: d_idx:%d, lev:%d", i, lev), TERM_WHITE);
}
/* Create the town */
- init_town(d_ptr->t_idx[num], d_ptr->t_level[num]);
+ init_town(d_ptr->t_idx[num]);
num++;
@@ -3341,7 +2799,7 @@ void player_birth(void)
}
/* Init the towns */
- for (i = 1; i < max_towns; i++)
+ for (std::size_t i = 1; i < max_towns; i++)
{
/* Not destroyed ! yet .. ;) */
town_info[i].destroyed = FALSE;
@@ -3352,7 +2810,7 @@ void player_birth(void)
create_stores_stock(i);
/* Init the stores */
- for (j = 0; j < max_st_idx; j++)
+ for (std::size_t j = 0; j < st_info.size(); j++)
{
/* Initialize */
store_init(i, j);
@@ -3360,13 +2818,15 @@ void player_birth(void)
}
/* Init wilderness seeds */
- for (i = 0; i < max_wild_x; i++)
+ auto &wilderness = game->wilderness;
+ for (std::size_t y = 0; y < wilderness.height(); y++)
{
- for (j = 0; j < max_wild_y; j++)
+ for (std::size_t x = 0; x < wilderness.width(); x++)
{
- wild_map[j][i].seed = rand_int(0x10000000);
- wild_map[j][i].entrance = 0;
- wild_map[j][i].known = FALSE;
+ auto &w = wilderness(x, y);
+ w.seed = seed_t::system();
+ w.entrance = 0;
+ w.known = FALSE;
}
}
}
@@ -3374,11 +2834,11 @@ void player_birth(void)
-char savefile_module[46][80];
-char savefile_names[46][30];
-char savefile_desc[46][80];
-bool_ savefile_alive[46];
-int savefile_idx[46];
+static char savefile_module[46][80];
+static char savefile_names[46][30];
+static char savefile_desc[46][80];
+static bool_ savefile_alive[46];
+static int savefile_idx[46];
/*
* Grab all the names from an index
@@ -3388,7 +2848,7 @@ int load_savefile_names()
FILE *fff;
char buf[1024];
char tmp[50];
- char player_base_save[32];
+ std::string player_base_save;
int max = 0, fd;
@@ -3404,7 +2864,7 @@ int load_savefile_names()
/* Save the current 'player_base' */
- strncpy(player_base_save, player_base, 32);
+ player_base_save = game->player_base;
/*
@@ -3463,7 +2923,7 @@ int load_savefile_names()
strcpy(savefile_desc[max], buf + i);
/* Build platform-dependent savefile name */
- strncpy(player_base, savefile_names[max], 32);
+ game->player_base = savefile_names[max];
process_player_name(TRUE);
/* Try to open the savefile */
@@ -3480,7 +2940,7 @@ int load_savefile_names()
my_fclose(fff);
/* Restore the values of 'player_base' and 'savefile' */
- strncpy(player_base, player_base_save, 32);
+ game->player_base = player_base_save;
process_player_name(TRUE);
return (max);
@@ -3512,15 +2972,16 @@ void save_savefile_names()
* Save, use '@' intead of ':' as a separator because it cannot exists
* in savefiles
*/
+ auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem);
fprintf(fff, "%s@%c%s@%s, the %s %s is %s\n", game_module,
- (death) ? '0' : '1', player_base, player_name,
- get_player_race_name(p_ptr->prace, p_ptr->pracem),
+ (death) ? '0' : '1', game->player_base.c_str(), game->player_name.c_str(),
+ player_race_name.c_str(),
spp_ptr->title,
(!death) ? "alive" : "dead");
for (i = 0; i < max; i++)
{
- if (!strcmp(savefile_names[i], player_base)) continue;
+ if (!strcmp(savefile_names[i], game->player_base.c_str())) continue;
fprintf(fff, "%s@%c%s@%s\n", savefile_module[i],
(savefile_alive[i]) ? '1' : '0', savefile_names[i], savefile_desc[i]);
}
@@ -3651,22 +3112,20 @@ savefile_try_again:
}
else if (((k == 0x7F) || (k == '\010')) && (sel >= 2))
{
- char player_base_save[32];
-
if (!get_check(format("Really delete '%s'?", savefile_names[savefile_idx[sel - 2]]))) continue;
/* Save current 'player_base' */
- strncpy(player_base_save, player_base, 32);
+ std::string player_base_save = game->player_base;
/* Build platform-dependent save file name */
- strncpy(player_base, savefile_names[savefile_idx[sel - 2]], 32);
+ game->player_base = savefile_names[savefile_idx[sel - 2]];
process_player_name(TRUE);
/* Remove the savefile */
fd_kill(savefile);
/* Restore 'player_base' and 'savefile' */
- strncpy(player_base, player_base_save, 32);
+ game->player_base = player_base_save;
process_player_name(TRUE);
/* Reload, gods I hate using goto .. */
@@ -3675,18 +3134,49 @@ savefile_try_again:
continue;
}
+ //
+ // React
+ //
+
if (k == 'a')
{
/* Display prompt */
prt("Enter the name of the savefile that will hold this character: ", 23, 0);
/* Ask the user for a string */
- if (!askfor_aux(player_base, 15)) continue;
+ if (!askfor_aux(&game->player_base, 15)) continue;
/* Process the player name */
process_player_name(TRUE);
- return (TRUE);
+ // If the savefile already exists, we do *NOT* want to
+ // create a new game, so we'll need to return FALSE for
+ // that.
+ if (boost::filesystem::exists(savefile))
+ {
+ // Show a message so user doesn't get confused.
+ msg_print(NULL);
+
+ // Prompt for it
+ prt(fmt::format(
+ "Character '{}' already exists! Press any key to load.",
+ game->player_base),
+ 0, 0);
+
+ // Wait
+ inkey();
+
+ // Erase the prompt
+ prt("", 0, 0);
+
+ // Load character
+ return FALSE;
+ }
+ else
+ {
+ // Start new game
+ return TRUE;
+ }
}
if (k == 'b')
{
@@ -3694,7 +3184,7 @@ savefile_try_again:
prt("Enter the name of a savefile: ", 23, 0);
/* Ask the user for a string */
- if (!askfor_aux(player_base, 15)) continue;
+ if (!askfor_aux(&game->player_base, 15)) continue;
/* Process the player name */
process_player_name(TRUE);
@@ -3710,7 +3200,7 @@ savefile_try_again:
if ((x < 2) || (x >= max)) continue;
- strnfmt(player_base, 32, "%s", savefile_names[savefile_idx[x - 2]]);
+ game->player_base = savefile_names[savefile_idx[x - 2]];
/* Process the player name */
process_player_name(TRUE);
diff --git a/src/birth.h b/src/birth.h
deleted file mode 100644
index 41620bfa..00000000
--- a/src/birth.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-
-// C linkage required for these functions since main-* code uses them.
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern bool_ no_begin_screen;
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
diff --git a/src/birth.hpp b/src/birth.hpp
index fb036ecc..82bdfcf6 100644
--- a/src/birth.hpp
+++ b/src/birth.hpp
@@ -2,8 +2,10 @@
#include "h-basic.h"
-extern void print_desc_aux(cptr txt, int y, int x);
-extern void save_savefile_names(void);
-extern bool_ begin_screen(void);
-extern void get_height_weight(void);
-extern void player_birth(void);
+void print_desc_aux(cptr txt, int y, int x);
+void save_savefile_names();
+bool_ begin_screen();
+void player_birth();
+void roll_player_hp();
+
+extern bool_ no_begin_screen;
diff --git a/src/birther.hpp b/src/birther.hpp
index f517fb9d..0c28b513 100644
--- a/src/birther.hpp
+++ b/src/birther.hpp
@@ -2,12 +2,14 @@
#include "h-basic.h"
+#include <string>
+#include <vector>
+
/**
* Player information during the birth process.
*/
struct birther
{
- s16b sex;
s16b race;
s16b rmod;
s16b pclass;
@@ -17,19 +19,11 @@ struct birther
byte god;
s32b grace;
- s32b god_favor;
-
- s16b age;
- s16b wt;
- s16b ht;
- s16b sc;
s32b au;
s16b stat[6];
s16b luck;
- char history[4][60];
-
bool_ quick_ok;
};
diff --git a/src/bldg.cc b/src/bldg.cc
index 7095e8c3..9b3750a6 100644
--- a/src/bldg.cc
+++ b/src/bldg.cc
@@ -16,6 +16,7 @@
#include "cave_type.hpp"
#include "cmd3.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "hook_quest_finish_in.hpp"
#include "hook_quest_fail_in.hpp"
@@ -23,7 +24,9 @@
#include "mimic.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "owner_type.hpp"
+#include "player_race_flag.hpp"
#include "player_type.hpp"
#include "q_library.hpp"
#include "q_fireprof.hpp"
@@ -49,10 +52,11 @@ static int building_loc = 0;
/*
* A helper function for is_state
*/
-static bool_ is_state_aux(store_type *s_ptr, int state)
+static bool_ is_state_aux(store_type const *s_ptr, int state)
{
- owner_type *ow_ptr = &ow_info[s_ptr->owner];
+ auto const &ow_info = game->edit_data.ow_info;
+ auto ow_ptr = &ow_info[s_ptr->owner];
/* Check race */
if (ow_ptr->races[state][p_ptr->prace / 32] & (1 << p_ptr->prace))
@@ -74,7 +78,7 @@ static bool_ is_state_aux(store_type *s_ptr, int state)
/*
* Test if the state accords with the player
*/
-bool_ is_state(store_type *s_ptr, int state)
+bool_ is_state(store_type const *s_ptr, int state)
{
if (state == STORE_NORMAL)
{
@@ -108,99 +112,95 @@ static void clear_bldg(int min_row, int max_row)
/*
* Display a building.
*/
-void show_building(store_type *s_ptr)
+void show_building(store_type const *s_ptr)
{
- char buff[20];
+ auto const &ba_info = game->edit_data.ba_info;
+ auto const &st_info = game->edit_data.st_info;
- int i;
-
- byte action_color;
-
- char tmp_str[80];
-
- store_info_type *st_ptr = &st_info[s_ptr->st_idx];
+ auto st_ptr = &st_info[s_ptr->st_idx];
-
- for (i = 0; i < 6; i++)
+ for (std::size_t i = 0; i < st_ptr->actions.size(); i++)
{
- store_action_type *ba_ptr = &ba_info[st_ptr->actions[i]];
+ auto ba_ptr = &ba_info[st_ptr->actions[i]];
+
+ byte action_color;
+ char buff[20];
- if (ba_ptr->letter != '.')
+ if (ba_ptr->action_restr == 0)
{
- if (ba_ptr->action_restr == 0)
+ if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) ||
+ (is_state(s_ptr, STORE_HATED) && (ba_ptr->costs[STORE_HATED] == 0)) ||
+ (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0)))
{
- if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) ||
- (is_state(s_ptr, STORE_HATED) && (ba_ptr->costs[STORE_HATED] == 0)) ||
- (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0)))
- {
- action_color = TERM_WHITE;
- buff[0] = '\0';
- }
- else if (is_state(s_ptr, STORE_LIKED))
- {
- action_color = TERM_L_GREEN;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
- }
- else if (is_state(s_ptr, STORE_HATED))
- {
- action_color = TERM_RED;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_HATED]);
- }
- else
- {
- action_color = TERM_YELLOW;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]);
- }
+ action_color = TERM_WHITE;
+ buff[0] = '\0';
}
- else if (ba_ptr->action_restr == 1)
+ else if (is_state(s_ptr, STORE_LIKED))
{
- if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) ||
- (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0)))
- {
- action_color = TERM_WHITE;
- buff[0] = '\0';
- }
- else if (is_state(s_ptr, STORE_LIKED))
- {
- action_color = TERM_L_GREEN;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
- }
- else if (is_state(s_ptr, STORE_HATED))
- {
- action_color = TERM_L_DARK;
- strnfmt(buff, 20, "(closed)");
- }
- else
- {
- action_color = TERM_YELLOW;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]);
- }
+ action_color = TERM_L_GREEN;
+ strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
+ }
+ else if (is_state(s_ptr, STORE_HATED))
+ {
+ action_color = TERM_RED;
+ strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_HATED]);
}
else
{
- if (is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0))
- {
- action_color = TERM_WHITE;
- buff[0] = '\0';
- }
- else if (is_state(s_ptr, STORE_LIKED))
- {
- action_color = TERM_L_GREEN;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
- }
- else
- {
- action_color = TERM_L_DARK;
- strnfmt(buff, 20, "(closed)");
- }
+ action_color = TERM_YELLOW;
+ strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]);
}
+ }
+ else if (ba_ptr->action_restr == 1)
+ {
+ if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) ||
+ (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0)))
+ {
+ action_color = TERM_WHITE;
+ buff[0] = '\0';
+ }
+ else if (is_state(s_ptr, STORE_LIKED))
+ {
+ action_color = TERM_L_GREEN;
+ strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
+ }
+ else if (is_state(s_ptr, STORE_HATED))
+ {
+ action_color = TERM_L_DARK;
+ strnfmt(buff, 20, "(closed)");
+ }
+ else
+ {
+ action_color = TERM_YELLOW;
+ strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]);
+ }
+ }
+ else
+ {
+ if (is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0))
+ {
+ action_color = TERM_WHITE;
+ buff[0] = '\0';
+ }
+ else if (is_state(s_ptr, STORE_LIKED))
+ {
+ action_color = TERM_L_GREEN;
+ strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
+ }
+ else
+ {
+ action_color = TERM_L_DARK;
+ strnfmt(buff, 20, "(closed)");
+ }
+ }
- strnfmt(tmp_str, 80, " %c", ba_ptr->letter);
- c_put_str(TERM_YELLOW, tmp_str, 21 + (i / 2), 17 + (30 * (i % 2)));
+ char tmp_str[80];
- strnfmt(tmp_str, 80, ") %s %s", ba_ptr->name, buff);
- c_put_str(action_color, tmp_str, 21 + (i / 2), 2 + 17 + (30 * (i % 2)));
- }
+ strnfmt(tmp_str, 80, " %c", ba_ptr->letter);
+ c_put_str(TERM_YELLOW, tmp_str, 21 + (i / 2), 17 + (30 * (i % 2)));
+
+ strnfmt(tmp_str, 80, ") %s %s", ba_ptr->name.c_str(), buff);
+ c_put_str(action_color, tmp_str, 21 + (i / 2), 2 + 17 + (30 * (i % 2)));
}
}
@@ -332,7 +332,7 @@ static bool_ gamble_comm(int cmd)
if (cmd == BACT_GAMBLE_RULES)
{
/* Peruse the gambling help file */
- (void)show_file("gambling.txt", NULL, 0, 0);
+ show_file("gambling.txt", NULL);
}
else
{
@@ -541,7 +541,7 @@ static bool_ inn_comm(int cmd)
/* Extract race info */
- vampire = ((race_flags1_p(PR1_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire")));
+ vampire = ((race_flags_p(PR_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire")));
switch (cmd)
{
@@ -551,7 +551,7 @@ static bool_ inn_comm(int cmd)
{
msg_print("The barkeep gives you some gruel and a beer.");
msg_print(NULL);
- (void) set_food(PY_FOOD_MAX - 1);
+ set_food(PY_FOOD_MAX - 1);
}
else
msg_print("You're a vampire and I don't have any food for you!");
@@ -743,7 +743,7 @@ static bool_ castle_quest(int y, int x)
get_questinfo(plots[plot]);
/* Add the hooks */
- quest[plots[plot]].init(plots[plot]);
+ quest[plots[plot]].init();
return (TRUE);
}
@@ -754,13 +754,13 @@ static bool_ castle_quest(int y, int x)
/*
* Displaying town history -KMW-
*/
-static void town_history(void)
+static void town_history()
{
/* Save screen */
screen_save();
/* Peruse the building help file */
- (void)show_file("bldg.txt", NULL, 0, 0);
+ show_file("bldg.txt", NULL);
/* Load screen */
screen_load();
@@ -770,7 +770,7 @@ static void town_history(void)
/*
* compare_weapon_aux2 -KMW-
*/
-static void compare_weapon_aux2(object_type *o_ptr, int numblows, int r, int c, int mult, const char *attr, u32b f1, u32b f2, u32b f3, byte color)
+static void compare_weapon_aux2(object_type *o_ptr, int numblows, int r, int c, int mult, const char *attr, byte color)
{
char tmp_str[80];
@@ -788,80 +788,77 @@ static void compare_weapon_aux2(object_type *o_ptr, int numblows, int r, int c,
*/
static void compare_weapon_aux1(object_type *o_ptr, int col, int r)
{
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const f = object_flags(o_ptr);
-
- if (f1 & (TR1_SLAY_ANIMAL))
+ if (f & TR_SLAY_ANIMAL)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 2, "Animals:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_SLAY_EVIL))
+ if (f & TR_SLAY_EVIL)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 2, "Evil:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_SLAY_UNDEAD))
+ if (f & TR_SLAY_UNDEAD)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Undead:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_SLAY_DEMON))
+ if (f & TR_SLAY_DEMON)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Demons:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_SLAY_ORC))
+ if (f & TR_SLAY_ORC)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Orcs:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_SLAY_TROLL))
+ if (f & TR_SLAY_TROLL)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Trolls:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_SLAY_GIANT))
+ if (f & TR_SLAY_GIANT)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Giants:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_SLAY_DRAGON))
+ if (f & TR_SLAY_DRAGON)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Dragons:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_KILL_DRAGON))
+ if (f & TR_KILL_DRAGON)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 5, "Dragons:",
- f1, f2, f3, TERM_YELLOW);
+ TERM_YELLOW);
}
- if (f1 & (TR1_BRAND_ACID))
+ if (f & TR_BRAND_ACID)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Acid:",
- f1, f2, f3, TERM_RED);
+ TERM_RED);
}
- if (f1 & (TR1_BRAND_ELEC))
+ if (f & TR_BRAND_ELEC)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Elec:",
- f1, f2, f3, TERM_RED);
+ TERM_RED);
}
- if (f1 & (TR1_BRAND_FIRE))
+ if (f & TR_BRAND_FIRE)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Fire:",
- f1, f2, f3, TERM_RED);
+ TERM_RED);
}
- if (f1 & (TR1_BRAND_COLD))
+ if (f & TR_BRAND_COLD)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Cold:",
- f1, f2, f3, TERM_RED);
+ TERM_RED);
}
- if (f1 & (TR1_BRAND_POIS))
+ if (f & TR_BRAND_POIS)
{
compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Poison:",
- f1, f2, f3, TERM_RED);
+ TERM_RED);
}
}
@@ -905,7 +902,7 @@ static bool item_tester_hook_melee_weapon(object_type const *o_ptr)
/*
* compare_weapons -KMW-
*/
-static bool_ compare_weapons(void)
+static bool_ compare_weapons()
{
int item, i;
@@ -989,8 +986,7 @@ static bool_ compare_weapons(void)
* sharpen arrows, repair armor, repair weapon
* -KMW-
*/
-static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac,
- int ireward, bool_ set_reward)
+static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac)
{
int i;
@@ -1084,7 +1080,7 @@ static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac,
/*
* Research Item
*/
-static bool_ research_item(void)
+static bool_ research_item()
{
clear_bldg(5, 18);
return (identify_fully());
@@ -1095,18 +1091,14 @@ static bool_ research_item(void)
/*
* Execute a building command
*/
-bool_ bldg_process_command(store_type *s_ptr, int i)
+bool_ bldg_process_command(const store_type *s_ptr, store_action_type const *ba_ptr)
{
- store_action_type *ba_ptr = &ba_info[st_info[s_ptr->st_idx].actions[i]];
-
int bact = ba_ptr->action;
int bcost;
bool_ paid = FALSE;
- bool_ set_reward = FALSE;
-
bool_ recreate = FALSE;
@@ -1140,8 +1132,6 @@ bool_ bldg_process_command(store_type *s_ptr, int i)
return FALSE;
}
- if (!bcost) set_reward = TRUE;
-
switch (bact)
{
case BACT_RESEARCH_ITEM:
@@ -1218,12 +1208,6 @@ bool_ bldg_process_command(store_type *s_ptr, int i)
break;
}
- case BACT_RESEARCH_MONSTER:
- {
- paid = !research_mon();
- break;
- }
-
case BACT_COMPARE_WEAPONS:
{
paid = compare_weapons();
@@ -1232,15 +1216,13 @@ bool_ bldg_process_command(store_type *s_ptr, int i)
case BACT_ENCHANT_WEAPON:
{
- paid = fix_item(INVEN_WIELD, INVEN_WIELD, 0, FALSE,
- BACT_ENCHANT_WEAPON, set_reward);
+ paid = fix_item(INVEN_WIELD, INVEN_WIELD, 0, FALSE);
break;
}
case BACT_ENCHANT_ARMOR:
{
- paid = fix_item(INVEN_BODY, INVEN_FEET, 0, TRUE,
- BACT_ENCHANT_ARMOR, set_reward);
+ paid = fix_item(INVEN_BODY, INVEN_FEET, 0, TRUE);
break;
}
@@ -1306,15 +1288,13 @@ bool_ bldg_process_command(store_type *s_ptr, int i)
case BACT_ENCHANT_ARROWS:
{
- paid = fix_item(0, INVEN_WIELD, TV_ARROW, FALSE,
- BACT_ENCHANT_ARROWS, set_reward);
+ paid = fix_item(0, INVEN_WIELD, TV_ARROW, FALSE);
break;
}
case BACT_ENCHANT_BOW:
{
- paid = fix_item(INVEN_BOW, INVEN_BOW, TV_BOW, FALSE,
- BACT_ENCHANT_BOW, set_reward);
+ paid = fix_item(INVEN_BOW, INVEN_BOW, TV_BOW, FALSE);
break;
}
@@ -1445,7 +1425,7 @@ bool_ bldg_process_command(store_type *s_ptr, int i)
/*
* Enter quest level
*/
-void enter_quest(void)
+void enter_quest()
{
if (!(cave[p_ptr->py][p_ptr->px].feat == FEAT_QUEST_ENTER))
{
diff --git a/src/bldg.hpp b/src/bldg.hpp
index 0daebbee..3b3412fa 100644
--- a/src/bldg.hpp
+++ b/src/bldg.hpp
@@ -1,9 +1,10 @@
#pragma once
#include "h-basic.h"
+#include "store_action_type_fwd.hpp"
#include "store_type_fwd.hpp"
-extern bool_ bldg_process_command(store_type *s_ptr, int i);
-extern void show_building(store_type *s_ptr);
-extern bool_ is_state(store_type *s_ptr, int state);
-extern void enter_quest(void);
+bool_ bldg_process_command(store_type const *s_ptr, store_action_type const *action);
+void show_building(store_type const *s_ptr);
+bool_ is_state(store_type const *s_ptr, int state);
+void enter_quest();
diff --git a/src/cave.cc b/src/cave.cc
index 5ff31019..cad1506e 100644
--- a/src/cave.cc
+++ b/src/cave.cc
@@ -1,12 +1,18 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_enter_dungeon_in.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_type.hpp"
@@ -14,7 +20,6 @@
#include "spells1.hpp"
#include "store_info_type.hpp"
#include "tables.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -64,15 +69,15 @@ int distance(int y1, int x1, int y2, int x2)
*/
static bool_ is_wall(cave_type *c_ptr)
{
- byte feat;
-
+ auto const &f_info = game->edit_data.f_info;
/* Handle feature mimics */
- if (c_ptr->mimic) feat = c_ptr->mimic;
- else feat = c_ptr->feat;
+ byte const feat = c_ptr->mimic
+ ? c_ptr->mimic
+ : c_ptr->feat;
/* Paranoia */
- if (feat >= max_f_idx) return FALSE;
+ if (feat >= f_info.size()) return FALSE;
/* Vanilla floors and doors aren't considered to be walls */
if (feat < FEAT_SECRET) return FALSE;
@@ -87,7 +92,7 @@ static bool_ is_wall(cave_type *c_ptr)
if (feat == FEAT_SMALL_TREES) return TRUE;
/* Normal cases: use the WALL flag in f_info.txt */
- return (f_info[feat].flags1 & FF1_WALL) ? TRUE : FALSE;
+ return (f_info[feat].flags & FF_WALL) ? TRUE : FALSE;
}
@@ -353,7 +358,7 @@ bool_ los(int y1, int x1, int y2, int x2)
/*
* Returns true if the player's grid is dark
*/
-bool_ no_lite(void)
+bool_ no_lite()
{
return (!player_can_see_bold(p_ptr->py, p_ptr->px));
}
@@ -379,7 +384,10 @@ bool_ cave_valid_bold(int y, int x)
object_type *o_ptr = &o_list[o_idx];
/* Forbid artifact grids */
- if ((o_ptr->art_name) || artifact_p(o_ptr)) return (FALSE);
+ if (artifact_p(o_ptr))
+ {
+ return (FALSE);
+ }
}
/* Accept */
@@ -393,6 +401,8 @@ bool_ cave_valid_bold(int y, int x)
*/
static void image_monster(byte *ap, char *cp)
{
+ auto const &r_info = game->edit_data.r_info;
+
// Cached state which keeps a list of all the "live" monster race entries.
static std::vector<size_t> *instance = nullptr;
@@ -402,7 +412,7 @@ static void image_monster(byte *ap, char *cp)
// Create the list of "live" indexes
instance = new std::vector<size_t>();
// Start at 1 to avoid 'player'
- for (size_t i = 1; i < max_r_idx; i++)
+ for (size_t i = 1; i < r_info.size(); i++)
{
if (r_info[i].name)
{
@@ -426,6 +436,8 @@ static void image_monster(byte *ap, char *cp)
*/
static void image_object(byte *ap, char *cp)
{
+ auto const &k_info = game->edit_data.k_info;
+
// Cached state which keeps a list of the "live" object_kind entries.
static std::vector<size_t> *instance = nullptr;
@@ -435,7 +447,7 @@ static void image_object(byte *ap, char *cp)
// Create the list of "live" indexes
instance = new std::vector<size_t>();
// Filter all the "live" entries
- for (size_t i = 0; i < max_k_idx; i++)
+ for (size_t i = 0; i < k_info.size(); i++)
{
if (k_info[i].name)
{
@@ -499,50 +511,60 @@ static char get_shimmer_color()
/*
- * Table of breath colors. Must match listings in a single set of
- * monster spell flags.
- *
- * The value "255" is special. Monsters with that kind of breath
- * may be any color.
+ * Breath color
*/
-static byte breath_to_attr[32][2] =
-{
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { TERM_SLATE, TERM_L_DARK }, /* RF4_BRTH_ACID */
- { TERM_BLUE, TERM_L_BLUE }, /* RF4_BRTH_ELEC */
- { TERM_RED, TERM_L_RED }, /* RF4_BRTH_FIRE */
- { TERM_WHITE, TERM_L_WHITE }, /* RF4_BRTH_COLD */
- { TERM_GREEN, TERM_L_GREEN }, /* RF4_BRTH_POIS */
- { TERM_L_GREEN, TERM_GREEN }, /* RF4_BRTH_NETHR */
- { TERM_YELLOW, TERM_ORANGE }, /* RF4_BRTH_LITE */
- { TERM_L_DARK, TERM_SLATE }, /* RF4_BRTH_DARK */
- { TERM_L_UMBER, TERM_UMBER }, /* RF4_BRTH_CONFU */
- { TERM_YELLOW, TERM_L_UMBER }, /* RF4_BRTH_SOUND */
- { 255, 255 }, /* (any color) */ /* RF4_BRTH_CHAOS */
- { TERM_VIOLET, TERM_VIOLET }, /* RF4_BRTH_DISEN */
- { TERM_L_RED, TERM_VIOLET }, /* RF4_BRTH_NEXUS */
- { TERM_L_BLUE, TERM_L_BLUE }, /* RF4_BRTH_TIME */
- { TERM_L_WHITE, TERM_SLATE }, /* RF4_BRTH_INER */
- { TERM_L_WHITE, TERM_SLATE }, /* RF4_BRTH_GRAV */
- { TERM_UMBER, TERM_L_UMBER }, /* RF4_BRTH_SHARD */
- { TERM_ORANGE, TERM_RED }, /* RF4_BRTH_PLAS */
- { TERM_UMBER, TERM_L_UMBER }, /* RF4_BRTH_FORCE */
- { TERM_L_BLUE, TERM_WHITE }, /* RF4_BRTH_MANA */
- { 0, 0 }, /* */
- { TERM_GREEN, TERM_L_GREEN }, /* RF4_BRTH_NUKE */
- { 0, 0 }, /* */
- { TERM_WHITE, TERM_L_RED }, /* RF4_BRTH_DISINT */
+struct breath_color {
+ std::size_t breath_idx;
+ byte first_color;
+ byte second_color;
};
/*
+ * Breath colors. The value "255" is special. Monsters with
+ * that kind of breath may be any color.
+ */
+static breath_color const *lookup_breath_color(std::size_t i)
+{
+ static breath_color breath_to_attr[] =
+ {
+ { SF_BR_ACID_IDX, TERM_SLATE, TERM_L_DARK },
+ { SF_BR_ELEC_IDX, TERM_BLUE, TERM_L_BLUE },
+ { SF_BR_FIRE_IDX, TERM_RED, TERM_L_RED },
+ { SF_BR_COLD_IDX, TERM_WHITE, TERM_L_WHITE },
+ { SF_BR_POIS_IDX, TERM_GREEN, TERM_L_GREEN },
+ { SF_BR_NETH_IDX, TERM_L_GREEN, TERM_GREEN },
+ { SF_BR_LITE_IDX, TERM_YELLOW, TERM_ORANGE },
+ { SF_BR_DARK_IDX, TERM_L_DARK, TERM_SLATE },
+ { SF_BR_CONF_IDX, TERM_L_UMBER, TERM_UMBER },
+ { SF_BR_SOUN_IDX, TERM_YELLOW, TERM_L_UMBER },
+ { SF_BR_CHAO_IDX, 255, 255 },
+ { SF_BR_DISE_IDX, TERM_VIOLET, TERM_VIOLET },
+ { SF_BR_NEXU_IDX, TERM_L_RED, TERM_VIOLET },
+ { SF_BR_TIME_IDX, TERM_L_BLUE, TERM_L_BLUE },
+ { SF_BR_INER_IDX, TERM_L_WHITE, TERM_SLATE },
+ { SF_BR_GRAV_IDX, TERM_L_WHITE, TERM_SLATE },
+ { SF_BR_SHAR_IDX, TERM_UMBER, TERM_L_UMBER },
+ { SF_BR_PLAS_IDX, TERM_ORANGE, TERM_RED },
+ { SF_BR_WALL_IDX, TERM_UMBER, TERM_L_UMBER },
+ { SF_BR_MANA_IDX, TERM_L_BLUE, TERM_WHITE },
+ { SF_BR_NUKE_IDX, TERM_GREEN, TERM_L_GREEN },
+ { SF_BR_DISI_IDX, TERM_WHITE, TERM_L_RED },
+ };
+
+ for (auto const &breath_color: breath_to_attr)
+ {
+ if (breath_color.breath_idx == i)
+ {
+ return &breath_color;
+ }
+ }
+
+ return nullptr;
+}
+
+
+/*
* Multi-hued monsters shimmer acording to their breaths.
*
* If a monster has only one kind of breath, it uses both colors
@@ -555,9 +577,7 @@ static byte multi_hued_attr(std::shared_ptr<monster_race> r_ptr)
{
byte allowed_attrs[15];
- int i, j;
-
- int stored_colors = 0;
+ std::size_t stored_colors = 0;
int breaths = 0;
@@ -570,18 +590,22 @@ static byte multi_hued_attr(std::shared_ptr<monster_race> r_ptr)
if (!r_ptr->freq_inate) return (get_shimmer_color());
/* Check breaths */
- for (i = 0; i < 32; i++)
+ for (std::size_t i = 0; i < monster_spell_flag_set::nbits; i++)
{
bool_ stored = FALSE;
/* Don't have that breath */
- if (!(r_ptr->flags4 & (1L << i))) continue;
+ if (!(r_ptr->spells.bit(i))) continue;
- /* Get the first color of this breath */
- first_color = breath_to_attr[i][0];
+ /* Find the breath in our list */
+ auto breath_color = lookup_breath_color(i);
+ if (!breath_color)
+ {
+ continue;
+ }
- /* Breath has no color associated with it */
- if (first_color == 0) continue;
+ /* Get the first color of this breath */
+ first_color = breath_color->first_color;
/* Monster can be of any color */
if (first_color == 255) return (randint(15));
@@ -595,7 +619,7 @@ static byte multi_hued_attr(std::shared_ptr<monster_race> r_ptr)
/* Always store the first color */
- for (j = 0; j < stored_colors; j++)
+ for (std::size_t j = 0; j < stored_colors; j++)
{
/* Already stored */
if (allowed_attrs[j] == first_color) stored = TRUE;
@@ -612,7 +636,7 @@ static byte multi_hued_attr(std::shared_ptr<monster_race> r_ptr)
*/
if (breaths == 1)
{
- second_color = breath_to_attr[i][1];
+ second_color = breath_color->second_color;
}
}
@@ -825,6 +849,11 @@ static byte darker_attrs[16] =
static void map_info(int y, int x, byte *ap, char *cp)
{
+ auto const &st_info = game->edit_data.st_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &f_info = game->edit_data.f_info;
+ auto const &k_info = game->edit_data.k_info;
+
byte a;
byte c;
@@ -841,20 +870,13 @@ static void map_info(int y, int x, byte *ap, char *cp)
auto info = c_ptr->info;
/* Feature code */
- auto feat = c_ptr->feat;
-
- /* Apply "mimic" field */
- if (c_ptr->mimic)
- {
- feat = c_ptr->mimic;
- }
- else
- {
- feat = f_info[feat].mimic;
- }
+ auto const feat = c_ptr->mimic
+ ? c_ptr->mimic
+ : f_info[c_ptr->feat].mimic
+ ;
/* Access floor */
- feature_type *f_ptr = &f_info[feat];
+ auto f_ptr = &f_info[feat];
/**** Layer 1 -- Terrain feature ****/
@@ -887,43 +909,8 @@ static void map_info(int y, int x, byte *ap, char *cp)
a = TERM_VIOLET;
}
- /* Mega-Hack 3 -- Traps don't have f_info entries either */
- if ((info & (CAVE_TRDT)) && (feat != FEAT_ILLUS_WALL))
- {
- /* Trap index */
- auto t_idx = c_ptr->t_idx;
-
- /*
- * If trap is set on a floor grid that is not
- * one of "interesting" features, use a special
- * symbol to display it. Check for doors is no longer
- * necessary because they have REMEMBER flag now.
- *
- * Cave macros cannot be used safely here, because of
- * c_ptr->mimic XXX XXX
- */
- if ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR)
- {
- c = f_info[FEAT_TRAP].x_char;
- }
-
- /* Add attr XXX XXX XXX */
- a = t_info[t_idx].color;
-
- /* Get a new color with a strange formula :) XXX XXX XXX */
- if (t_info[t_idx].flags & FTRAP_CHANGE)
- {
- s32b tmp;
-
- tmp = dun_level + dungeon_type + feat;
-
- a = tmp % 16;
- }
- }
-
-
/**** Step 2 -- Apply special random effects ****/
- if (!avoid_other && !avoid_shimmer)
+ if (!options->avoid_other && !options->avoid_shimmer)
{
/* Special terrain effect */
if (c_ptr->effect)
@@ -932,7 +919,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
}
/* Multi-hued attr */
- else if (f_ptr->flags1 & FF1_ATTR_MULTI)
+ else if (f_ptr->flags & FF_ATTR_MULTI)
{
a = f_ptr->shimmer[rand_int(7)];
}
@@ -945,7 +932,6 @@ static void map_info(int y, int x, byte *ap, char *cp)
* Special lighting effects, if specified and applicable
* This will never happen for
* - any grids in the overhead map
- * - traps
* - (graphics modes) terrain features without corresponding
* "darker" tiles.
*
@@ -954,16 +940,16 @@ static void map_info(int y, int x, byte *ap, char *cp)
*/
/* view_special_lite: lighting effects for boring features */
- if (view_special_lite &&
- ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR))
+ if (options->view_special_lite &&
+ ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR))
{
- if (!p_ptr->wild_mode && !(info & (CAVE_TRDT)))
+ if (!p_ptr->wild_mode)
{
/* Handle "seen" grids */
if (info & (CAVE_SEEN))
{
/* Only lit by "torch" light */
- if (view_yellow_lite && !(info & (CAVE_GLOW)))
+ if (options->view_yellow_lite && !(info & (CAVE_GLOW)))
{
/* Use "yellow" */
a = TERM_YELLOW;
@@ -985,7 +971,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
}
/* "Out-of-sight" glowing grids -- handle "view_bright_lite" */
- else if (view_bright_lite)
+ else if (options->view_bright_lite)
{
/* Use darker colour */
a = dark_attrs[a & 0xF];
@@ -994,10 +980,10 @@ static void map_info(int y, int x, byte *ap, char *cp)
}
/* view_granite_lite: lighting effects for walls and doors */
- else if (view_granite_lite &&
- (f_ptr->flags1 & (FF1_NO_VISION | FF1_DOOR)))
+ else if (options->view_granite_lite &&
+ (f_ptr->flags & (FF_NO_VISION | FF_DOOR)))
{
- if (!p_ptr->wild_mode && !(info & (CAVE_TRDT)))
+ if (!p_ptr->wild_mode)
{
/* Handle "seen" grids */
if (info & (CAVE_SEEN))
@@ -1013,7 +999,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
}
/* Handle "view_bright_lite" */
- else if (view_bright_lite)
+ else if (options->view_bright_lite)
{
/* Use darker colour */
a = dark_attrs[a & 0xF];
@@ -1058,34 +1044,31 @@ static void map_info(int y, int x, byte *ap, char *cp)
/**** Layer 2 -- Objects ****/
- if (feat != FEAT_MON_TRAP)
+ for (auto const o_idx: c_ptr->o_idxs)
{
- for (auto const o_idx: c_ptr->o_idxs)
- {
- /* Acquire object */
- object_type *o_ptr = &o_list[o_idx];
+ /* Acquire object */
+ object_type *o_ptr = &o_list[o_idx];
- /* Memorized objects */
- if (o_ptr->marked)
- {
- /* Normal char */
- *cp = object_char(o_ptr);
+ /* Memorized objects */
+ if (o_ptr->marked)
+ {
+ /* Normal char */
+ *cp = object_char(o_ptr);
- /* Normal attr */
- *ap = object_attr(o_ptr);
+ /* Normal attr */
+ *ap = object_attr(o_ptr);
- /* Multi-hued attr */
- if (!avoid_other && (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI))
- {
- *ap = get_shimmer_color();
- }
+ /* Multi-hued attr */
+ if (!options->avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI))
+ {
+ *ap = get_shimmer_color();
+ }
- /* Hack -- hallucination */
- if (p_ptr->image) image_object(ap, cp);
+ /* Hack -- hallucination */
+ if (p_ptr->image) image_object(ap, cp);
- /* Done */
- break;
- }
+ /* Done */
+ break;
}
}
@@ -1097,7 +1080,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
monster_type *m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags9 & RF9_MIMIC)
+ if (r_ptr->flags & RF_MIMIC)
{
/* Acquire object being mimicked */
object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()];
@@ -1112,7 +1095,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
*ap = object_attr(o_ptr);
/* Multi-hued attr */
- if (!avoid_other && (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI))
+ if (!options->avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI))
{
*ap = get_shimmer_color();
}
@@ -1131,7 +1114,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
a = r_ptr->x_attr;
/* Ignore weird codes */
- if (avoid_other)
+ if (options->avoid_other)
{
/* Use char */
*cp = c;
@@ -1141,10 +1124,10 @@ static void map_info(int y, int x, byte *ap, char *cp)
}
/* Multi-hued monster */
- else if (r_ptr->flags1 & (RF1_ATTR_MULTI))
+ else if (r_ptr->flags & RF_ATTR_MULTI)
{
/* Is it a shapechanger? */
- if (r_ptr->flags2 & (RF2_SHAPECHANGER))
+ if (r_ptr->flags & RF_SHAPECHANGER)
{
image_random(ap, cp);
}
@@ -1152,7 +1135,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
*cp = c;
/* Multi-hued attr */
- if (r_ptr->flags2 & (RF2_ATTR_ANY))
+ if (r_ptr->flags & RF_ATTR_ANY)
{
*ap = randint(15);
}
@@ -1163,7 +1146,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
}
/* Normal monster (not "clear" in any way) */
- else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR | RF1_CHAR_CLEAR)))
+ else if (!(r_ptr->flags & (RF_ATTR_CLEAR | RF_CHAR_CLEAR)))
{
/* Use char */
*cp = c;
@@ -1189,14 +1172,14 @@ static void map_info(int y, int x, byte *ap, char *cp)
else
{
/* Normal (non-clear char) monster */
- if (!(r_ptr->flags1 & (RF1_CHAR_CLEAR)))
+ if (!(r_ptr->flags & RF_CHAR_CLEAR))
{
/* Normal char */
*cp = c;
}
/* Normal (non-clear attr) monster */
- else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR)))
+ else if (!(r_ptr->flags & RF_ATTR_CLEAR))
{
/* Normal attr */
*ap = a;
@@ -1217,10 +1200,10 @@ static void map_info(int y, int x, byte *ap, char *cp)
if ((y == p_ptr->py) && (x == p_ptr->px) &&
(!p_ptr->invis || p_ptr->see_inv))
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
/* Get the "player" attr */
- if (!avoid_other && (r_ptr->flags1 & RF1_ATTR_MULTI))
+ if (!options->avoid_other && (r_ptr->flags & RF_ATTR_MULTI))
{
a = get_shimmer_color();
}
@@ -1233,7 +1216,7 @@ static void map_info(int y, int x, byte *ap, char *cp)
c = r_ptr->x_char;
/* Show player health char instead? */
- if (player_char_health)
+ if (options->player_char_health)
{
int percent = p_ptr->chp * 10 / p_ptr->mhp;
@@ -1258,14 +1241,22 @@ static void map_info(int y, int x, byte *ap, char *cp)
*/
void map_info_default(int y, int x, byte *ap, char *cp)
{
+ auto const &st_info = game->edit_data.st_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &f_info = game->edit_data.f_info;
+ auto const &k_info = game->edit_data.k_info;
+
byte a;
byte c;
+ /* Shorthand */
+ auto const avoid_other = options->avoid_other;
+
/**** Preparation ****/
/* Access the grid */
- cave_type *c_ptr = &cave[y][x];
+ auto const c_ptr = &cave[y][x];
/* Cache some frequently used values */
@@ -1274,20 +1265,12 @@ void map_info_default(int y, int x, byte *ap, char *cp)
auto info = c_ptr->info;
/* Feature code */
- auto feat = c_ptr->feat;
-
- /* Apply "mimic" field */
- if (c_ptr->mimic)
- {
- feat = c_ptr->mimic;
- }
- else
- {
- feat = f_info[feat].mimic;
- }
+ auto const feat = c_ptr->mimic
+ ? c_ptr->mimic
+ : f_info[c_ptr->feat].mimic;
/* Access floor */
- feature_type *f_ptr = &f_info[feat];
+ feature_type const *f_ptr = &f_info[feat];
/**** Layer 1 -- Terrain feature ****/
@@ -1321,41 +1304,6 @@ void map_info_default(int y, int x, byte *ap, char *cp)
a = TERM_VIOLET;
}
- /* Mega-Hack 3 -- Traps don't have f_info entries either */
- if ((info & (CAVE_TRDT)) && (feat != FEAT_ILLUS_WALL))
- {
- /* Trap index */
- auto t_idx = c_ptr->t_idx;
-
- /*
- * If trap is set on a floor grid that is not
- * one of "interesting" features, use a special
- * symbol to display it. Check for doors is no longer
- * necessary because they have REMEMBER flag now.
- *
- * Cave macros cannot be used safely here, because of
- * c_ptr->mimic XXX XXX
- */
- if ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR)
- {
- c = f_info[FEAT_TRAP].d_char;
- }
-
- /* Add attr */
- a = t_info[t_idx].color;
-
- /* Get a new color with a strange formula :) */
- if (t_info[t_idx].flags & FTRAP_CHANGE)
- {
- s32b tmp;
-
- tmp = dun_level + dungeon_type + feat;
-
- a = tmp % 16;
- }
- }
-
-
/**** Step 2 -- Apply special random effects ****/
if (!avoid_other)
{
@@ -1366,7 +1314,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
}
/* Multi-hued attr */
- else if (f_ptr->flags1 & FF1_ATTR_MULTI)
+ else if (f_ptr->flags & FF_ATTR_MULTI)
{
a = f_ptr->shimmer[rand_int(7)];
}
@@ -1379,7 +1327,6 @@ void map_info_default(int y, int x, byte *ap, char *cp)
* Special lighting effects, if specified and applicable
* This will never happen for
* - any grids in the overhead map
- * - traps
* - (graphics modes) terrain features without corresponding
* "darker" tiles.
*
@@ -1388,16 +1335,16 @@ void map_info_default(int y, int x, byte *ap, char *cp)
*/
/* view_special_lite: lighting effects for boring features */
- if (view_special_lite &&
- ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR))
+ if (options->view_special_lite &&
+ ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR))
{
- if (!p_ptr->wild_mode && !(info & (CAVE_TRDT)))
+ if (!p_ptr->wild_mode)
{
/* Handle "seen" grids */
if (info & (CAVE_SEEN))
{
/* Only lit by "torch" light */
- if (view_yellow_lite && !(info & (CAVE_GLOW)))
+ if (options->view_yellow_lite && !(info & (CAVE_GLOW)))
{
/* Use "yellow" */
a = TERM_YELLOW;
@@ -1419,7 +1366,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
}
/* "Out-of-sight" glowing grids -- handle "view_bright_lite" */
- else if (view_bright_lite)
+ else if (options->view_bright_lite)
{
/* Use darker colour */
a = dark_attrs[a & 0xF];
@@ -1428,10 +1375,10 @@ void map_info_default(int y, int x, byte *ap, char *cp)
}
/* view_granite_lite: lighting effects for walls and doors */
- else if (view_granite_lite &&
- (f_ptr->flags1 & (FF1_NO_VISION | FF1_DOOR)))
+ else if (options->view_granite_lite &&
+ (f_ptr->flags & (FF_NO_VISION | FF_DOOR)))
{
- if (!p_ptr->wild_mode && !(info & (CAVE_TRDT)))
+ if (!p_ptr->wild_mode)
{
/* Handle "seen" grids */
if (info & (CAVE_SEEN))
@@ -1447,7 +1394,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
}
/* Handle "view_bright_lite" */
- else if (view_bright_lite)
+ else if (options->view_bright_lite)
{
/* Use darker colour */
a = dark_attrs[a & 0xF];
@@ -1487,35 +1434,31 @@ void map_info_default(int y, int x, byte *ap, char *cp)
/**** Layer 2 -- Objects ****/
- if (feat != FEAT_MON_TRAP)
+ for (auto const this_o_idx: c_ptr->o_idxs)
{
- for (auto const this_o_idx: c_ptr->o_idxs)
+ /* Acquire object */
+ object_type *o_ptr = &o_list[this_o_idx];
+
+ /* Memorized objects */
+ if (o_ptr->marked)
{
- /* Acquire object */
- object_type *o_ptr = &o_list[this_o_idx];
+ /* Normal char */
+ *cp = object_char_default(o_ptr);
- /* Memorized objects */
- if (o_ptr->marked)
- {
- /* Normal char */
- *cp = object_char_default(o_ptr);
+ /* Normal attr */
+ *ap = object_attr_default(o_ptr);
- /* Normal attr */
- *ap = object_attr_default(o_ptr);
+ /* Multi-hued attr */
+ if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI))
+ {
+ *ap = get_shimmer_color();
+ }
- /* Multi-hued attr */
- if (!avoid_other &&
- (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI))
- {
- *ap = get_shimmer_color();
- }
+ /* Hack -- hallucination */
+ if (p_ptr->image) image_object(ap, cp);
- /* Hack -- hallucination */
- if (p_ptr->image) image_object(ap, cp);
-
- /* Done */
- break;
- }
+ /* Done */
+ break;
}
}
@@ -1527,7 +1470,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
monster_type *m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags9 & RF9_MIMIC)
+ if (r_ptr->flags & RF_MIMIC)
{
/* Acquire object being mimicked */
object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()];
@@ -1542,7 +1485,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
*ap = object_attr_default(o_ptr);
/* Multi-hued attr */
- if (!avoid_other && (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI))
+ if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI))
{
*ap = get_shimmer_color();
}
@@ -1571,10 +1514,10 @@ void map_info_default(int y, int x, byte *ap, char *cp)
}
/* Multi-hued monster */
- else if (r_ptr->flags1 & (RF1_ATTR_MULTI))
+ else if (r_ptr->flags & RF_ATTR_MULTI)
{
/* Is it a shapechanger? */
- if (r_ptr->flags2 & (RF2_SHAPECHANGER))
+ if (r_ptr->flags & RF_SHAPECHANGER)
{
image_random(ap, cp);
}
@@ -1582,7 +1525,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
*cp = c;
/* Multi-hued attr */
- if (r_ptr->flags2 & (RF2_ATTR_ANY))
+ if (r_ptr->flags & RF_ATTR_ANY)
{
*ap = randint(15);
}
@@ -1593,7 +1536,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
}
/* Normal monster (not "clear" in any way) */
- else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR | RF1_CHAR_CLEAR)))
+ else if (!(r_ptr->flags & (RF_ATTR_CLEAR | RF_CHAR_CLEAR)))
{
/* Use char */
*cp = c;
@@ -1616,14 +1559,14 @@ void map_info_default(int y, int x, byte *ap, char *cp)
else
{
/* Normal (non-clear char) monster */
- if (!(r_ptr->flags1 & (RF1_CHAR_CLEAR)))
+ if (!(r_ptr->flags & RF_CHAR_CLEAR))
{
/* Normal char */
*cp = c;
}
/* Normal (non-clear attr) monster */
- else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR)))
+ else if (!(r_ptr->flags & RF_ATTR_CLEAR))
{
/* Normal attr */
*ap = a;
@@ -1646,10 +1589,10 @@ void map_info_default(int y, int x, byte *ap, char *cp)
(!p_ptr->invis ||
(p_ptr->invis && p_ptr->see_inv)))
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
/* Get the "player" attr */
- if (!avoid_other && (r_ptr->flags1 & RF1_ATTR_MULTI))
+ if (!avoid_other && (r_ptr->flags & RF_ATTR_MULTI))
{
a = get_shimmer_color();
}
@@ -1774,7 +1717,7 @@ void note_spot(int y, int x)
monster_type *m_ptr = &m_list[c_ptr->m_idx];
auto r_ptr = m_ptr->race();
- if (r_ptr->flags9 & RF9_MIMIC)
+ if (r_ptr->flags & RF_MIMIC)
{
object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()];
o_ptr->marked = TRUE;
@@ -1783,18 +1726,17 @@ void note_spot(int y, int x)
/* Hack -- memorize grids */
- if (!(info & (CAVE_MARK)))
+ if (!(info & CAVE_MARK))
{
/* Memorise some "boring" grids */
if (cave_plain_floor_grid(c_ptr))
{
/* Option -- memorise certain floors */
- if ((info & (CAVE_TRDT)) ||
- ((info & (CAVE_GLOW)) && view_perma_grids ) ||
- view_torch_grids)
+ if (((info & CAVE_GLOW) && options->view_perma_grids) ||
+ options->view_torch_grids)
{
/* Memorize */
- c_ptr->info |= (CAVE_MARK);
+ c_ptr->info |= CAVE_MARK;
}
}
@@ -1802,7 +1744,7 @@ void note_spot(int y, int x)
else
{
/* Memorize */
- c_ptr->info |= (CAVE_MARK);
+ c_ptr->info |= CAVE_MARK;
}
}
}
@@ -1839,17 +1781,17 @@ void lite_spot(int y, int x)
* of both "lite_spot()" and "print_rel()", and that we use the
* "lite_spot()" function to display the player grid, if needed.
*/
-void prt_map(void)
+void prt_map()
{
int x, y;
int v;
/* Access the cursor state */
- (void)Term_get_cursor(&v);
+ Term_get_cursor(&v);
/* Hide the cursor */
- (void)Term_set_cursor(0);
+ Term_set_cursor(0);
/* Dump the map */
for (y = panel_row_min; y <= panel_row_max; y++)
@@ -1872,7 +1814,7 @@ void prt_map(void)
lite_spot(p_ptr->py, p_ptr->px);
/* Restore the cursor */
- (void)Term_set_cursor(v);
+ Term_set_cursor(v);
}
@@ -1970,9 +1912,9 @@ static byte priority_table[][2] =
*/
static byte priority(byte a, char c)
{
- int i, p0, p1;
+ auto const &f_info = game->edit_data.f_info;
- feature_type *f_ptr;
+ int i, p0, p1;
/* Scan the table */
for (i = 0; TRUE; i++)
@@ -1987,7 +1929,7 @@ static byte priority(byte a, char c)
p0 = priority_table[i][0];
/* Access the feature */
- f_ptr = &f_info[p0];
+ auto f_ptr = &f_info[p0];
/* Check character and attribute, accept matches */
if ((f_ptr->x_char == c) && (f_ptr->x_attr == a)) return (p1);
@@ -2020,9 +1962,6 @@ void display_map(int *cy, int *cx)
byte tp;
- bool_ old_view_special_lite;
- bool_ old_view_granite_lite;
-
int hgt, wid, yrat, xrat, yfactor, xfactor;
@@ -2047,12 +1986,12 @@ void display_map(int *cy, int *cx)
/* Save lighting effects */
- old_view_special_lite = view_special_lite;
- old_view_granite_lite = view_granite_lite;
+ auto const old_view_special_lite = options->view_special_lite;
+ auto const old_view_granite_lite = options->view_granite_lite;
/* Disable lighting effects */
- view_special_lite = FALSE;
- view_granite_lite = FALSE;
+ options->view_special_lite = FALSE;
+ options->view_granite_lite = FALSE;
/* Set up initial maps */
@@ -2149,8 +2088,8 @@ void display_map(int *cy, int *cx)
*cx = p_ptr->px * xfactor / xrat + COL_MAP;
/* Restore lighting effects */
- view_special_lite = old_view_special_lite;
- view_granite_lite = old_view_granite_lite;
+ options->view_special_lite = old_view_special_lite;
+ options->view_granite_lite = old_view_granite_lite;
}
@@ -2159,7 +2098,7 @@ void display_map(int *cy, int *cx)
*
* Currently, the "player" is displayed on the map. XXX XXX XXX
*/
-void do_cmd_view_map(void)
+void do_cmd_view_map()
{
int cy, cx;
int wid, hgt;
@@ -2822,7 +2761,7 @@ static void vinfo_init_aux(vinfo_hack *hack, int y, int x, long m)
* a number which is too high, running this function, and using the
* error messages to obtain the correct values.
*/
-errr vinfo_init(void)
+errr vinfo_init()
{
int i, y, x;
@@ -3044,7 +2983,7 @@ errr vinfo_init(void)
/*
* Forget the "CAVE_VIEW" grids, redrawing as needed
*/
-void forget_view(void)
+void forget_view()
{
int i;
@@ -3152,7 +3091,7 @@ void forget_view(void)
* special grids. Because the actual number of required grids is bizarre,
* we simply allocate twice as many as we would normally need. XXX XXX XXX
*/
-void update_view(void)
+void update_view()
{
int i, o;
int y, x;
@@ -3471,7 +3410,7 @@ void update_view(void)
/*
* Clear monster light
*/
-void forget_mon_lite(void)
+void forget_mon_lite()
{
int i, y, x;
@@ -3519,7 +3458,7 @@ void forget_mon_lite(void)
* This function works within the current player's field of view
* calculated by update_view(), so it should normally be called
* whenever FoV is updated (== PU_VIEW | PU_MON_LITE). The other
- * case is when RF9_HAS_LITE monsters have moved or dead. Monster
+ * case is when RF_HAS_LITE monsters have moved or dead. Monster
* creation occurs out of LoS, so I chose not to take this into
* consideration.
*
@@ -3536,8 +3475,10 @@ void forget_mon_lite(void)
* or brighter light, and it doesn't work well with PernAngband's already
* colourful terrain features in aesthetically pleasing ways... -- pelpel
*/
-void update_mon_lite(void)
+void update_mon_lite()
{
+ auto const &f_info = game->edit_data.f_info;
+
int i, y, x, d;
int fy, fx;
@@ -3625,7 +3566,7 @@ void update_mon_lite(void)
auto r_ptr = m_ptr->race();
/* Skip monsters not carrying light source */
- if (!(r_ptr->flags9 & RF9_HAS_LITE)) continue;
+ if (!(r_ptr->flags & RF_HAS_LITE)) continue;
/* Access the location */
fy = m_ptr->fy;
@@ -3676,7 +3617,7 @@ void update_mon_lite(void)
*
* We don't have four sides for a wall grid, so...
*/
- if (invis && (f_info[c_ptr->feat].flags1 & FF1_NO_VISION)) continue;
+ if (invis && (f_info[c_ptr->feat].flags & FF_NO_VISION)) continue;
/* Give monster light to the location */
c_ptr->info |= (CAVE_MLIT | CAVE_SEEN);
@@ -3850,12 +3791,12 @@ static void update_flow_aux(int y, int x, int n)
* We do not need a priority queue because the cost from grid
* to grid is always "one" and we process them in order.
*/
-void update_flow(void)
+void update_flow()
{
int x, y, d;
/* Hack -- disabled */
- if (!flow_by_sound) return;
+ if (!options->flow_by_sound) return;
/* Paranoia -- make sure the array is empty */
if (temp_n) return;
@@ -3918,31 +3859,14 @@ void update_flow(void)
/*
* Hack -- map the current panel (plus some) ala "magic mapping"
*/
-void map_area(void)
+void map_area()
{
- int i, x, y, y1, y2, x1, x2;
-
- cave_type *c_ptr;
-
-
- /* Pick an area to map */
- y1 = panel_row_min - randint(10);
- y2 = panel_row_max + randint(10);
- x1 = panel_col_min - randint(20);
- x2 = panel_col_max + randint(20);
-
- /* Speed -- shrink to fit legal bounds */
- if (y1 < 1) y1 = 1;
- if (y2 > cur_hgt - 2) y2 = cur_hgt - 2;
- if (x1 < 1) x1 = 1;
- if (x2 > cur_wid - 2) x2 = cur_wid - 2;
-
- /* Scan that area */
- for (y = y1; y <= y2; y++)
+ /* Scan the whole map */
+ for (int y = 1; y < cur_hgt - 1; y++)
{
- for (x = x1; x <= x2; x++)
+ for (int x = 1; x < cur_wid - 1; x++)
{
- c_ptr = &cave[y][x];
+ auto c_ptr = &cave[y][x];
/* All non-walls are "checked" */
if (!is_wall(c_ptr))
@@ -3955,7 +3879,7 @@ void map_area(void)
}
/* Memorize known walls */
- for (i = 0; i < 8; i++)
+ for (int i = 0; i < 8; i++)
{
c_ptr = &cave[y + ddy_ddd[i]][x + ddx_ddd[i]];
@@ -3995,7 +3919,7 @@ void map_area(void)
* since this would prevent the use of "view_torch_grids" as a method to
* keep track of what grids have been observed directly.
*/
-void wiz_lite(void)
+void wiz_lite()
{
int i, y, x;
@@ -4028,7 +3952,7 @@ void wiz_lite(void)
monster_type *m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags9 & RF9_MIMIC)
+ if (r_ptr->flags & RF_MIMIC)
{
object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()];
o_ptr->marked = TRUE;
@@ -4058,7 +3982,7 @@ void wiz_lite(void)
}
/* Normally, memorize floors (see above) */
- if (view_perma_grids && !view_torch_grids)
+ if (options->view_perma_grids && !options->view_torch_grids)
{
/* Memorize the grid */
c_ptr->info |= (CAVE_MARK);
@@ -4078,7 +4002,7 @@ void wiz_lite(void)
p_ptr->window |= (PW_OVERHEAD);
}
-void wiz_lite_extra(void)
+void wiz_lite_extra()
{
int y, x;
for (y = 0; y < cur_hgt; y++)
@@ -4094,7 +4018,7 @@ void wiz_lite_extra(void)
/*
* Forget the dungeon map (ala "Thinking of Maud...").
*/
-void wiz_dark(void)
+void wiz_dark()
{
int i, y, x;
@@ -4406,7 +4330,7 @@ void object_track(object_type *o_ptr)
*
* All disturbance cancels repeated commands, resting, and running.
*/
-void disturb(int stop_search)
+void disturb()
{
/* Cancel auto-commands */
/* command_new = 0; */
@@ -4441,21 +4365,37 @@ void disturb(int stop_search)
p_ptr->update |= (PU_TORCH);
}
- /* Cancel searching if requested */
- if (stop_search && p_ptr->searching)
+ /* Flush the input if requested */
+ if (options->flush_disturb)
{
- /* Cancel */
- p_ptr->searching = FALSE;
+ flush();
+ }
+}
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
- /* Redraw the state */
- p_ptr->redraw |= (PR_FRAME);
+
+/*
+ * Disturb if option 'disturb_state' is set.
+ */
+void disturb_on_state()
+{
+ if (options->disturb_state)
+ {
+ disturb();
}
+}
- /* Flush the input if requested */
- if (flush_disturb) flush();
+
+
+/*
+ * Disturb if option 'disturb_other' is set.
+ */
+void disturb_on_other()
+{
+ if (options->disturb_other)
+ {
+ disturb();
+ }
}
@@ -4467,7 +4407,7 @@ void disturb(int stop_search)
static int random_quest_number()
{
if ((dun_level >= 1) && (dun_level < MAX_RANDOM_QUEST) &&
- (dungeon_flags1 & DF1_PRINCIPAL) &&
+ (dungeon_flags & DF_PRINCIPAL) &&
(random_quests[dun_level].type) &&
(!random_quests[dun_level].done) &&
(!is_randhero(dun_level)))
@@ -4550,7 +4490,9 @@ bool cave_floor_bold(int y, int x)
*/
bool cave_floor_grid(cave_type const *c)
{
- return (f_info[c->feat].flags1 & FF1_FLOOR) && (c->feat != FEAT_MON_TRAP);
+ auto const &f_info = game->edit_data.f_info;
+
+ return bool(f_info[c->feat].flags & FF_FLOOR);
}
@@ -4569,9 +4511,11 @@ bool cave_plain_floor_bold(int y, int x)
*/
bool cave_plain_floor_grid(cave_type const *c)
{
+ auto const &f_info = game->edit_data.f_info;
+
return
- (f_info[c->feat].flags1 & FF1_FLOOR) &&
- !(f_info[c->feat].flags1 & FF1_REMEMBER);
+ (f_info[c->feat].flags & FF_FLOOR) &&
+ !(f_info[c->feat].flags & FF_REMEMBER);
}
@@ -4595,7 +4539,9 @@ bool cave_sight_bold(int y, int x)
bool cave_sight_grid(cave_type const *c)
{
- return !(f_info[c->feat].flags1 & FF1_NO_VISION);
+ auto const &f_info = game->edit_data.f_info;
+
+ return !(f_info[c->feat].flags & FF_NO_VISION);
}
@@ -4609,11 +4555,12 @@ bool cave_sight_grid(cave_type const *c)
*/
bool cave_clean_bold(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
return
- (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) &&
- (cave[y][x].feat != FEAT_MON_TRAP) &&
+ (f_info[cave[y][x].feat].flags & FF_FLOOR) &&
(cave[y][x].o_idxs.empty()) &&
- !(f_info[cave[y][x].feat].flags1 & FF1_PERMANENT);
+ !(f_info[cave[y][x].feat].flags & FF_PERMANENT);
}
/*
@@ -4641,19 +4588,21 @@ bool cave_empty_bold(int y, int x)
*/
bool cave_naked_bold(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
return
- (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) &&
- (cave[y][x].feat != FEAT_MON_TRAP) &&
- !(f_info[cave[y][x].feat].flags1 & FF1_PERMANENT) &&
+ (f_info[cave[y][x].feat].flags & FF_FLOOR) &&
+ !(f_info[cave[y][x].feat].flags & FF_PERMANENT) &&
(cave[y][x].o_idxs.empty()) &&
(cave[y][x].m_idx == 0);
}
bool cave_naked_bold2(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
return
- (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) &&
- (cave[y][x].feat != FEAT_MON_TRAP) &&
+ (f_info[cave[y][x].feat].flags & FF_FLOOR) &&
(cave[y][x].o_idxs.empty()) &&
(cave[y][x].m_idx == 0);
}
@@ -4669,7 +4618,9 @@ bool cave_perma_bold(int y, int x)
bool cave_perma_grid(cave_type const *c)
{
- return f_info[c->feat].flags1 & FF1_PERMANENT;
+ auto const &f_info = game->edit_data.f_info;
+
+ return bool(f_info[c->feat].flags & FF_PERMANENT);
}
/*
diff --git a/src/cave.hpp b/src/cave.hpp
index 64f67dba..ce1631a1 100644
--- a/src/cave.hpp
+++ b/src/cave.hpp
@@ -4,52 +4,54 @@
#include "cave_type_fwd.hpp"
#include "object_type_fwd.hpp"
-extern int distance(int y1, int x1, int y2, int x2);
-extern bool_ los(int y1, int x1, int y2, int x2);
-extern bool_ cave_valid_bold(int y, int x);
-extern bool_ no_lite(void);
-extern void map_info_default(int y, int x, byte *ap, char *cp);
-extern void move_cursor_relative(int row, int col);
-extern void print_rel(char c, byte a, int y, int x);
-extern void note_spot(int y, int x);
-extern void lite_spot(int y, int x);
-extern void prt_map(void);
-extern void display_map(int *cy, int *cx);
-extern void do_cmd_view_map(void);
-extern errr vinfo_init(void);
-extern void forget_view(void);
-extern void update_view(void);
-extern void forget_mon_lite(void);
-extern void update_mon_lite(void);
-extern void update_flow(void);
-extern void map_area(void);
-extern void wiz_lite(void);
-extern void wiz_lite_extra(void);
-extern void wiz_dark(void);
-extern void cave_set_feat(int y, int x, int feat);
-extern void place_floor(int y, int x);
-extern void place_floor_convert_glass(int y, int x);
-extern void place_filler(int y, int x);
-extern void mmove2(int *y, int *x, int y1, int x1, int y2, int x2);
-extern bool_ projectable(int y1, int x1, int y2, int x2);
-extern void scatter(int *yp, int *xp, int y, int x, int d);
-extern void health_track(int m_idx);
-extern void monster_race_track(int r_idx, int ego);
-extern void object_track(object_type *o_ptr);
-extern void disturb(int stop_search);
-extern int is_quest(int level);
-extern int new_effect(int type, int dam, int time, int cy, int cx, int rad, s32b flags);
-extern bool cave_floor_bold(int y, int x);
-extern bool cave_floor_grid(cave_type const *c);
-extern bool cave_plain_floor_bold(int y, int x);
-extern bool cave_plain_floor_grid(cave_type const *c);
-extern bool cave_sight_bold(int y, int x);
-extern bool cave_sight_grid(cave_type const *c);
-extern bool cave_clean_bold(int y, int x);
-extern bool cave_empty_bold(int y, int x);
-extern bool cave_naked_bold(int y, int x);
-extern bool cave_naked_bold2(int y, int x);
-extern bool cave_perma_bold(int y, int x);
-extern bool cave_perma_grid(cave_type const *c);
-extern bool player_has_los_bold(int y, int x);
-extern bool player_can_see_bold(int y, int x);
+int distance(int y1, int x1, int y2, int x2);
+bool_ los(int y1, int x1, int y2, int x2);
+bool_ cave_valid_bold(int y, int x);
+bool_ no_lite();
+void map_info_default(int y, int x, byte *ap, char *cp);
+void move_cursor_relative(int row, int col);
+void print_rel(char c, byte a, int y, int x);
+void note_spot(int y, int x);
+void lite_spot(int y, int x);
+void prt_map();
+void display_map(int *cy, int *cx);
+void do_cmd_view_map();
+errr vinfo_init();
+void forget_view();
+void update_view();
+void forget_mon_lite();
+void update_mon_lite();
+void update_flow();
+void map_area();
+void wiz_lite();
+void wiz_lite_extra();
+void wiz_dark();
+void cave_set_feat(int y, int x, int feat);
+void place_floor(int y, int x);
+void place_floor_convert_glass(int y, int x);
+void place_filler(int y, int x);
+void mmove2(int *y, int *x, int y1, int x1, int y2, int x2);
+bool_ projectable(int y1, int x1, int y2, int x2);
+void scatter(int *yp, int *xp, int y, int x, int d);
+void health_track(int m_idx);
+void monster_race_track(int r_idx, int ego);
+void object_track(object_type *o_ptr);
+void disturb();
+void disturb_on_state();
+void disturb_on_other();
+int is_quest(int level);
+int new_effect(int type, int dam, int time, int cy, int cx, int rad, s32b flags);
+bool cave_floor_bold(int y, int x);
+bool cave_floor_grid(cave_type const *c);
+bool cave_plain_floor_bold(int y, int x);
+bool cave_plain_floor_grid(cave_type const *c);
+bool cave_sight_bold(int y, int x);
+bool cave_sight_grid(cave_type const *c);
+bool cave_clean_bold(int y, int x);
+bool cave_empty_bold(int y, int x);
+bool cave_naked_bold(int y, int x);
+bool cave_naked_bold2(int y, int x);
+bool cave_perma_bold(int y, int x);
+bool cave_perma_grid(cave_type const *c);
+bool player_has_los_bold(int y, int x);
+bool player_can_see_bold(int y, int x);
diff --git a/src/cave_type.hpp b/src/cave_type.hpp
index 958ace1d..08e6002f 100644
--- a/src/cave_type.hpp
+++ b/src/cave_type.hpp
@@ -38,8 +38,6 @@ struct cave_type
s16b m_idx = 0; /* Monster in this grid */
- s16b t_idx = 0; /* trap index (in t_list) or zero */
-
s16b special = 0; /* Special cave info */
s16b special2 = 0; /* Special cave info */
diff --git a/src/cmd1.cc b/src/cmd1.cc
index f4066915..13edf0ff 100644
--- a/src/cmd1.cc
+++ b/src/cmd1.cc
@@ -13,8 +13,10 @@
#include "cmd4.hpp"
#include "cmd5.hpp"
#include "dungeon_info_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "hooks.hpp"
#include "hook_move_in.hpp"
@@ -25,19 +27,20 @@
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
+#include "object_flag.hpp"
#include "object1.hpp"
#include "object2.hpp"
#include "options.hpp"
+#include "player_race_flag.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "skills.hpp"
#include "spells1.hpp"
#include "spells2.hpp"
#include "spells3.hpp"
#include "tables.hpp"
-#include "traps.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -239,11 +242,8 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
auto const r_ptr = m_ptr->race();
- u32b f1, f2, f3, f4, f5, esp;
-
-
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const f = object_flags(o_ptr);
/* Some "weapons" and "ammo" do extra damage */
switch (o_ptr->tval)
@@ -259,150 +259,84 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
case TV_DIGGING:
{
/* Slay Animal */
- if ((f1 & (TR1_SLAY_ANIMAL)) && (r_ptr->flags3 & (RF3_ANIMAL)))
+ if ((f & TR_SLAY_ANIMAL) && (r_ptr->flags & RF_ANIMAL))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_ANIMAL);
- }
-
if (mult < 2) mult = 2;
}
/* Slay Evil */
- if ((f1 & (TR1_SLAY_EVIL)) && (r_ptr->flags3 & (RF3_EVIL)))
+ if ((f & TR_SLAY_EVIL) && (r_ptr->flags & RF_EVIL))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_EVIL);
- }
-
if (mult < 2) mult = 2;
}
/* Slay Undead */
- if ((f1 & (TR1_SLAY_UNDEAD)) && (r_ptr->flags3 & (RF3_UNDEAD)))
+ if ((f & TR_SLAY_UNDEAD) && (r_ptr->flags & RF_UNDEAD))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_UNDEAD);
- }
-
if (mult < 3) mult = 3;
}
/* Slay Demon */
- if ((f1 & (TR1_SLAY_DEMON)) && (r_ptr->flags3 & (RF3_DEMON)))
+ if ((f & TR_SLAY_DEMON) && (r_ptr->flags & RF_DEMON))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_DEMON);
- }
-
if (mult < 3) mult = 3;
}
/* Slay Orc */
- if ((f1 & (TR1_SLAY_ORC)) && (r_ptr->flags3 & (RF3_ORC)))
+ if ((f & TR_SLAY_ORC) && (r_ptr->flags & RF_ORC))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_ORC);
- }
-
if (mult < 3) mult = 3;
}
/* Slay Troll */
- if ((f1 & (TR1_SLAY_TROLL)) && (r_ptr->flags3 & (RF3_TROLL)))
+ if ((f & TR_SLAY_TROLL) && (r_ptr->flags & RF_TROLL))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_TROLL);
- }
-
if (mult < 3) mult = 3;
}
/* Slay Giant */
- if ((f1 & (TR1_SLAY_GIANT)) && (r_ptr->flags3 & (RF3_GIANT)))
+ if ((f & TR_SLAY_GIANT) && (r_ptr->flags & RF_GIANT))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_GIANT);
- }
-
if (mult < 3) mult = 3;
}
/* Slay Dragon */
- if ((f1 & (TR1_SLAY_DRAGON)) && (r_ptr->flags3 & (RF3_DRAGON)))
+ if ((f & TR_SLAY_DRAGON) && (r_ptr->flags & RF_DRAGON))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_DRAGON);
- }
-
if (mult < 3) mult = 3;
}
/* Execute Dragon */
- if ((f1 & (TR1_KILL_DRAGON)) && (r_ptr->flags3 & (RF3_DRAGON)))
+ if ((f & TR_KILL_DRAGON) && (r_ptr->flags & RF_DRAGON))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_DRAGON);
- }
-
if (mult < 5) mult = 5;
}
/* Execute Undead */
- if ((f5 & (TR5_KILL_UNDEAD)) && (r_ptr->flags3 & (RF3_UNDEAD)))
+ if ((f & TR_KILL_UNDEAD) && (r_ptr->flags & RF_UNDEAD))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_UNDEAD);
- }
if (mult < 5) mult = 5;
}
/* Execute Demon */
- if ((f5 & (TR5_KILL_DEMON)) && (r_ptr->flags3 & (RF3_DEMON)))
+ if ((f & TR_KILL_DEMON) && (r_ptr->flags & RF_DEMON))
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_DEMON);
- }
-
if (mult < 5) mult = 5;
}
/* Brand (Acid) */
- if (f1 & (TR1_BRAND_ACID))
+ if (f & TR_BRAND_ACID)
{
- /* Notice immunity */
- if (r_ptr->flags3 & (RF3_IM_ACID))
+ if (r_ptr->flags & RF_IM_ACID)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_IM_ACID);
- }
+ // No additional multiplier
}
-
- /* Notice susceptibility */
- else if (r_ptr->flags9 & (RF9_SUSCEP_ACID))
+ else if (r_ptr->flags & RF_SUSCEP_ACID)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags9 |= (RF9_SUSCEP_ACID);
- }
if (mult < 6) mult = 6;
}
-
- /* Otherwise, take the damage */
else
{
if (mult < 3) mult = 3;
@@ -410,28 +344,16 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
}
/* Brand (Elec) */
- if (f1 & (TR1_BRAND_ELEC))
+ if (f & TR_BRAND_ELEC)
{
- /* Notice immunity */
- if (r_ptr->flags3 & (RF3_IM_ELEC))
+ if (r_ptr->flags & RF_IM_ELEC)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_IM_ELEC);
- }
+ // No additional multiplier
}
-
- /* Notice susceptibility */
- else if (r_ptr->flags9 & (RF9_SUSCEP_ELEC))
+ else if (r_ptr->flags & RF_SUSCEP_ELEC)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags9 |= (RF9_SUSCEP_ELEC);
- }
if (mult < 6) mult = 6;
}
-
- /* Otherwise, take the damage */
else
{
if (mult < 3) mult = 3;
@@ -439,28 +361,16 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
}
/* Brand (Fire) */
- if (f1 & (TR1_BRAND_FIRE))
+ if (f & TR_BRAND_FIRE)
{
- /* Notice immunity */
- if (r_ptr->flags3 & (RF3_IM_FIRE))
+ if (r_ptr->flags & RF_IM_FIRE)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_IM_FIRE);
- }
+ // No additional multiplier
}
-
- /* Notice susceptibility */
- else if (r_ptr->flags3 & (RF3_SUSCEP_FIRE))
+ else if (r_ptr->flags & RF_SUSCEP_FIRE)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_SUSCEP_FIRE);
- }
if (mult < 6) mult = 6;
}
-
- /* Otherwise, take the damage */
else
{
if (mult < 3) mult = 3;
@@ -468,28 +378,16 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
}
/* Brand (Cold) */
- if (f1 & (TR1_BRAND_COLD))
+ if (f & TR_BRAND_COLD)
{
- /* Notice immunity */
- if (r_ptr->flags3 & (RF3_IM_COLD))
+ if (r_ptr->flags & RF_IM_COLD)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_IM_COLD);
- }
+ // No additional multiplier
}
-
- /* Notice susceptibility */
- else if (r_ptr->flags3 & (RF3_SUSCEP_COLD))
+ else if (r_ptr->flags & RF_SUSCEP_COLD)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_SUSCEP_COLD);
- }
if (mult < 6) mult = 6;
}
-
- /* Otherwise, take the damage */
else
{
if (mult < 3) mult = 3;
@@ -497,29 +395,17 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
}
/* Brand (Poison) */
- if (f1 & (TR1_BRAND_POIS) || (p_ptr->tim_poison))
+ if ((f & TR_BRAND_POIS) || (p_ptr->tim_poison))
{
- /* Notice immunity */
- if (r_ptr->flags3 & (RF3_IM_POIS))
+ if (r_ptr->flags & RF_IM_POIS)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_IM_POIS);
- }
+ // No additional damage
}
-
- /* Notice susceptibility */
- else if (r_ptr->flags9 & (RF9_SUSCEP_POIS))
+ else if (r_ptr->flags & RF_SUSCEP_POIS)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags9 |= (RF9_SUSCEP_POIS);
- }
if (mult < 6) mult = 6;
if (magik(95)) *special |= SPEC_POIS;
}
-
- /* Otherwise, take the damage */
else
{
if (mult < 3) mult = 3;
@@ -528,18 +414,12 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
}
/* Wounding */
- if (f5 & (TR5_WOUNDING))
+ if (f & TR_WOUNDING)
{
- /* Notice immunity */
- if (r_ptr->flags8 & (RF8_NO_CUT))
+ if (r_ptr->flags & RF_NO_CUT)
{
- if (m_ptr->ml)
- {
- r_info[m_ptr->r_idx].r_flags8 |= (RF8_NO_CUT);
- }
+ // No additional damage
}
-
- /* Otherwise, take the damage */
else
{
if (magik(50)) *special |= SPEC_CUT;
@@ -556,89 +436,6 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr,
/*
- * Search for hidden things
- */
-void search(void)
-{
- /* Start with base search ability */
- int chance = p_ptr->skill_srh;
-
- /* Penalize various conditions */
- if (p_ptr->blind || no_lite()) chance = chance / 10;
- if (p_ptr->confused || p_ptr->image) chance = chance / 10;
-
- /* Search the nearby grids, which are always in bounds */
- for (int y = (p_ptr->py - 1); y <= (p_ptr->py + 1); y++)
- {
- for (int x = (p_ptr->px - 1); x <= (p_ptr->px + 1); x++)
- {
- /* Sometimes, notice things */
- if (rand_int(100) < chance)
- {
- /* Access the grid */
- cave_type *c_ptr = &cave[y][x];
-
- /* Invisible trap */
- if ((c_ptr->t_idx != 0) && !(c_ptr->info & CAVE_TRDT))
- {
- /* Pick a trap */
- pick_trap(y, x);
-
- /* Message */
- msg_print("You have found a trap.");
-
- /* Disturb */
- disturb(0);
- }
-
- /* Secret door */
- if (c_ptr->feat == FEAT_SECRET)
- {
- /* Message */
- msg_print("You have found a secret door.");
-
- /* Pick a door XXX XXX XXX */
- cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00);
- cave[y][x].mimic = 0;
- lite_spot(y, x);
-
- /* Disturb */
- disturb(0);
- }
-
- /* Scan all objects in the grid */
- for (auto const o_idx: c_ptr->o_idxs)
- {
- object_type * o_ptr = &o_list[o_idx];
-
- /* Skip non-chests */
- if (o_ptr->tval != TV_CHEST) continue;
-
- /* Skip non-trapped chests */
- if (!o_ptr->pval) continue;
-
- /* Identify once */
- if (!object_known_p(o_ptr))
- {
- /* Message */
- msg_print("You have discovered a trap on the chest!");
-
- /* Know the trap */
- object_known(o_ptr);
-
- /* Notice it */
- disturb(0);
- }
- }
- }
- }
- }
-}
-
-
-
-
-/*
* Player "wants" to pick up an object or gold.
* Note that we ONLY handle things that can be picked up.
* See "move_player()" for handling of other things.
@@ -652,39 +449,11 @@ void carry(int pickup)
}
-/*
- * Handle player hitting a real trap
- */
-static void hit_trap(void)
-{
- bool_ ident = FALSE;
-
- cave_type *c_ptr;
-
-
- /* Disturb the player */
- disturb(0);
-
- /* Get the cave grid */
- c_ptr = &cave[p_ptr->py][p_ptr->px];
- if (c_ptr->t_idx != 0)
- {
- ident = player_activate_trap_type(p_ptr->py, p_ptr->px, NULL, -1);
- if (ident)
- {
- t_info[c_ptr->t_idx].ident = TRUE;
- msg_format("You identified the trap as %s.",
- t_info[c_ptr->t_idx].name);
- }
- }
-}
-
-
-void touch_zap_player(monster_type *m_ptr)
+static void touch_zap_player(monster_type *m_ptr)
{
auto r_ptr = m_ptr->race();
- if (r_ptr->flags2 & (RF2_AURA_FIRE))
+ if (r_ptr->flags & RF_AURA_FIRE)
{
if (!(p_ptr->immune_fire))
{
@@ -703,13 +472,12 @@ void touch_zap_player(monster_type *m_ptr)
if (p_ptr->sensible_fire) aura_damage = (aura_damage + 2) * 2;
take_hit(aura_damage, aura_dam);
- r_ptr->r_flags2 |= RF2_AURA_FIRE;
handle_stuff();
}
}
- if (r_ptr->flags2 & (RF2_AURA_ELEC))
+ if (r_ptr->flags & RF_AURA_ELEC)
{
if (!(p_ptr->immune_elec))
{
@@ -726,7 +494,6 @@ void touch_zap_player(monster_type *m_ptr)
msg_print("You get zapped!");
take_hit(aura_damage, aura_dam);
- r_ptr->r_flags2 |= RF2_AURA_ELEC;
handle_stuff();
}
}
@@ -740,9 +507,9 @@ void touch_zap_player(monster_type *m_ptr)
static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
int x, int y)
{
- monster_type *t_ptr = &m_list[m_idx];
+ auto const &r_info = game->edit_data.r_info;
- monster_race *r_ptr;
+ monster_type *t_ptr = &m_list[m_idx];
int ap_cnt;
@@ -750,8 +517,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
char t_name[80];
- cptr sym_name = symbiote_name(TRUE);
-
char temp[80];
bool_ blinked = FALSE, touched = FALSE;
@@ -760,17 +525,15 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
byte x_saver = t_ptr->fx;
- object_type *o_ptr;
-
-
/* Get the carried monster */
- o_ptr = &p_ptr->inventory[INVEN_CARRY];
+ auto o_ptr = &p_ptr->inventory[INVEN_CARRY];
if (!o_ptr->k_idx) return;
- r_ptr = &r_info[o_ptr->pval];
+ /* Get monster race of the symbiote */
+ auto r_ptr = &r_info[o_ptr->pval];
/* Not allowed to attack */
- if (r_ptr->flags1 & RF1_NEVER_BLOW) return;
+ if (r_ptr->flags & RF_NEVER_BLOW) return;
/* Total armor */
ac = t_ptr->ac;
@@ -792,9 +555,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool_ visible = FALSE;
- bool_ obvious = FALSE;
-
int power = 0;
int damage = 0;
@@ -818,9 +578,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
/* break; */
}
- /* Extract visibility (before blink) */
- visible = TRUE;
-
/* Extract the attack "power" */
power = get_attack_power(effect);
@@ -828,7 +585,7 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
if (!effect || check_hit2(power, rlev, ac))
{
/* Always disturbing */
- disturb(1);
+ disturb();
/* Describe the attack method */
switch (method)
@@ -1003,13 +760,12 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
{
strnfmt(temp, sizeof(temp), act, t_name);
if (t_ptr->ml)
- msg_format("%s %s", sym_name, temp);
+ {
+ msg_format("%s %s", symbiote_name(true).c_str(), temp);
+ }
}
- /* Hack -- assume all attacks are obvious */
- obvious = TRUE;
-
/* Roll out the damage */
damage = damroll(d_dice, d_side);
@@ -1166,15 +922,13 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
{
auto tr_ptr = t_ptr->race();
/* Aura fire */
- if ((tr_ptr->flags2 & RF2_AURA_FIRE) &&
- !(r_ptr->flags3 & RF3_IM_FIRE))
+ if ((tr_ptr->flags & RF_AURA_FIRE) &&
+ !(r_ptr->flags & RF_IM_FIRE))
{
if (t_ptr->ml)
{
blinked = FALSE;
msg_format("You are suddenly very hot!");
- if (t_ptr->ml)
- tr_ptr->r_flags2 |= RF2_AURA_FIRE;
}
project(m_idx, 0, p_ptr->py, p_ptr->px,
damroll(1 + ((t_ptr->level) / 26),
@@ -1183,15 +937,13 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
}
/* Aura elec */
- if ((tr_ptr->flags2 & (RF2_AURA_ELEC)) &&
- !(r_ptr->flags3 & (RF3_IM_ELEC)))
+ if ((tr_ptr->flags & RF_AURA_ELEC) &&
+ !(r_ptr->flags & RF_IM_ELEC))
{
if (t_ptr->ml)
{
blinked = FALSE;
msg_format("You get zapped!");
- if (t_ptr->ml)
- tr_ptr->r_flags2 |= RF2_AURA_ELEC;
}
project(m_idx, 0, p_ptr->py, p_ptr->px,
damroll(1 + ((t_ptr->level) / 26),
@@ -1222,35 +974,20 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
case RBM_CHARGE:
{
/* Disturb */
- disturb(1);
+ disturb();
/* Message */
- msg_format("%s misses %s.", sym_name, t_name);
+ msg_format("%s misses %s.", symbiote_name(true).c_str(), t_name);
break;
}
}
}
-
-
- /* Analyze "visible" monsters only */
- if (visible)
- {
- /* Count "obvious" attacks (and ones that cause damage) */
- if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
- {
- /* Count attacks of this type */
- if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
- {
- r_ptr->r_blows[ap_cnt]++;
- }
- }
- }
}
/* Blink away */
if (blinked)
{
- msg_format("You and %s flee laughing!", symbiote_name(FALSE));
+ msg_format("You and %s flee laughing!", symbiote_name(false).c_str());
teleport_player(MAX_SIGHT * 2 + 5);
}
@@ -1263,6 +1000,8 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
int x, int y)
{
+ auto const &r_info = game->edit_data.r_info;
+
monster_type *t_ptr = &m_list[m_idx];
auto tr_ptr = t_ptr->race();
@@ -1287,7 +1026,7 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
auto r_ptr = &r_info[p_ptr->body_monster];
/* Not allowed to attack */
- if (r_ptr->flags1 & RF1_NEVER_BLOW) return;
+ if (r_ptr->flags & RF_NEVER_BLOW) return;
/* Total armor */
ac = t_ptr->ac;
@@ -1310,9 +1049,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
for (ap_cnt = 0; ap_cnt < (p_ptr->num_blow > 4) ? 4 : p_ptr->num_blow;
ap_cnt++)
{
- bool_ visible = FALSE;
- bool_ obvious = FALSE;
-
int power = 0;
int damage = 0;
@@ -1336,9 +1072,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
/* break; */
}
- /* Extract visibility (before blink) */
- visible = TRUE;
-
/* Extract the attack "power" */
power = get_attack_power(effect);
@@ -1346,7 +1079,7 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
if (!effect || check_hit2(power, rlev, ac))
{
/* Always disturbing */
- disturb(1);
+ disturb();
/* Describe the attack method */
switch (method)
@@ -1525,9 +1258,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
}
- /* Hack -- assume all attacks are obvious */
- obvious = TRUE;
-
/* Roll out the damage */
damage = damroll(d_dice, d_side) + p_ptr->to_d;
@@ -1682,15 +1412,13 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
if (touched)
{
/* Aura fire */
- if ((tr_ptr->flags2 & RF2_AURA_FIRE) &&
- !(r_ptr->flags3 & RF3_IM_FIRE))
+ if ((tr_ptr->flags & RF_AURA_FIRE) &&
+ !(r_ptr->flags & RF_IM_FIRE))
{
if (t_ptr->ml)
{
blinked = FALSE;
msg_format("You are suddenly very hot!");
- if (t_ptr->ml)
- tr_ptr->r_flags2 |= RF2_AURA_FIRE;
}
project(m_idx, 0, p_ptr->py, p_ptr->px,
damroll(1 + ((t_ptr->level) / 26),
@@ -1699,15 +1427,13 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
}
/* Aura elec */
- if ((tr_ptr->flags2 & (RF2_AURA_ELEC)) &&
- !(r_ptr->flags3 & (RF3_IM_ELEC)))
+ if ((tr_ptr->flags & RF_AURA_ELEC) &&
+ !(r_ptr->flags & RF_IM_ELEC))
{
if (t_ptr->ml)
{
blinked = FALSE;
msg_format("You get zapped!");
- if (t_ptr->ml)
- tr_ptr->r_flags2 |= RF2_AURA_ELEC;
}
project(m_idx, 0, p_ptr->py, p_ptr->px,
damroll(1 + ((t_ptr->level) / 26),
@@ -1739,7 +1465,7 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
case RBM_CHARGE:
{
/* Disturb */
- disturb(1);
+ disturb();
/* Message */
msg_format("You miss %s.", t_name);
@@ -1748,21 +1474,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
}
}
}
-
-
- /* Analyze "visible" monsters only */
- if (visible)
- {
- /* Count "obvious" attacks (and ones that cause damage) */
- if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
- {
- /* Count attacks of this type */
- if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
- {
- r_ptr->r_blows[ap_cnt]++;
- }
- }
- }
}
/* Blink away */
@@ -1838,22 +1549,20 @@ void attack_special(monster_type *m_ptr, s32b special, int dam)
/* Special - Cut monster */
if (special & SPEC_CUT)
{
- /* Cut the monster */
- if (r_ptr->flags8 & (RF8_NO_CUT))
+ if (r_ptr->flags & RF_NO_CUT)
{
- if (m_ptr->ml)
- {
- r_info[m_ptr->r_idx].r_flags8 |= (RF8_NO_CUT);
- }
+ // No damage
}
else if (rand_int(100) >= r_ptr->level)
{
- /* Already partially poisoned */
- if (m_ptr->bleeding) msg_format("%^s is bleeding more strongly.",
- m_name);
- /* Was not poisoned */
+ if (m_ptr->bleeding)
+ {
+ msg_format("%^s is bleeding more strongly.", m_name);
+ }
else
+ {
msg_format("%^s is bleeding.", m_name);
+ }
m_ptr->bleeding += dam * 2;
}
@@ -1862,36 +1571,33 @@ void attack_special(monster_type *m_ptr, s32b special, int dam)
/* Special - Poison monster */
if (special & SPEC_POIS)
{
- /* Poison the monster */
- if (r_ptr->flags3 & (RF3_IM_POIS))
+ if (r_ptr->flags & RF_IM_POIS)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_IM_POIS);
- }
+ // No damage
}
- /* Notice susceptibility */
- else if (r_ptr->flags9 & (RF9_SUSCEP_POIS))
+ else if (r_ptr->flags & RF_SUSCEP_POIS)
{
- if (m_ptr->ml)
+ if (m_ptr->poisoned)
{
- r_ptr->r_flags9 |= (RF9_SUSCEP_POIS);
+ msg_format("%^s is more poisoned.", m_name);
}
- /* Already partially poisoned */
- if (m_ptr->poisoned) msg_format("%^s is more poisoned.", m_name);
- /* Was not poisoned */
else
+ {
msg_format("%^s is poisoned.", m_name);
+ }
m_ptr->poisoned += dam * 2;
}
else if (rand_int(100) >= r_ptr->level)
{
- /* Already partially poisoned */
- if (m_ptr->poisoned) msg_format("%^s is more poisoned.", m_name);
- /* Was not poisoned */
+ if (m_ptr->poisoned)
+ {
+ msg_format("%^s is more poisoned.", m_name);
+ }
else
+ {
msg_format("%^s is poisoned.", m_name);
+ }
m_ptr->poisoned += dam;
}
@@ -1929,11 +1635,11 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special)
/* Extract monster name (or "it") */
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
- if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 44;
- if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 44;
- if ((r_ptr->flags3 & RF3_UNDEAD) ||
- (r_ptr->flags3 & RF3_NONLIVING)) resist_stun += 88;
+ if (r_ptr->flags & RF_UNIQUE) resist_stun += 88;
+ if (r_ptr->flags & RF_NO_CONF) resist_stun += 44;
+ if (r_ptr->flags & RF_NO_SLEEP) resist_stun += 44;
+ if ((r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_NONLIVING)) resist_stun += 88;
if (plev)
{
@@ -1951,7 +1657,7 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special)
{
old_ptr = ma_ptr;
- if (wizard && cheat_xtra)
+ if (wizard && options->cheat_xtra)
{
msg_print("Attack re-selected.");
}
@@ -1972,11 +1678,10 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special)
/* Describe attack */
if (ma_ptr->effect & MA_KNEE)
{
- if (r_ptr->flags1 & RF1_MALE)
+ if (r_ptr->flags & RF_MALE)
{
if (!desc) msg_format("You hit %s in the groin with your knee!",
m_name);
- sound(SOUND_PAIN);
special_effect = MA_KNEE;
}
else if (!desc) msg_format(ma_ptr->desc, m_name);
@@ -1993,7 +1698,7 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special)
if (ma_ptr->effect & MA_SLOW)
{
if (!
- ((r_ptr->flags1 & RF1_NEVER_MOVE) ||
+ ((r_ptr->flags & RF_NEVER_MOVE) ||
strchr("UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
{
if (!desc) msg_format("You kick %s in the ankle.", m_name);
@@ -2035,10 +1740,10 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special)
if (((special_effect & MA_FULL_SLOW) || (special_effect & MA_SLOW)) &&
((*k + p_ptr->to_d) < m_ptr->hp))
{
- if (!(r_ptr->flags1 & RF1_UNIQUE) &&
+ if (!(r_ptr->flags & RF_UNIQUE) &&
(randint(plev) > m_ptr->level) && m_ptr->mspeed > 60)
{
- msg_format("%^s starts limping slower.", m_name);
+ msg_format("%^s starts limping.", m_name);
m_ptr->mspeed -= 10;
}
}
@@ -2064,24 +1769,25 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special)
static void do_nazgul(int *k, int *num, int num_blow, int weap, std::shared_ptr<monster_race> r_ptr,
object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
- bool_ mundane;
bool_ allow_shatter = TRUE;
/* Extract mundane-ness of the current weapon */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const f = object_flags(o_ptr);
/* It should be Slay Evil, Slay Undead, or *Slay Undead* */
- mundane = !(f1 & TR1_SLAY_EVIL) && !(f1 & TR1_SLAY_UNDEAD) &&
- !(f5 & TR5_KILL_UNDEAD);
+ bool_ const mundane =
+ !(f & TR_SLAY_EVIL) &&
+ !(f & TR_SLAY_UNDEAD) &&
+ !(f & TR_KILL_UNDEAD);
/* Some blades can resist shattering */
- if (f5 & TR5_RES_MORGUL)
+ if (f & TR_RES_MORGUL)
+ {
allow_shatter = FALSE;
+ }
/* Mega Hack -- Hitting Nazgul is REALY dangerous (ideas from Akhronath) */
- if (r_ptr->flags7 & RF7_NAZGUL)
+ if (r_ptr->flags & RF_NAZGUL)
{
if ((!o_ptr->name2) && (!artifact_p(o_ptr)) && allow_shatter)
{
@@ -2158,6 +1864,8 @@ static void do_nazgul(int *k, int *num, int num_blow, int weap, std::shared_ptr<
*/
void py_attack(int y, int x, int max_blow)
{
+ auto const &r_info = game->edit_data.r_info;
+
int num = 0, k, bonus, chance;
s32b special = 0;
@@ -2188,15 +1896,12 @@ void py_attack(int y, int x, int max_blow)
int drain_left = MAX_VAMPIRIC_DRAIN;
- /* A massive hack -- life-draining weapons */
- u32b f1, f2, f3, f4, f5, esp;
-
int weap;
/* Disturb the player */
- disturb(0);
+ disturb();
- if (r_info[p_ptr->body_monster].flags1 & RF1_NEVER_BLOW)
+ if (r_info[p_ptr->body_monster].flags & RF_NEVER_BLOW)
{
msg_print("You cannot attack in this form!");
return;
@@ -2234,21 +1939,16 @@ void py_attack(int y, int x, int max_blow)
!(p_ptr->stun || p_ptr->confused || p_ptr->image ||
!(m_ptr->ml)))
{
- if (!(p_ptr->inventory[INVEN_WIELD].art_name))
+ // Only 'Stormbringer' can hit friendlies unless player forces attack.
+ if (p_ptr->inventory[INVEN_WIELD].artifact_name == "'Stormbringer'")
{
- msg_format("You stop to avoid hitting %s.", m_name);
- return;
+ msg_format("Your black blade greedily attacks %s!", m_name);
}
-
- if (!
- (streq
- (quark_str(p_ptr->inventory[INVEN_WIELD].art_name), "'Stormbringer'")))
+ else
{
msg_format("You stop to avoid hitting %s.", m_name);
return;
}
-
- msg_format("Your black blade greedily attacks %s!", m_name);
}
/* Break goi/manashield */
@@ -2309,9 +2009,9 @@ void py_attack(int y, int x, int max_blow)
bonus = p_ptr->to_h + p_ptr->to_h_melee + o_ptr->to_h;
chance = p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
- if (!(f4 & TR4_NEVER_BLOW))
+ if (!(flags & TR_NEVER_BLOW))
{
int num_blow = p_ptr->num_blow;
@@ -2325,14 +2025,11 @@ void py_attack(int y, int x, int max_blow)
/* Test for hit */
if (test_hit_norm(chance, m_ptr->ac, m_ptr->ml))
{
- /* Sound */
- sound(SOUND_HIT);
-
/* Hack -- bare hands do one damage */
k = 1;
/* Select a chaotic effect (50% chance) */
- if ((f1 & TR1_CHAOTIC) && (rand_int(2) == 0))
+ if ((flags & TR_CHAOTIC) && (rand_int(2) == 0))
{
if (randint(5) < 3)
{
@@ -2362,17 +2059,17 @@ void py_attack(int y, int x, int max_blow)
}
/* Vampiric drain */
- if ((f1 & TR1_VAMPIRIC) || (chaos_effect == 1))
+ if ((flags & TR_VAMPIRIC) || (chaos_effect == 1))
{
if (!
- ((r_ptr->flags3 & RF3_UNDEAD) ||
- (r_ptr->flags3 & RF3_NONLIVING)))
+ ((r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_NONLIVING)))
drain_result = m_ptr->hp;
else
drain_result = 0;
}
- if (f1 & TR1_VORPAL && (randint(6) == 1))
+ if ((flags & TR_VORPAL) && (randint(6) == 1))
vorpal_cut = TRUE;
else
vorpal_cut = FALSE;
@@ -2411,7 +2108,7 @@ void py_attack(int y, int x, int max_blow)
/* Stunning blow */
if (magik(get_skill(SKILL_STUN)) && (o_ptr->tval == TV_HAFTED) && (o_ptr->weight > 50) && done_crit)
{
- if (!(r_ptr->flags4 & (RF4_BR_SOUN)) && !(r_ptr->flags4 & (RF4_BR_WALL)) && k)
+ if (!(r_ptr->spells & SF_BR_SOUN) && !(r_ptr->spells & SF_BR_WALL) && k)
{
int tmp;
@@ -2474,7 +2171,7 @@ void py_attack(int y, int x, int max_blow)
/* Melkor can cast curse for you*/
if (praying_to(GOD_MELKOR))
{
- int lv = get_level(MELKOR_CURSE, 100, 1);
+ int lv = get_level_s(MELKOR_CURSE, 100);
if (lv >= 10)
{
@@ -2489,7 +2186,7 @@ void py_attack(int y, int x, int max_blow)
}
/* May it clone the monster ? */
- if ((f4 & TR4_CLONE) && magik(30))
+ if ((flags & TR_CLONE) && magik(30))
{
msg_format("Oh no! Your weapon clones %^s!",
m_name);
@@ -2556,7 +2253,7 @@ void py_attack(int y, int x, int max_blow)
/* Hack -- High-level warriors can spread their attacks out
* among weaker foes.
*/
- if ((has_ability(AB_SPREAD_BLOWS)) && (num < num_blow) &&
+ if ((p_ptr->has_ability(AB_SPREAD_BLOWS)) && (num < num_blow) &&
(energy_use))
{
energy_use = energy_use * num / num_blow;
@@ -2590,7 +2287,7 @@ void py_attack(int y, int x, int max_blow)
{
drain_heal = damroll(4, (drain_result / 6));
- if (cheat_xtra)
+ if (options->cheat_xtra)
{
msg_format("Draining left: %d", drain_left);
}
@@ -2632,13 +2329,8 @@ void py_attack(int y, int x, int max_blow)
}
/* Confuse the monster */
- if (r_ptr->flags3 & (RF3_NO_CONF))
+ if (r_ptr->flags & RF_NO_CONF)
{
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
msg_format("%^s is unaffected.", m_name);
}
else if (rand_int(100) < m_ptr->level)
@@ -2663,8 +2355,8 @@ void py_attack(int y, int x, int max_blow)
else if ((chaos_effect == 5) && cave_floor_bold(y, x) &&
(randint(90) > m_ptr->level))
{
- if (!((r_ptr->flags1 & RF1_UNIQUE) ||
- (r_ptr->flags4 & RF4_BR_CHAO) ||
+ if (!((r_ptr->flags & RF_UNIQUE) ||
+ (r_ptr->spells & SF_BR_CHAO) ||
(m_ptr->mflag & MFLAG_QUEST)))
{
/* Handle polymorph */
@@ -2699,9 +2391,6 @@ void py_attack(int y, int x, int max_blow)
/* Player misses */
else
{
- /* Sound */
- sound(SOUND_MISS);
-
backstab = FALSE; /* Clumsy! */
/* Message */
@@ -2723,9 +2412,6 @@ void py_attack(int y, int x, int max_blow)
/* Hack -- delay fear messages */
if (fear && m_ptr->ml)
{
- /* Sound */
- sound(SOUND_FLEE);
-
/* Message */
msg_format("%^s flees in terror!", m_name);
}
@@ -2743,13 +2429,16 @@ void py_attack(int y, int x, int max_blow)
bool_ player_can_enter(byte feature)
{
+ auto const &r_info = game->edit_data.r_info;
+ auto const &f_info = game->edit_data.f_info;
+
bool_ pass_wall;
bool_ only_wall = FALSE;
/* Player can not walk through "walls" unless in Shadow Form */
- if (p_ptr->wraith_form || (race_flags1_p(PR1_SEMI_WRAITH)))
+ if (p_ptr->wraith_form || (race_flags_p(PR_SEMI_WRAITH)))
pass_wall = TRUE;
else
pass_wall = FALSE;
@@ -2785,30 +2474,30 @@ bool_ player_can_enter(byte feature)
{
if (p_ptr->fly ||
pass_wall ||
- (has_ability(AB_TREE_WALK)) ||
+ p_ptr->has_ability(AB_TREE_WALK) ||
(p_ptr->mimic_form == resolve_mimic_name("Ent")) ||
((p_ptr->grace >= 9000) && praying_to(GOD_YAVANNA)))
return (TRUE);
}
- if ((p_ptr->climb) && (f_info[feature].flags1 & FF1_CAN_CLIMB))
+ if ((p_ptr->climb) && (f_info[feature].flags & FF_CAN_CLIMB))
return (TRUE);
if ((p_ptr->fly) &&
- ((f_info[feature].flags1 & FF1_CAN_FLY) ||
- (f_info[feature].flags1 & FF1_CAN_LEVITATE)))
+ ((f_info[feature].flags & FF_CAN_FLY) ||
+ (f_info[feature].flags & FF_CAN_LEVITATE)))
return (TRUE);
- else if (only_wall && (f_info[feature].flags1 & FF1_FLOOR))
+ else if (only_wall && (f_info[feature].flags & FF_FLOOR))
return (FALSE);
else if ((p_ptr->ffall) &&
- (f_info[feature].flags1 & FF1_CAN_LEVITATE))
+ (f_info[feature].flags & FF_CAN_LEVITATE))
return (TRUE);
else if ((pass_wall || only_wall) &&
- (f_info[feature].flags1 & FF1_CAN_PASS))
+ (f_info[feature].flags & FF_CAN_PASS))
return (TRUE);
- else if (f_info[feature].flags1 & FF1_NO_WALK)
+ else if (f_info[feature].flags & FF_NO_WALK)
return (FALSE);
- else if ((f_info[feature].flags1 & FF1_WEB) &&
- ((!(r_info[p_ptr->body_monster].flags7 & RF7_SPIDER)) && (p_ptr->mimic_form != resolve_mimic_name("Spider"))))
+ else if ((f_info[feature].flags & FF_WEB) &&
+ ((!(r_info[p_ptr->body_monster].flags & RF_SPIDER)) && (p_ptr->mimic_form != resolve_mimic_name("Spider"))))
return (FALSE);
return (TRUE);
@@ -2827,14 +2516,16 @@ bool_ player_can_enter(byte feature)
static bool_ easy_open_door(int y, int x)
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, j;
cave_type *c_ptr = &cave[y][x];
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR))
{
msg_print("You cannot open doors.");
@@ -2859,7 +2550,7 @@ static bool_ easy_open_door(int y, int x)
else if (c_ptr->feat >= FEAT_DOOR_HEAD + 0x01)
{
/* Disarm factor */
- i = p_ptr->skill_dis;
+ i = 100;
/* Penalize some conditions */
if (p_ptr->blind || no_lite()) i = i / 10;
@@ -2880,18 +2571,12 @@ static bool_ easy_open_door(int y, int x)
/* Message */
msg_print("You have picked the lock.");
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
-
/* Open the door */
cave_set_feat(y, x, FEAT_OPEN);
/* Update some things */
p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE);
- /* Sound */
- sound(SOUND_OPENDOOR);
-
/* Experience */
gain_exp(1);
}
@@ -2900,7 +2585,7 @@ static bool_ easy_open_door(int y, int x)
else
{
/* Failure */
- if (flush_failure) flush();
+ flush_on_failure();
/* Message */
msg_print("You failed to pick the lock.");
@@ -2910,17 +2595,11 @@ static bool_ easy_open_door(int y, int x)
/* Closed door */
else
{
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
-
/* Open the door */
cave_set_feat(y, x, FEAT_OPEN);
/* Update some things */
p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE);
-
- /* Sound */
- sound(SOUND_OPENDOOR);
}
/* Result */
@@ -2936,43 +2615,43 @@ static bool_ easy_open_door(int y, int x)
* any monster which might be in the destination grid. Previously,
* moving into walls was "free" and did NOT hit invisible monsters.
*/
-void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
+void move_player_aux(int dir, int do_pickup, int run)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &f_info = game->edit_data.f_info;
+
int y, x, tmp;
cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px];
monster_type *m_ptr;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
char m_name[80];
- bool_ stormbringer = FALSE;
-
- bool_ old_dtrap, new_dtrap;
-
bool_ oktomove = TRUE;
/* Hack - random movement */
if (p_ptr->disembodied)
tmp = dir;
- else if ((r_ptr->flags1 & RF1_RAND_25) && (r_ptr->flags1 & RF1_RAND_50))
+ else if ((r_ptr->flags & RF_RAND_25) && (r_ptr->flags & RF_RAND_50))
{
if (randint(100) < 75)
tmp = randint(9);
else
tmp = dir;
}
- else if (r_ptr->flags1 & RF1_RAND_50)
+ else if (r_ptr->flags & RF_RAND_50)
{
if (randint(100) < 50)
tmp = randint(9);
else
tmp = dir;
}
- else if (r_ptr->flags1 & RF1_RAND_25)
+ else if (r_ptr->flags & RF_RAND_25)
{
if (randint(100) < 25)
tmp = randint(9);
@@ -3118,12 +2797,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
m_ptr = &m_list[c_ptr->m_idx];
auto const mr_ptr = m_ptr->race();
- if (p_ptr->inventory[INVEN_WIELD].art_name)
- {
- if (streq(quark_str(p_ptr->inventory[INVEN_WIELD].art_name), "'Stormbringer'"))
- stormbringer = TRUE;
- }
-
/* Hack -- attack monsters */
if (c_ptr->m_idx && (m_ptr->ml || player_can_enter(c_ptr->feat)))
{
@@ -3144,13 +2817,16 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
/* Track a new monster */
if (m_ptr->ml) health_track(c_ptr->m_idx);
+ /* Is it Stormbringer? */
+ bool stormbringer = p_ptr->inventory[INVEN_WIELD].artifact_name == "'Stormbringer'";
+
/* displace? */
if (stormbringer && (randint(1000) > 666))
{
py_attack(y, x, -1);
}
else if (cave_floor_bold(p_ptr->py, p_ptr->px) ||
- (mr_ptr->flags2 & RF2_PASS_WALL))
+ (mr_ptr->flags & RF_PASS_WALL))
{
msg_format("You push past %s.", m_name);
m_ptr->fy = p_ptr->py;
@@ -3182,21 +2858,13 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
oktomove = FALSE;
}
- /* Don't step on known traps. */
- else if (disarm && (c_ptr->info & (CAVE_TRDT)) && !(p_ptr->confused || p_ptr->stun || p_ptr->image))
- {
- msg_print("You stop to avoid triggering the trap.");
- energy_use = 0;
- oktomove = FALSE;
- }
-
/* Player can't enter ? soo bad for him/her ... */
else if (!player_can_enter(c_ptr->feat))
{
oktomove = FALSE;
/* Disturb the player */
- disturb(0);
+ disturb();
if (p_ptr->prob_travel)
{
@@ -3225,11 +2893,10 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
/* Wall (or secret door) */
else
{
- int feat;
-
- if (c_ptr->mimic) feat = c_ptr->mimic;
- else
- feat = f_info[c_ptr->feat].mimic;
+ int const feat = c_ptr->mimic
+ ? c_ptr->mimic
+ : f_info[c_ptr->feat].mimic
+ ;
msg_format("You feel %s.", f_info[feat].block);
c_ptr->info |= (CAVE_MARK);
@@ -3274,40 +2941,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
energy_use = 0;
}
}
-
- /* Sound */
- sound(SOUND_HITWALL);
- }
-
- /*
- * Check trap detection status -- retrieve them here
- * because they are used by the movement code as well
- */
- old_dtrap = ((cave[p_ptr->py][p_ptr->px].info & CAVE_DETECT) != 0);
- new_dtrap = ((cave[y][x].info & CAVE_DETECT) != 0);
-
- /* Normal movement */
- if (oktomove && running && disturb_detect)
- {
- /*
- * Disturb the player when about to leave the trap detected
- * area
- */
- if (old_dtrap && !new_dtrap)
- {
- /* Disturb player */
- disturb(0);
-
- /* but don't take a turn */
- energy_use = 0;
-
- /* Tell player why */
- cmsg_print(TERM_VIOLET, "You are about to leave a trap detected zone.");
- /* Flush */
- /* msg_print(NULL); */
-
- oktomove = FALSE;
- }
}
/* Normal movement */
@@ -3343,20 +2976,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
/* Check for new panel (redraw map) */
verify_panel();
- /* Check detection status */
- if (old_dtrap && !new_dtrap)
- {
- cmsg_print(TERM_VIOLET, "You leave a trap detected zone.");
- if (running) msg_print(NULL);
- p_ptr->redraw |= (PR_FRAME);
- }
- else if (!old_dtrap && new_dtrap)
- {
- cmsg_print(TERM_L_BLUE, "You enter a trap detected zone.");
- if (running) msg_print(NULL);
- p_ptr->redraw |= (PR_FRAME);
- }
-
/* Update stuff */
p_ptr->update |= (PU_VIEW | PU_FLOW | PU_MON_LITE);
@@ -3372,7 +2991,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
/* Mega-hack for dungeon branches */
if ((feat == FEAT_MORE) && c_ptr->special)
{
- msg_format("There is %s", d_info[c_ptr->special].text);
+ msg_format("There is %s", d_info[c_ptr->special].text.c_str());
}
else
{
@@ -3383,18 +3002,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
if (running) msg_print(NULL);
}
- /* Spontaneous Searching */
- if ((p_ptr->skill_fos >= 50) || (0 == rand_int(50 - p_ptr->skill_fos)))
- {
- search();
- }
-
- /* Continuous Searching */
- if (p_ptr->searching)
- {
- search();
- }
-
/* Handle "objects" */
carry(do_pickup);
@@ -3402,7 +3009,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
if (c_ptr->feat == FEAT_SHOP)
{
/* Disturb */
- disturb(0);
+ disturb();
/* Hack -- Enter store */
command_new = '_';
@@ -3420,31 +3027,11 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
if (running) msg_print(NULL);
}
- /* Discover invisible traps */
- else if ((c_ptr->t_idx != 0) &&
- !(f_info[cave[y][x].feat].flags1 & FF1_DOOR))
- {
- /* Disturb */
- disturb(0);
-
- if (!(c_ptr->info & (CAVE_TRDT)))
- {
- /* Message */
- msg_print("You found a trap!");
-
- /* Pick a trap */
- pick_trap(p_ptr->py, p_ptr->px);
- }
-
- /* Hit the trap */
- hit_trap();
- }
-
/* Execute the inscription */
else if (c_ptr->inscription)
{
/* Disturb */
- disturb(0);
+ disturb();
msg_format("There is an inscription here: %s",
inscription_info[c_ptr->inscription].text);
@@ -3468,9 +3055,9 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
}
}
-void move_player(int dir, int do_pickup, bool_ disarm)
+void move_player(int dir, int do_pickup)
{
- move_player_aux(dir, do_pickup, 0, disarm);
+ move_player_aux(dir, do_pickup, 0);
}
@@ -3479,13 +3066,7 @@ void move_player(int dir, int do_pickup, bool_ disarm)
*/
static int see_obstacle_grid(cave_type *c_ptr)
{
- /*
- * Hack -- Avoid hitting detected traps, because we cannot rely on
- * the CAVE_MARK check below, and traps can be set to nearly
- * everything the player can move on to XXX XXX XXX
- */
- if (c_ptr->info & (CAVE_TRDT)) return (TRUE);
-
+ auto const &f_info = game->edit_data.f_info;
/* Hack -- Handle special cases XXX XXX */
switch (c_ptr->feat)
@@ -3508,7 +3089,7 @@ static int see_obstacle_grid(cave_type *c_ptr)
/* "Safe" floor grids aren't obstacles */
- if (f_info[c_ptr->feat].flags1 & FF1_CAN_RUN) return (FALSE);
+ if (f_info[c_ptr->feat].flags & FF_CAN_RUN) return (FALSE);
/* Must be known to the player */
if (!(c_ptr->info & (CAVE_MARK))) return (FALSE);
@@ -3836,8 +3417,10 @@ static void run_init(int dir)
*
* Return TRUE if the running should be stopped
*/
-static bool_ run_test(void)
+static bool_ run_test()
{
+ auto const &f_info = game->edit_data.f_info;
+
int prev_dir, new_dir, check_dir = 0;
int row, col;
@@ -3927,7 +3510,7 @@ static bool_ run_test(void)
case FEAT_BROKEN:
{
/* Option -- ignore */
- if (find_ignore_doors) notice = FALSE;
+ if (options->find_ignore_doors) notice = FALSE;
/* Done */
break;
@@ -3953,7 +3536,7 @@ static bool_ run_test(void)
case FEAT_BETWEEN2:
{
/* Option -- ignore */
- if (find_ignore_stairs) notice = FALSE;
+ if (options->find_ignore_stairs) notice = FALSE;
/* Done */
break;
@@ -3961,14 +3544,11 @@ static bool_ run_test(void)
}
/* Check the "don't notice running" flag */
- if (f_info[c_ptr->feat].flags1 & FF1_DONT_NOTICE_RUNNING)
+ if (f_info[c_ptr->feat].flags & FF_DONT_NOTICE_RUNNING)
{
notice = FALSE;
}
- /* A detected trap is interesting */
- if (c_ptr->info & (CAVE_TRDT)) notice = TRUE;
-
/* Interesting feature */
if (notice) return (TRUE);
@@ -3976,9 +3556,6 @@ static bool_ run_test(void)
inv = FALSE;
}
- /* Mega-Hack -- Maze code removes CAVE_MARK XXX XXX XXX */
- if (c_ptr->info & (CAVE_TRDT)) return (TRUE);
-
/* Analyze unknown grids and floors */
if (inv || cave_floor_bold(row, col))
{
@@ -4132,7 +3709,7 @@ static bool_ run_test(void)
}
/* Two options, examining corners */
- else if (find_examine && !find_cut)
+ else if (options->find_examine && !options->find_cut)
{
/* Primary option */
find_current = option;
@@ -4154,7 +3731,7 @@ static bool_ run_test(void)
{
/* Can not see anything ahead and in the direction we */
/* are turning, assume that it is a potential corner. */
- if (find_examine &&
+ if (options->find_examine &&
see_nothing(option, row, col) &&
see_nothing(option2, row, col))
{
@@ -4170,7 +3747,7 @@ static bool_ run_test(void)
}
/* This corner is seen to be enclosed; we cut the corner. */
- else if (find_cut)
+ else if (options->find_cut)
{
find_current = option2;
find_prevdir = option2;
@@ -4216,7 +3793,7 @@ void run_step(int dir)
msg_print("You cannot run in that direction.");
/* Disturb */
- disturb(0);
+ disturb();
/* Done */
return;
@@ -4236,7 +3813,7 @@ void run_step(int dir)
if (run_test())
{
/* Disturb */
- disturb(0);
+ disturb();
/* Done */
return;
@@ -4251,15 +3828,17 @@ void run_step(int dir)
/* Move the player, using the "pickup" flag */
- move_player_aux(find_current, always_pickup, 1, TRUE);
+ move_player_aux(find_current, options->always_pickup, 1);
}
/*
* Issue a pet command
*/
-void do_cmd_pet(void)
+void do_cmd_pet()
{
+ auto const &r_info = game->edit_data.r_info;
+
int i = 0;
int num = 0;
@@ -4520,13 +4099,11 @@ void do_cmd_pet(void)
/* Process the monsters (backwards) */
for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
{
- monster_race *r_ptr;
-
/* Access the monster */
m_ptr = &m_list[pet_ctr];
- r_ptr = &r_info[m_ptr->r_idx];
+ auto r_ptr = &r_info[m_ptr->r_idx];
- if ((!(r_ptr->flags7 & RF7_NO_DEATH)) && ((m_ptr->status == MSTATUS_PET) || (m_ptr->status == MSTATUS_FRIEND))) /* Get rid of it! */
+ if ((!(r_ptr->flags & RF_NO_DEATH)) && ((m_ptr->status == MSTATUS_PET) || (m_ptr->status == MSTATUS_FRIEND))) /* Get rid of it! */
{
bool_ checked = FALSE;
char command;
@@ -4589,13 +4166,11 @@ void do_cmd_pet(void)
/* Process the monsters (backwards) */
for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
{
- monster_race *r_ptr;
-
/* Access the monster */
m_ptr = &m_list[pet_ctr];
- r_ptr = &r_info[m_ptr->r_idx];
+ auto r_ptr = &r_info[m_ptr->r_idx];
- if ((!(r_ptr->flags7 & RF7_NO_DEATH)) && ((m_ptr->status == MSTATUS_COMPANION))) /* Get rid of it! */
+ if ((!(r_ptr->flags & RF_NO_DEATH)) && ((m_ptr->status == MSTATUS_COMPANION))) /* Get rid of it! */
{
bool_ delete_this = FALSE;
@@ -4720,9 +4295,11 @@ void do_cmd_integrate_body()
*/
bool_ do_cmd_leave_body(bool_ drop_body)
{
+ auto const &r_info = game->edit_data.r_info;
+
object_type *o_ptr, forge;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
int i;
@@ -4759,7 +4336,7 @@ bool_ do_cmd_leave_body(bool_ drop_body)
o_ptr->ident |= IDENT_STOREB;
/* Unique corpses are unique */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
o_ptr->name1 = 201;
}
@@ -4855,13 +4432,13 @@ bool_ execute_inscription(byte i, byte y, byte x)
monster_type *m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags7 & RF7_CAN_FLY)
+ if (r_ptr->flags & RF_CAN_FLY)
{
msg_print("The monster simply flies over the chasm.");
}
else
{
- if (!(r_ptr->flags1 & RF1_UNIQUE))
+ if (!(r_ptr->flags & RF_UNIQUE))
{
msg_print("The monster falls in the chasm!");
delete_monster_idx(c_ptr->m_idx);
@@ -4953,13 +4530,14 @@ void do_cmd_engrave()
{
if (!strcmp(inscription_info[i].text, buf))
{
- if (inscription_info[i].know)
+ if (p_ptr->inscriptions[i])
{
- /* Save the inscription */
cave[p_ptr->py][p_ptr->px].inscription = i;
}
else
+ {
msg_print("You can't use this inscription for now.");
+ }
}
}
diff --git a/src/cmd1.hpp b/src/cmd1.hpp
index 3ae44ed2..19b40ebf 100644
--- a/src/cmd1.hpp
+++ b/src/cmd1.hpp
@@ -4,22 +4,22 @@
#include "monster_type_fwd.hpp"
#include "object_type_fwd.hpp"
-extern void attack_special(monster_type *m_ptr, s32b special, int dam);
-extern bool_ test_hit_fire(int chance, int ac, int vis);
-extern bool_ test_hit_norm(int chance, int ac, int vis);
-extern s16b critical_shot(int weight, int plus, int dam, int skill);
-extern s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool_ *done_crit);
-extern s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, s32b *special);
-extern void search(void);
-extern void carry(int pickup);
-extern void py_attack(int y, int x, int max_blow);
-extern bool_ player_can_enter(byte feature);
-extern void move_player(int dir, int do_pickup, bool_ disarm);
-extern void move_player_aux(int dir, int do_pickup, int run, bool_ disarm);
-extern void run_step(int dir);
-extern void do_cmd_pet(void);
-extern void do_cmd_integrate_body();
-extern bool_ do_cmd_leave_body(bool_ drop_body);
-extern bool_ execute_inscription(byte i, byte y, byte x);
-extern void do_cmd_engrave(void);
-extern void do_spin(void);
+void attack_special(monster_type *m_ptr, s32b special, int dam);
+bool_ test_hit_fire(int chance, int ac, int vis);
+bool_ test_hit_norm(int chance, int ac, int vis);
+s16b critical_shot(int weight, int plus, int dam, int skill);
+s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool_ *done_crit);
+s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, s32b *special);
+void search();
+void carry(int pickup);
+void py_attack(int y, int x, int max_blow);
+bool_ player_can_enter(byte feature);
+void move_player(int dir, int do_pickup);
+void move_player_aux(int dir, int do_pickup, int run);
+void run_step(int dir);
+void do_cmd_pet();
+void do_cmd_integrate_body();
+bool_ do_cmd_leave_body(bool_ drop_body);
+bool_ execute_inscription(byte i, byte y, byte x);
+void do_cmd_engrave();
+void do_spin();
diff --git a/src/cmd2.cc b/src/cmd2.cc
index cfdeab44..a348c221 100644
--- a/src/cmd2.cc
+++ b/src/cmd2.cc
@@ -13,8 +13,11 @@
#include "cave_type.hpp"
#include "cmd1.hpp"
#include "dungeon_info_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "hook_chat_in.hpp"
#include "hook_enter_dungeon_in.hpp"
@@ -26,11 +29,14 @@
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "options.hpp"
+#include "player_race_flag.hpp"
#include "player_type.hpp"
#include "skills.hpp"
#include "spells1.hpp"
@@ -38,8 +44,6 @@
#include "spells3.hpp"
#include "stats.hpp"
#include "tables.hpp"
-#include "trap_type.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -56,7 +60,7 @@
using std::this_thread::sleep_for;
using std::chrono::milliseconds;
-void do_cmd_immovable_special(void);
+void do_cmd_immovable_special();
/*
* Try to bash an altar
@@ -73,14 +77,16 @@ static bool_ do_cmd_bash_altar(int y, int x)
*/
static bool_ do_cmd_bash_fountain(int y, int x)
{
+ auto const &r_info = game->edit_data.r_info;
+
int bash, temp;
bool_ more = TRUE;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_BASH_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR))
{
msg_print("You cannot do that.");
@@ -129,19 +135,44 @@ static bool_ stair_hooks(stairs_direction direction)
return (!out.allow);
}
+/*
+ * Ask for confirmation before leaving level; based
+ * on whether the 'confirm_stairs' option is set.
+ */
+static bool ask_leave()
+{
+ if (options->confirm_stairs)
+ {
+ if (get_check("Really leave the level? "))
+ {
+ return true; // Leave
+ }
+ else
+ {
+ return false; // Don't leave
+ }
+ }
+ else
+ {
+ return true; // Leave
+ }
+}
+
/*
* Go up one level
*/
-void do_cmd_go_up(void)
+void do_cmd_go_up()
{
+ auto const &d_info = game->edit_data.d_info;
+
bool_ go_up = FALSE, go_up_many = FALSE, prob_traveling = FALSE;
cave_type *c_ptr;
int oldl = dun_level;
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto d_ptr = &d_info[dungeon_type];
/* Player grid */
@@ -160,15 +191,11 @@ void do_cmd_go_up(void)
{
go_up = TRUE;
}
- else if ((dungeon_flags2 & DF2_ASK_LEAVE))
+ else if (dungeon_flags & DF_ASK_LEAVE)
{
go_up = get_check("Leave this unique level forever? ");
}
- else if (confirm_stairs)
- {
- go_up = get_check("Really leave the level? ");
- }
- else
+ else if (ask_leave())
{
go_up = TRUE;
}
@@ -181,15 +208,11 @@ void do_cmd_go_up(void)
{
go_up = TRUE;
}
- else if ((dungeon_flags2 & DF2_ASK_LEAVE))
+ else if (dungeon_flags & DF_ASK_LEAVE)
{
go_up = get_check("Leave this unique level forever? ");
}
- else if (confirm_stairs)
- {
- go_up_many = get_check("Really leave the level? ");
- }
- else
+ else if (ask_leave())
{
go_up_many = TRUE;
}
@@ -200,7 +223,7 @@ void do_cmd_go_up(void)
{
leaving_quest = p_ptr->inside_quest;
- if ((dungeon_flags2 & DF2_ASK_LEAVE) &&
+ if ((dungeon_flags & DF_ASK_LEAVE) &&
!get_check("Leave this unique level forever? "))
return;
@@ -214,12 +237,12 @@ void do_cmd_go_up(void)
}
/* Exits to previous area in flat terrains */
- else if (!(dungeon_flags1 & DF1_FLAT) &&
+ else if (!(dungeon_flags & DF_FLAT) &&
p_ptr->prob_travel && !p_ptr->inside_quest)
{
if (d_ptr->mindepth == dun_level) return;
- if (dungeon_flags2 & DF2_NO_EASY_MOVE)
+ if (dungeon_flags & DF_NO_EASY_MOVE)
{
msg_print("Some powerful force prevents your from teleporting.");
return;
@@ -227,12 +250,7 @@ void do_cmd_go_up(void)
prob_traveling = TRUE;
- if (confirm_stairs)
- {
- if (get_check("Really leave the level? "))
- go_up = TRUE;
- }
- else
+ if (ask_leave())
{
go_up = TRUE;
}
@@ -296,7 +314,7 @@ void do_cmd_go_up(void)
/*
* Returns TRUE if we are in the Between...
*/
-static bool_ between_effect(void)
+static bool_ between_effect()
{
byte bx, by;
@@ -340,19 +358,19 @@ static bool_ between_effect(void)
/*
* Go down one level
*/
-void do_cmd_go_down(void)
+void do_cmd_go_down()
{
+ auto const &d_info = game->edit_data.d_info;
+
cave_type *c_ptr;
bool_ go_down = FALSE, go_down_many = FALSE, prob_traveling = FALSE;
- bool_ fall_trap = FALSE;
-
char i;
int old_dun = dun_level;
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto d_ptr = &d_info[dungeon_type];
/* MUST be actived now */
@@ -363,10 +381,8 @@ void do_cmd_go_down(void)
if (p_ptr->astral && (dun_level == 98)) return;
- if (c_ptr->t_idx == TRAP_OF_SINKING) fall_trap = TRUE;
-
/* test if on special level */
- if ((dungeon_flags2 & DF2_ASK_LEAVE))
+ if (dungeon_flags & DF_ASK_LEAVE)
{
prt("Leave this unique level forever (y/n) ? ", 0, 0);
flush();
@@ -394,12 +410,7 @@ void do_cmd_go_down(void)
}
else
{
- if (confirm_stairs)
- {
- if (get_check("Really leave the level? "))
- go_down_many = TRUE;
- }
- else
+ if (ask_leave())
{
go_down_many = TRUE;
}
@@ -423,12 +434,7 @@ void do_cmd_go_down(void)
}
else
{
- if (confirm_stairs)
- {
- if (get_check("Really leave the level? "))
- go_down = TRUE;
- }
- else
+ if (ask_leave())
{
go_down = TRUE;
}
@@ -444,31 +450,26 @@ void do_cmd_go_down(void)
return;
}
- else if (!(dungeon_flags1 & DF1_FLAT) &&
+ else if (!(dungeon_flags & DF_FLAT) &&
p_ptr->prob_travel && !p_ptr->inside_quest)
{
if (d_ptr->maxdepth == dun_level) return;
- if (dungeon_flags2 & DF2_NO_EASY_MOVE)
+ if (dungeon_flags & DF_NO_EASY_MOVE)
{
- msg_print("Some powerfull force prevents your from teleporting.");
+ msg_print("Some powerful force prevents your from teleporting.");
return;
}
prob_traveling = TRUE;
- if (confirm_stairs)
- {
- if (get_check("Really leave the level? "))
- go_down = TRUE;
- }
- else
+ if (ask_leave())
{
go_down = TRUE;
}
}
- else if (!(fall_trap))
+ else
{
msg_print("I see no down staircase here.");
return;
@@ -478,15 +479,10 @@ void do_cmd_go_down(void)
{
energy_use = 0;
- if (fall_trap)
- msg_print("You deliberately jump through the trap door.");
+ if (c_ptr->feat == FEAT_WAY_MORE)
+ msg_print("You enter the next area.");
else
- {
- if (c_ptr->feat == FEAT_WAY_MORE)
- msg_print("You enter the next area.");
- else
- msg_print("You enter a maze of down staircases.");
- }
+ msg_print("You enter a maze of down staircases.");
autosave_checkpoint();
@@ -512,7 +508,7 @@ void do_cmd_go_down(void)
{
if (d_info[c_ptr->special].min_plev <= p_ptr->lev)
{
- dungeon_info_type *d_ptr = &d_info[c_ptr->special];
+ auto d_ptr = &d_info[c_ptr->special];
/* Do the lua scripts refuse ? ;) */
{
@@ -543,7 +539,7 @@ void do_cmd_go_down(void)
dun_level = d_ptr->mindepth;
}
- msg_format("You go into %s", d_info[dungeon_type].text);
+ msg_format("You go into %s", d_info[dungeon_type].text.c_str());
}
else
{
@@ -556,58 +552,9 @@ void do_cmd_go_down(void)
/* Leaving */
p_ptr->leaving = TRUE;
-
- if (!fall_trap)
- {
- /* Create a way back */
- if (go_down_many)
- create_up_shaft = TRUE;
- else
- create_up_stair = TRUE;
- }
}
}
-
-
-/*
- * Simple command to "search" for one turn
- */
-void do_cmd_search(void)
-{
- /* Allow repeated command */
- if (command_arg)
- {
- /* Set repeat count */
- command_rep = command_arg - 1;
-
- /* Redraw the state */
- p_ptr->redraw |= (PR_FRAME);
-
- /* Cancel the arg */
- command_arg = 0;
- }
-
- /* Take a turn */
- energy_use = 100;
-
- /* Search */
- search();
-}
-
-
-/*
- * Hack -- toggle search mode
- */
-void do_cmd_toggle_search(void)
-{
- p_ptr->update |= (PU_BONUS);
- p_ptr->redraw |= (PR_FRAME);
- p_ptr->searching = !p_ptr->searching;
-}
-
-
-
/*
* Determine if a grid contains a chest
*/
@@ -648,6 +595,8 @@ static s16b chest_check(int y, int x)
*/
static void chest_death(int y, int x, s16b o_idx)
{
+ auto const &d_info = game->edit_data.d_info;
+
int number;
bool_ small;
@@ -717,41 +666,6 @@ static void chest_death(int y, int x, s16b o_idx)
/*
- * Chests have traps too.
- *
- * Exploding chest destroys contents (and traps).
- * Note that the chest itself is never destroyed.
- */
-static void chest_trap(int y, int x, s16b o_idx)
-{
- int trap;
-
- object_type *o_ptr = &o_list[o_idx];
-
- bool_ ident = FALSE;
-
-
- /* Ignore disarmed chests */
- if (o_ptr->pval <= 0) return;
-
- /* Obtain the trap */
- trap = o_ptr->pval;
-
- /* Message */
- msg_print("You found a trap!");
-
- /* Set off trap */
- ident = player_activate_trap_type(y, x, o_ptr, o_idx);
- if (ident)
- {
- t_info[o_ptr->pval].ident = TRUE;
- msg_format("You identified the trap as %s.",
- t_info[trap].name);
- }
-}
-
-
-/*
* Attempt to open the given chest at the given location
*
* Assume there is no monster blocking the destination
@@ -760,6 +674,8 @@ static void chest_trap(int y, int x, s16b o_idx)
*/
static bool_ do_cmd_open_chest(int y, int x, s16b o_idx)
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, j;
bool_ flag = TRUE;
@@ -768,10 +684,10 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx)
object_type *o_ptr = &o_list[o_idx];
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR))
{
msg_print("You cannot open chests.");
@@ -788,7 +704,7 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx)
flag = FALSE;
/* Get the "disarm" factor */
- i = p_ptr->skill_dis;
+ i = 100;
/* Penalize some conditions */
if (p_ptr->blind || no_lite()) i = i / 10;
@@ -814,7 +730,7 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx)
/* We may continue repeating */
more = TRUE;
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("You failed to pick the lock.");
}
@@ -823,9 +739,6 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx)
/* Allowed to open */
if (flag)
{
- /* Apply chest traps, if any */
- chest_trap(y, x, o_idx);
-
/* Let the Chest drop items */
chest_death(y, x, o_idx);
}
@@ -862,16 +775,6 @@ static bool_ is_closed(cave_type *c_ptr)
return ((feat >= FEAT_DOOR_HEAD) && (feat <= FEAT_DOOR_TAIL));
}
-
-/*
- * Return TRUE if the given grid has a trap
- */
-static bool_ is_trap(cave_type *c_ptr)
-{
- return ((c_ptr->info & (CAVE_TRDT)) != 0);
-}
-
-
/*
* Return the number of doors/traps around (or under)
* the character using the filter function 'test'
@@ -953,9 +856,6 @@ static int count_chests(int *y, int *x, bool_ trapped)
/* Already open */
if (o_ptr->pval == 0) continue;
- /* No (known) traps here */
- if (trapped && (!object_known_p(o_ptr) || !o_ptr->pval)) continue;
-
/* OK */
++count;
@@ -1004,16 +904,18 @@ static int coords_to_dir(int y, int x)
*/
static bool_ do_cmd_open_aux(int y, int x, int dir)
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, j;
cave_type *c_ptr;
bool_ more = FALSE;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR))
{
msg_print("You cannot open doors.");
@@ -1037,7 +939,7 @@ static bool_ do_cmd_open_aux(int y, int x, int dir)
else if (c_ptr->feat >= FEAT_DOOR_HEAD + 0x01)
{
/* Disarm factor */
- i = p_ptr->skill_dis;
+ i = 100;
/* Penalize some conditions */
if (p_ptr->blind || no_lite()) i = i / 10;
@@ -1058,18 +960,12 @@ static bool_ do_cmd_open_aux(int y, int x, int dir)
/* Message */
msg_print("You have picked the lock.");
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
-
/* Open the door */
cave_set_feat(y, x, FEAT_OPEN);
/* Update some things */
p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE);
- /* Sound */
- sound(SOUND_OPENDOOR);
-
/* Experience */
gain_exp(1);
}
@@ -1078,7 +974,7 @@ static bool_ do_cmd_open_aux(int y, int x, int dir)
else
{
/* Failure */
- if (flush_failure) flush();
+ flush_on_failure();
/* Message */
msg_print("You failed to pick the lock.");
@@ -1091,17 +987,11 @@ static bool_ do_cmd_open_aux(int y, int x, int dir)
/* Closed door */
else
{
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
-
/* Open the door */
cave_set_feat(y, x, FEAT_OPEN);
/* Update some things */
p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE);
-
- /* Sound */
- sound(SOUND_OPENDOOR);
}
/* Result */
@@ -1115,8 +1005,10 @@ static bool_ do_cmd_open_aux(int y, int x, int dir)
*
* Unlocking a locked door/chest is worth one experience point.
*/
-void do_cmd_open(void)
+void do_cmd_open()
{
+ auto const &r_info = game->edit_data.r_info;
+
int y, x, dir;
s16b o_idx;
@@ -1125,10 +1017,10 @@ void do_cmd_open(void)
bool_ more = FALSE;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR))
{
msg_print("You cannot open doors.");
@@ -1225,7 +1117,7 @@ void do_cmd_open(void)
}
/* Cancel repeat unless we may continue */
- if (!more) disturb(0);
+ if (!more) disturb();
}
@@ -1241,14 +1133,16 @@ void do_cmd_open(void)
*/
static bool_ do_cmd_close_aux(int y, int x, int dir)
{
+ auto const &r_info = game->edit_data.r_info;
+
cave_type *c_ptr;
bool_ more = FALSE;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR))
{
msg_print("You cannot close doors.");
@@ -1261,9 +1155,6 @@ static bool_ do_cmd_close_aux(int y, int x, int dir)
/* Get grid and contents */
c_ptr = &cave[y][x];
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
-
/* Broken door */
if (c_ptr->feat == FEAT_BROKEN)
{
@@ -1279,9 +1170,6 @@ static bool_ do_cmd_close_aux(int y, int x, int dir)
/* Update some things */
p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE);
-
- /* Sound */
- sound(SOUND_SHUTDOOR);
}
/* Result */
@@ -1292,7 +1180,7 @@ static bool_ do_cmd_close_aux(int y, int x, int dir)
/*
* Close an open door.
*/
-void do_cmd_close(void)
+void do_cmd_close()
{
int y, x, dir;
@@ -1377,7 +1265,7 @@ void do_cmd_close(void)
}
/* Cancel repeat unless we may continue */
- if (!more) disturb(0);
+ if (!more) disturb();
}
@@ -1386,6 +1274,8 @@ void do_cmd_close(void)
*/
static bool_ do_cmd_tunnel_test(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
/* Must have knowledge(execpt on "forget" levels) */
if (!(cave[y][x].info & (CAVE_MARK)))
{
@@ -1407,7 +1297,7 @@ static bool_ do_cmd_tunnel_test(int y, int x)
}
/* Must be tunnelable */
- if (!(f_info[cave[y][x].feat].flags1 & FF1_TUNNELABLE))
+ if (!(f_info[cave[y][x].feat].flags & FF_TUNNELABLE))
{
/* Message */
msg_print(f_info[cave[y][x].feat].tunnel);
@@ -1466,10 +1356,13 @@ static bool_ twall(int y, int x, byte feat)
*/
static bool_ do_cmd_tunnel_aux(int y, int x, int dir)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto const &f_info = game->edit_data.f_info;
+
int skill_req = 0, skill_req_1pct = 0;
cave_type *c_ptr = &cave[y][x];
- feature_type *f_ptr = &f_info[c_ptr->feat];
+ auto f_ptr = &f_info[c_ptr->feat];
bool_ more = FALSE;
@@ -1495,11 +1388,8 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir)
/* Get grid */
c_ptr = &cave[y][x];
- /* Sound */
- sound(SOUND_DIG);
-
/* Titanium */
- if (f_ptr->flags1 & FF1_PERMANENT)
+ if (f_ptr->flags & FF_PERMANENT)
{
msg_print(f_ptr->tunnel);
}
@@ -1520,9 +1410,6 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir)
/* We may continue chopping */
msg_print(f_ptr->tunnel);
more = TRUE;
-
- /* Occasional Search XXX XXX */
- if (rand_int(100) < 25) search();
}
}
@@ -1673,9 +1560,6 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir)
msg_print("You have finished the tunnel.");
c_ptr->mimic = 0;
lite_spot(y, x);
-
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
}
/* Keep trying */
@@ -1690,9 +1574,6 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir)
/* We may continue tunelling */
msg_print(f_info[feat].tunnel);
more = TRUE;
-
- /* Occasional Search XXX XXX */
- if (rand_int(100) < 25) search();
}
}
@@ -1750,7 +1631,7 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir)
* Digging is very difficult without a "digger" weapon, but can be
* accomplished by strong players using heavy weapons.
*/
-void do_cmd_tunnel(void)
+void do_cmd_tunnel()
{
int y, x, dir;
@@ -1784,16 +1665,8 @@ void do_cmd_tunnel(void)
/* Get grid */
c_ptr = &cave[y][x];
- /* No tunnelling through doors */
- if (((c_ptr->feat >= FEAT_DOOR_HEAD) &&
- (c_ptr->feat <= FEAT_DOOR_TAIL)) || (c_ptr->feat == FEAT_SHOP))
- {
- /* Message */
- msg_print("You cannot tunnel through doors.");
- }
-
/* No tunnelling through air */
- else if (cave_floor_grid(c_ptr))
+ if (cave_floor_grid(c_ptr))
{
/* Message */
msg_print("You cannot tunnel through air.");
@@ -1821,309 +1694,9 @@ void do_cmd_tunnel(void)
}
/* Cancel repetition unless we can continue */
- if (!more) disturb(0);
-}
-
-
-/*
- * Perform the basic "disarm" command
- *
- * Assume destination is a visible trap
- *
- * Assume there is no monster blocking the destination
- *
- * Returns TRUE if repeated commands may continue
- */
-static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx)
-{
- int i, j;
-
- bool_ more = FALSE;
-
- object_type *o_ptr = &o_list[o_idx];
-
- trap_type *t_ptr = &t_info[o_ptr->pval];
-
-
- /* Take a turn */
- energy_use = 100;
-
- /* Get the "disarm" factor */
- i = p_ptr->skill_dis;
-
- /* Penalize some conditions */
- if (p_ptr->blind || no_lite()) i = i / 10;
- if (p_ptr->confused || p_ptr->image) i = i / 10;
-
- /* Extract the difficulty */
- j = i - t_ptr->difficulty * 3;
-
- /* Always have a small chance of success */
- if (j < 2) j = 2;
-
- /* Must find the trap first. */
- if (!object_known_p(o_ptr))
- {
- msg_print("I don't see any traps.");
- }
-
- /* Already disarmed/unlocked */
- else if (o_ptr->pval <= 0)
- {
- msg_print("The chest is not trapped.");
- }
-
- /* Success (get a lot of experience) */
- else if (rand_int(100) < j)
- {
- msg_print("You have disarmed the chest.");
- gain_exp(t_ptr->difficulty * 3);
- o_ptr->pval = (0 - o_ptr->pval);
- }
-
- /* Failure -- Keep trying */
- else if ((i > 5) && (randint(i) > 5))
- {
- /* We may keep trying */
- more = TRUE;
- if (flush_failure) flush();
- msg_print("You failed to disarm the chest.");
- }
-
- /* Failure -- Set off the trap */
- else
- {
- msg_print("You set off a trap!");
- sound(SOUND_FAIL);
- chest_trap(y, x, o_idx);
- }
-
- /* Result */
- return (more);
+ if (!more) disturb();
}
-
-/*
- * Perform the basic "disarm" command
- *
- * Assume destination is a visible trap
- *
- * Assume there is no monster blocking the destination
- *
- * Returns TRUE if repeated commands may continue
- */
-static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup)
-{
- int i, j, power;
-
- cave_type *c_ptr;
-
- cptr name;
-
- bool_ more = FALSE;
-
-
- /* Take a turn */
- energy_use = 100;
-
- /* Get grid and contents */
- c_ptr = &cave[y][x];
-
- /* Access trap name */
- if (t_info[c_ptr->t_idx].ident)
- {
- name = t_info[c_ptr->t_idx].name;
- }
- else
- {
- name = "unknown trap";
- }
-
- /* Get the "disarm" factor */
- i = p_ptr->skill_dis;
-
- /* Penalize some conditions */
- if (p_ptr->blind || no_lite()) i = i / 10;
- if (p_ptr->confused || p_ptr->image) i = i / 10;
-
- /* XXX XXX XXX Variable power? */
-
- /* Extract trap "power" */
- power = t_info[c_ptr->t_idx].difficulty;
-
- /* Extract the difficulty */
- j = i - power;
-
- /* Always have a small chance of success */
- if (j < 2) j = 2;
-
- /* Success */
- if (rand_int(100) < j)
- {
- /* Message */
- msg_format("You have disarmed the %s.", name);
-
- /* Reward */
- gain_exp(power);
-
- /* Forget the trap */
- c_ptr->info &= ~(CAVE_MARK | CAVE_TRDT);
-
- /* Remove the trap */
- c_ptr->t_idx = 0;
-
- /* Move the player onto the trap */
- if (!(f_info[c_ptr->feat].flags1 & FF1_DOOR))
- move_player_aux(dir, do_pickup, 0, TRUE);
-
- /* Remove trap attr from grid */
- note_spot(y, x);
- lite_spot(y, x);
- }
-
- /* Failure -- Keep trying */
- else if ((i > 5) && (randint(i) > 5))
- {
- /* Failure */
- if (flush_failure) flush();
-
- /* Message */
- msg_format("You failed to disarm the %s.", name);
-
- /* We may keep trying */
- more = TRUE;
- }
-
- /* Failure -- Set off the trap */
- else
- {
- /* Message */
- msg_format("You set off the %s!", name);
-
- /* Move the player onto the trap */
- if (!(f_info[c_ptr->feat].flags1 & FF1_DOOR))
- move_player_aux(dir, do_pickup, 0, FALSE);
- }
-
- /* Result */
- return (more);
-}
-
-
-/*
- * Disamrs the monster traps(no failure)
- */
-void do_cmd_disarm_mon_trap(int y, int x)
-{
- msg_print("You disarm the monster trap.");
-
- place_floor_convert_glass(y, x);
- cave[p_ptr->py][p_ptr->px].special = cave[p_ptr->py][p_ptr->px].special2 = 0;
-}
-
-
-/*
- * Disarms a trap, or chest
- */
-void do_cmd_disarm(void)
-{
- int y, x, dir;
-
- s16b o_idx;
-
- cave_type *c_ptr;
-
- bool_ more = FALSE;
-
-
- /* Pick a direction if there's an obvious choice */
- {
- int num_traps, num_chests;
-
- /* Count visible traps */
- num_traps = count_feats(&y, &x, is_trap, TRUE);
-
- /* Count chests (trapped) */
- num_chests = count_chests(&y, &x, TRUE);
-
- /* See if only one target */
- if (num_traps || num_chests)
- {
- if (num_traps + num_chests <= 1)
- command_dir = coords_to_dir(y, x);
- }
- }
-
- /* Allow repeated command */
- if (command_arg)
- {
- /* Set repeat count */
- command_rep = command_arg - 1;
-
- /* Redraw the state */
- p_ptr->redraw |= (PR_FRAME);
-
- /* Cancel the arg */
- command_arg = 0;
- }
-
- /* Get a direction (or abort) */
- if (get_rep_dir(&dir))
- {
- /* Get location */
- y = p_ptr->py + ddy[dir];
- x = p_ptr->px + ddx[dir];
-
- /* Get grid and contents */
- c_ptr = &cave[y][x];
-
- /* Check for chests */
- o_idx = chest_check(y, x);
-
- /* Disarm a trap */
- if (((c_ptr->t_idx == 0) || (!(c_ptr->info & CAVE_TRDT))) &&
- !o_idx && (c_ptr->feat != FEAT_MON_TRAP))
- {
- /* Message */
- msg_print("You see nothing there to disarm.");
- }
-
- /* Monster in the way */
- else if (c_ptr->m_idx)
- {
- /* Message */
- msg_print("There is a monster in the way!");
-
- /* Attack */
- py_attack(y, x, -1);
- }
-
- /* Disarm chest */
- else if (o_idx)
- {
- /* Disarm the chest */
- more = do_cmd_disarm_chest(y, x, o_idx);
- }
-
- /* Disarm trap */
- else
- {
- /* Disarm the trap */
- if (c_ptr->feat == FEAT_MON_TRAP)
- {
- do_cmd_disarm_mon_trap(y, x);
- more = FALSE;
- }
- else
- more = do_cmd_disarm_aux(y, x, dir, always_pickup);
- }
- }
-
- /* Cancel repeat unless told not to */
- if (!more) disturb(0);
-}
-
-
/*
* Perform the basic "bash" command
*
@@ -2135,16 +1708,18 @@ void do_cmd_disarm(void)
*/
static bool_ do_cmd_bash_aux(int y, int x, int dir)
{
+ auto const &r_info = game->edit_data.r_info;
+
int bash, temp;
cave_type *c_ptr;
bool_ more = FALSE;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_BASH_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR))
{
msg_print("You cannot do that.");
@@ -2182,26 +1757,17 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir)
/* Break down the door */
if (rand_int(100) < 50)
{
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
-
cave_set_feat(y, x, FEAT_BROKEN);
}
/* Open the door */
else
{
- /* Set off trap */
- if (c_ptr->t_idx != 0) player_activate_door_trap(y, x);
-
cave_set_feat(y, x, FEAT_OPEN);
}
- /* Sound */
- sound(SOUND_OPENDOOR);
-
/* Hack -- Fall through the door. Can't disarm while falling. */
- move_player_aux(dir, always_pickup, 0, FALSE);
+ move_player_aux(dir, options->always_pickup, 0);
/* Update some things */
p_ptr->update |= (PU_VIEW | PU_MON_LITE);
@@ -2225,7 +1791,7 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir)
msg_print("You are off-balance.");
/* Hack -- Lose balance ala paralysis */
- (void)set_paralyzed(2 + rand_int(2));
+ set_paralyzed(2 + rand_int(2));
}
/* Result */
@@ -2247,18 +1813,20 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir)
*
* Creatures can also open or bash doors, see elsewhere.
*/
-void do_cmd_bash(void)
+void do_cmd_bash()
{
+ auto const &r_info = game->edit_data.r_info;
+
int y, x, dir;
cave_type *c_ptr;
bool_ more = FALSE;
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
- if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_BASH_DOOR))
+ if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR))
{
msg_print("You cannot do that.");
@@ -2329,7 +1897,7 @@ void do_cmd_bash(void)
}
/* Unless valid action taken, cancel bash */
- if (!more) disturb(0);
+ if (!more) disturb();
}
@@ -2344,8 +1912,10 @@ void do_cmd_bash(void)
* This command must always take a turn, to prevent free detection
* of invisible monsters.
*/
-void do_cmd_alter(void)
+void do_cmd_alter()
{
+ auto const &f_info = game->edit_data.f_info;
+
int y, x, dir;
cave_type *c_ptr;
@@ -2395,19 +1965,12 @@ void do_cmd_alter(void)
}
/* Tunnel through walls */
- else if (f_info[c_ptr->feat].flags1 & FF1_TUNNELABLE)
+ else if (f_info[c_ptr->feat].flags & FF_TUNNELABLE)
{
/* Tunnel */
more = do_cmd_tunnel_aux(y, x, dir);
}
- /* Disarm traps */
- else if (c_ptr->t_idx != 0)
- {
- /* Tunnel */
- more = do_cmd_disarm_aux(y, x, dir, always_pickup);
- }
-
/* Oops */
else
{
@@ -2417,7 +1980,7 @@ void do_cmd_alter(void)
}
/* Cancel repetition unless we can continue */
- if (!more) disturb(0);
+ if (!more) disturb();
}
@@ -2461,7 +2024,7 @@ static bool_ get_spike(int *ip)
*
* This command may NOT be repeated
*/
-void do_cmd_spike(void)
+void do_cmd_spike()
{
int y, x, dir, item;
@@ -2528,8 +2091,10 @@ void do_cmd_spike(void)
}
-static void do_cmd_walk_jump(int pickup, bool_ disarm)
+static void do_cmd_walk_jump(int pickup)
{
+ auto const &wf_info = game->edit_data.wf_info;
+
int dir;
bool_ more = FALSE;
@@ -2555,7 +2120,7 @@ static void do_cmd_walk_jump(int pickup, bool_ disarm)
energy_use = 100;
/* Actually move the character */
- move_player(dir, pickup, disarm);
+ move_player(dir, pickup);
/* Allow more walking */
more = TRUE;
@@ -2565,8 +2130,9 @@ static void do_cmd_walk_jump(int pickup, bool_ disarm)
energy_use *= (p_ptr->wild_mode) ? ((MAX_HGT + MAX_WID) / 2) : 1;
/* Hack again -- Is there a special encounter ??? */
+ auto const &wilderness = game->wilderness;
if (p_ptr->wild_mode &&
- magik(wf_info[wild_map[p_ptr->py][p_ptr->px].feat].level - (p_ptr->lev * 2)))
+ magik(wf_info[wilderness(p_ptr->px, p_ptr->py).feat].level - (p_ptr->lev * 2)))
{
/* Go into large wilderness view */
p_ptr->wilderness_x = p_ptr->px;
@@ -2584,7 +2150,7 @@ static void do_cmd_walk_jump(int pickup, bool_ disarm)
}
/* Cancel repeat unless we may continue */
- if (!more) disturb(0);
+ if (!more) disturb();
}
@@ -2729,7 +2295,7 @@ static void do_cmd_unwalk()
else if (((feat >= FEAT_QUEST_ENTER) && (feat <= FEAT_QUEST_UP)) ||
((feat >= FEAT_LESS) && (feat <= FEAT_MORE)))
{
- move_player(dir, always_pickup, TRUE);
+ move_player(dir, options->always_pickup);
more = FALSE;
}
@@ -2746,7 +2312,7 @@ static void do_cmd_unwalk()
while (dir == 5);
}
- move_player(dir, always_pickup, TRUE);
+ move_player(dir, options->always_pickup);
}
/* Walking semantics */
@@ -2756,14 +2322,14 @@ static void do_cmd_unwalk()
}
/* Cancel repetition unless we can continue */
- if (!more) disturb(0);
+ if (!more) disturb();
}
/*
* Support code for the "Walk" and "Jump" commands
*/
-void do_cmd_walk(int pickup, bool_ disarm)
+void do_cmd_walk(int pickup)
{
/* Move (usually pickup) */
@@ -2773,7 +2339,7 @@ void do_cmd_walk(int pickup, bool_ disarm)
}
else
{
- do_cmd_walk_jump(pickup, disarm);
+ do_cmd_walk_jump(pickup);
}
}
@@ -2806,7 +2372,7 @@ void do_cmd_run_run()
/*
* Start running.
*/
-void do_cmd_run(void)
+void do_cmd_run()
{
if (p_ptr->immovable)
{
@@ -2846,20 +2412,6 @@ void do_cmd_stay(int pickup)
/* Take a turn */
energy_use = 100;
-
- /* Spontaneous Searching */
- if ((p_ptr->skill_fos >= 50) || (0 == rand_int(50 - p_ptr->skill_fos)))
- {
- search();
- }
-
- /* Continuous Searching */
- if (p_ptr->searching)
- {
- search();
- }
-
-
/* Handle "objects" */
carry(pickup);
@@ -2868,7 +2420,7 @@ void do_cmd_stay(int pickup)
if (c_ptr->feat == FEAT_SHOP)
{
/* Disturb */
- disturb(0);
+ disturb();
/* Hack -- enter store */
command_new = '_';
@@ -2878,13 +2430,15 @@ void do_cmd_stay(int pickup)
/*
* Resting allows a player to safely restore his hp -RAK-
*/
-void do_cmd_rest(void)
+void do_cmd_rest()
{
+ auto const &f_info = game->edit_data.f_info;
+
/* Can't rest on a Void Jumpgate -- too dangerous */
if (cave[p_ptr->py][p_ptr->px].feat == FEAT_BETWEEN)
{
/* 'R&\n' is one of our favourite macros, so we have to do this */
- if (flush_failure) flush();
+ flush_on_failure();
/* Tell the player why */
msg_print(format("Resting on a %s is too dangerous!",
@@ -2898,7 +2452,7 @@ void do_cmd_rest(void)
if (p_ptr->necro_extra & CLASS_UNDEAD)
{
/* 'R&\n' is one of our favourite macros, so we have to do this */
- if (flush_failure) flush();
+ flush_on_failure();
/* Tell the player why */
msg_print("Resting is impossible while undead!");
@@ -2951,9 +2505,6 @@ void do_cmd_rest(void)
/* Save the rest code */
resting = command_arg;
- /* Cancel searching */
- p_ptr->searching = FALSE;
-
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -3108,7 +2659,7 @@ int get_shooter_mult(object_type *o_ptr)
*
* Note that Bows of "Extra Shots" give an extra shot.
*/
-void do_cmd_fire(void)
+void do_cmd_fire()
{
int dir, item;
@@ -3140,7 +2691,7 @@ void do_cmd_fire(void)
char o_name[80];
- int msec = delay_factor * delay_factor * delay_factor;
+ auto const msec = options->delay_factor_ms();
/* Get the "bow" (if any) */
@@ -3210,10 +2761,6 @@ void do_cmd_fire(void)
}
- /* Sound */
- sound(SOUND_SHOOT);
-
-
/* Describe the object */
object_desc(o_name, q_ptr, FALSE, 3);
@@ -3354,9 +2901,9 @@ void do_cmd_fire(void)
cptr note_dies = " dies.";
/* Some monsters get "destroyed" */
- if ((r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags2 & (RF2_STUPID)) ||
+ if ((r_ptr->flags & RF_DEMON) ||
+ (r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_STUPID) ||
(strchr("Evg", r_ptr->d_char)))
{
/* Special note at death */
@@ -3444,9 +2991,6 @@ void do_cmd_fire(void)
{
char m_name[80];
- /* Sound */
- sound(SOUND_FLEE);
-
/* Get the monster name (or "it") */
monster_desc(m_name, m_ptr, 0);
@@ -3546,8 +3090,10 @@ void do_cmd_fire(void)
* to hit bonus of the weapon to have an effect? Should it ever cause
* the item to be destroyed? Should it do any damage at all?
*/
-void do_cmd_throw(void)
+void do_cmd_throw()
{
+ auto const &k_info = game->edit_data.k_info;
+
int dir;
s32b special = 0;
@@ -3577,7 +3123,7 @@ void do_cmd_throw(void)
char o_name[80];
- int msec = delay_factor * delay_factor * delay_factor;
+ auto const msec = options->delay_factor_ms();
/* Get an item */
int item;
@@ -3592,11 +3138,10 @@ void do_cmd_throw(void)
/* Access the item */
object_type *o_ptr = get_object(item);
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack - Cannot throw away 'no drop' cursed items */
- if (cursed_p(o_ptr) && (f4 & TR4_CURSE_NO_DROP))
+ if (cursed_p(o_ptr) && (flags & TR_CURSE_NO_DROP))
{
/* Oops */
msg_print("Hmmm, you seem to be unable to throw it.");
@@ -3768,9 +3313,9 @@ void do_cmd_throw(void)
cptr note_dies = " dies.";
/* Some monsters get "destroyed" */
- if ((r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags2 & (RF2_STUPID)) ||
+ if ((r_ptr->flags & RF_DEMON) ||
+ (r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_STUPID) ||
(strchr("Evg", r_ptr->d_char)))
{
/* Special note at death */
@@ -3854,9 +3399,6 @@ void do_cmd_throw(void)
{
char m_name[80];
- /* Sound */
- sound(SOUND_FLEE);
-
/* Get the monster name (or "it") */
monster_desc(m_name, m_ptr, 0);
@@ -3924,8 +3466,10 @@ void do_cmd_throw(void)
* to hit bonus of the weapon to have an effect? Should it ever cause
* the item to be destroyed? Should it do any damage at all?
*/
-void do_cmd_boomerang(void)
+void do_cmd_boomerang()
{
+ auto const &k_info = game->edit_data.k_info;
+
int dir;
int j, y, x, ny, nx, ty, tx;
@@ -3952,7 +3496,7 @@ void do_cmd_boomerang(void)
s32b special = 0;
- int msec = delay_factor * delay_factor * delay_factor;
+ auto const msec = options->delay_factor_ms();
/* Get the "bow" (if any) */
@@ -4095,9 +3639,9 @@ void do_cmd_boomerang(void)
cptr note_dies = " dies.";
/* Some monsters get "destroyed" */
- if ((r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags2 & (RF2_STUPID)) ||
+ if ((r_ptr->flags & RF_DEMON) ||
+ (r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_STUPID) ||
(strchr("Evg", r_ptr->d_char)))
{
/* Special note at death */
@@ -4181,9 +3725,6 @@ void do_cmd_boomerang(void)
{
char m_name[80];
- /* Sound */
- sound(SOUND_FLEE);
-
/* Get the monster name (or "it") */
monster_desc(m_name, m_ptr, 0);
@@ -4196,8 +3737,7 @@ void do_cmd_boomerang(void)
j = (hit_body ? breakage_chance(o_ptr) : 0);
/* Break the boomerang */
- if (!(o_ptr->art_name || artifact_p(o_ptr)) &&
- (rand_int(100) < j))
+ if ((!artifact_p(o_ptr)) && (rand_int(100) < j))
{
msg_print(format("Your %s is destroyed.", o_name));
inc_stack_size_ex(INVEN_BOW, -1, OPTIMIZE, NO_DESCRIBE);
@@ -4252,6 +3792,8 @@ void do_cmd_boomerang(void)
static bool_ tport_vertically(bool_ how)
{
+ auto const &d_info = game->edit_data.d_info;
+
/* quest? */
if (p_ptr->inside_quest)
{
@@ -4259,7 +3801,7 @@ static bool_ tport_vertically(bool_ how)
return (FALSE);
}
- if (dungeon_flags2 & DF2_NO_EASY_MOVE)
+ if (dungeon_flags & DF_NO_EASY_MOVE)
{
msg_print("Some powerful force prevents you from teleporting.");
return FALSE;
@@ -4299,7 +3841,7 @@ static bool_ tport_vertically(bool_ how)
* Do a special ``movement'' action. Meant to be used for ``immovable''
* characters.
*/
-void do_cmd_immovable_special(void)
+void do_cmd_immovable_special()
{
int i, ii, ij, dir;
@@ -4360,8 +3902,8 @@ void do_cmd_immovable_special(void)
/* Give some choices */
prt("(a) Teleport to a specific place.", 4, 5);
prt("(b) Fetch an item.", 5, 5);
- prt("(c) Go up 50'", 6, 5);
- prt("(d) Go down 50'", 7, 5);
+ prt("(c) Go up one level", 6, 5);
+ prt("(d) Go down one level", 7, 5);
/* Prompt */
prt("Command: ", 9, 0);
@@ -4397,7 +3939,7 @@ void do_cmd_immovable_special(void)
if (!get_aim_dir(&dir)) return;
fetch(dir, p_ptr->lev * 15, FALSE);
- py_pickup_floor(always_pickup);
+ py_pickup_floor(options->always_pickup);
did_act = TRUE;
break;
@@ -4529,8 +4071,10 @@ static void do_cmd_sacrifice_aule()
* Handle sacrifices.
* Grace is increased by value of sacrifice.
*/
-void do_cmd_sacrifice(void)
+void do_cmd_sacrifice()
{
+ auto const &r_info = game->edit_data.r_info;
+
byte on_what = cave[p_ptr->py][p_ptr->px].feat;
/* Check valididty */
@@ -4753,6 +4297,8 @@ std::vector<s16b> show_monster_inven(int m_idx)
*/
void do_cmd_steal()
{
+ auto const &r_info = game->edit_data.r_info;
+
int dir = 0, item = -1, k = -1;
bool_ done = FALSE;
@@ -4780,7 +4326,7 @@ void do_cmd_steal()
}
/* The monster is immune */
- if (r_info[m_ptr->r_idx].flags7 & (RF7_NO_THEFT))
+ if (r_info[m_ptr->r_idx].flags & RF_NO_THEFT)
{
msg_print("The monster is guarding the treasures.");
return;
@@ -4883,7 +4429,7 @@ void do_cmd_steal()
m_ptr->hold_o_idxs.erase(m_ptr->hold_o_idxs.begin() + k);
/* Rogues gain some xp */
- if (race_flags1_p(PR1_EASE_STEAL))
+ if (race_flags_p(PR_EASE_STEAL))
{
s32b max_point;
diff --git a/src/cmd2.hpp b/src/cmd2.hpp
index 142238ab..9641dc72 100644
--- a/src/cmd2.hpp
+++ b/src/cmd2.hpp
@@ -4,30 +4,29 @@
#include "object_type_fwd.hpp"
#include <vector>
-extern std::vector<s16b> show_monster_inven(int m_idx);
-extern int breakage_chance(object_type *o_ptr);
-extern void do_cmd_go_up(void);
-extern void do_cmd_go_down(void);
-extern void do_cmd_search(void);
-extern void do_cmd_toggle_search(void);
-extern void do_cmd_open(void);
-extern void do_cmd_close(void);
-extern void do_cmd_chat(void);
-extern void do_cmd_give(void);
-extern void do_cmd_tunnel(void);
-extern void do_cmd_disarm(void);
-extern void do_cmd_bash(void);
-extern void do_cmd_alter(void);
-extern void do_cmd_spike(void);
-extern void do_cmd_walk(int pickup, bool_ disarm);
-extern void do_cmd_stay(int pickup);
-extern void do_cmd_run(void);
-extern void do_cmd_rest(void);
-extern int get_shooter_mult(object_type *o_ptr);
-extern void do_cmd_fire(void);
-extern void do_cmd_throw(void);
-extern void do_cmd_boomerang(void);
-extern void do_cmd_immovable_special(void);
-extern void fetch(int dir, int wgt, bool_ require_los);
-extern void do_cmd_sacrifice(void);
-extern void do_cmd_steal(void);
+std::vector<s16b> show_monster_inven(int m_idx);
+int breakage_chance(object_type *o_ptr);
+void do_cmd_go_up();
+void do_cmd_go_down();
+void do_cmd_search();
+void do_cmd_toggle_search();
+void do_cmd_open();
+void do_cmd_close();
+void do_cmd_chat();
+void do_cmd_give();
+void do_cmd_tunnel();
+void do_cmd_bash();
+void do_cmd_alter();
+void do_cmd_spike();
+void do_cmd_walk(int pickup);
+void do_cmd_stay(int pickup);
+void do_cmd_run();
+void do_cmd_rest();
+int get_shooter_mult(object_type *o_ptr);
+void do_cmd_fire();
+void do_cmd_throw();
+void do_cmd_boomerang();
+void do_cmd_immovable_special();
+void fetch(int dir, int wgt, bool_ require_los);
+void do_cmd_sacrifice();
+void do_cmd_steal();
diff --git a/src/cmd3.cc b/src/cmd3.cc
index 59e61719..cbf58820 100644
--- a/src/cmd3.cc
+++ b/src/cmd3.cc
@@ -12,19 +12,21 @@
#include "cave_type.hpp"
#include "cli_comm.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "hook_drop_in.hpp"
#include "hook_wield_in.hpp"
#include "hooks.hpp"
#include "monster1.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "options.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "squeltch.hpp"
#include "store.hpp"
#include "store_type.hpp"
@@ -40,13 +42,14 @@
#include <cassert>
#include <algorithm>
+#include <fmt/format.h>
#include <memory>
#include <utility>
/*
* Display p_ptr->inventory
*/
-void do_cmd_inven(void)
+void do_cmd_inven()
{
char out_val[160];
@@ -101,7 +104,7 @@ void do_cmd_inven(void)
/*
* Display equipment
*/
-void do_cmd_equip(void)
+void do_cmd_equip()
{
char out_val[160];
@@ -159,28 +162,18 @@ void do_cmd_equip(void)
*/
static bool item_tester_hook_wear(object_type const *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
int slot = wield_slot(o_ptr);
-
- /* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
/* Only one ultimate at a time */
- if (f4 & TR4_ULTIMATE)
+ if (object_flags(o_ptr) & TR_ULTIMATE)
{
- int i;
-
- for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
+ for (int i = INVEN_WIELD; i < INVEN_TOTAL; i++)
{
object_type *q_ptr = &p_ptr->inventory[i];
- /* Extract the flags */
- object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
if (!q_ptr->k_idx) continue;
- if (f4 & TR4_ULTIMATE) return (FALSE);
+ if (object_flags(q_ptr) & TR_ULTIMATE) return (FALSE);
}
}
@@ -211,8 +204,10 @@ bool_ is_slot_ok(int slot)
/*
* Wield or wear a single item from the pack or floor
*/
-void do_cmd_wield(void)
+void do_cmd_wield()
{
+ auto const &a_info = game->edit_data.a_info;
+
int item, slot, num = 1;
object_type forge;
@@ -225,9 +220,6 @@ void do_cmd_wield(void)
char o_name[80];
- u32b f1, f2, f3, f4, f5, esp;
-
-
/* Get an item */
if (!get_item(&item,
"Wear/Wield which item? ",
@@ -258,7 +250,7 @@ void do_cmd_wield(void)
return;
}
- if ((cursed_p(o_ptr)) && (wear_confirm)
+ if ((cursed_p(o_ptr)) && (options->wear_confirm)
&& (object_known_p(o_ptr) || (o_ptr->ident & (IDENT_SENSE))))
{
char dummy[512];
@@ -281,11 +273,11 @@ void do_cmd_wield(void)
}
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Two handed weapons can't be wielded with a shield */
if ((is_slot_ok(slot - INVEN_WIELD + INVEN_ARM)) &&
- (f4 & TR4_MUST2H) &&
+ (flags & TR_MUST2H) &&
(p_ptr->inventory[slot - INVEN_WIELD + INVEN_ARM].k_idx != 0))
{
object_desc(o_name, o_ptr, FALSE, 0);
@@ -298,10 +290,10 @@ void do_cmd_wield(void)
i_ptr = &p_ptr->inventory[slot - INVEN_ARM + INVEN_WIELD];
/* Extract the flags */
- object_flags(i_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const i_flags = object_flags(i_ptr);
/* Prevent shield from being put on if wielding 2H */
- if ((f4 & TR4_MUST2H) && (i_ptr->k_idx) &&
+ if ((i_flags & TR_MUST2H) && (i_ptr->k_idx) &&
(p_ptr->body_parts[slot - INVEN_WIELD] == INVEN_ARM))
{
object_desc(o_name, o_ptr, FALSE, 0);
@@ -310,7 +302,7 @@ void do_cmd_wield(void)
}
if ((p_ptr->body_parts[slot - INVEN_WIELD] == INVEN_ARM) &&
- (f4 & TR4_COULD2H))
+ (i_flags & TR_COULD2H))
{
if (!get_check("Are you sure you want to restrict your fighting? "))
{
@@ -319,13 +311,9 @@ void do_cmd_wield(void)
}
}
-
- /* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
if ((is_slot_ok(slot - INVEN_WIELD + INVEN_ARM)) &&
(p_ptr->inventory[slot - INVEN_WIELD + INVEN_ARM].k_idx != 0) &&
- (f4 & TR4_COULD2H))
+ (flags & TR_COULD2H))
{
if (!get_check("Are you sure you want to use this weapon with a shield?"))
{
@@ -359,7 +347,7 @@ void do_cmd_wield(void)
if (o_ptr->k_idx)
{
/* Take off existing item */
- (void)inven_takeoff(slot, 255, FALSE);
+ inven_takeoff(slot, 255, FALSE);
}
}
else
@@ -369,7 +357,7 @@ void do_cmd_wield(void)
if (!object_similar(o_ptr, q_ptr))
{
/* Take off existing item */
- (void)inven_takeoff(slot, 255, FALSE);
+ inven_takeoff(slot, 255, FALSE);
}
else
{
@@ -461,7 +449,7 @@ void do_cmd_wield(void)
/*
* Take off an item
*/
-void do_cmd_takeoff(void)
+void do_cmd_takeoff()
{
/* Get an item */
int item;
@@ -491,7 +479,7 @@ void do_cmd_takeoff(void)
energy_use = 50;
/* Take off the item */
- (void)inven_takeoff(item, 255, FALSE);
+ inven_takeoff(item, 255, FALSE);
/* Recalculate hitpoint */
p_ptr->update |= (PU_HP);
@@ -503,7 +491,7 @@ void do_cmd_takeoff(void)
/*
* Drop an item
*/
-void do_cmd_drop(void)
+void do_cmd_drop()
{
/* Get an item */
int item;
@@ -517,8 +505,7 @@ void do_cmd_drop(void)
/* Get the item */
object_type *o_ptr = get_object(item);
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Can we drop */
struct hook_drop_in in = { item };
@@ -537,7 +524,7 @@ void do_cmd_drop(void)
}
else
{
- if (f4 & TR4_CURSE_NO_DROP)
+ if (flags & TR_CURSE_NO_DROP)
{
/* Oops */
msg_print("Hmmm, you seem to be unable to drop it.");
@@ -570,8 +557,10 @@ void do_cmd_drop(void)
/*
* Destroy an item
*/
-void do_cmd_destroy(void)
+void do_cmd_destroy()
{
+ auto const &k_info = game->edit_data.k_info;
+
int old_number;
bool_ force = FALSE;
@@ -626,10 +615,8 @@ void do_cmd_destroy(void)
/* Take no time, just like the automatizer */
energy_use = 0;
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- if ((f4 & TR4_CURSE_NO_DROP) && cursed_p(o_ptr))
+ auto const flags = object_flags(o_ptr);
+ if ((flags & TR_CURSE_NO_DROP) && cursed_p(o_ptr))
{
/* Oops */
msg_print("Hmmm, you seem to be unable to destroy it.");
@@ -640,7 +627,7 @@ void do_cmd_destroy(void)
/* Artifacts cannot be destroyed */
- if (artifact_p(o_ptr) || o_ptr->art_name)
+ if (artifact_p(o_ptr))
{
byte feel = SENSE_SPECIAL;
@@ -670,7 +657,6 @@ void do_cmd_destroy(void)
/* Message */
msg_format("You destroy %s.", o_name);
- sound(SOUND_DESTITEM);
/* Create an automatizer rule */
if (automatizer_create)
@@ -689,8 +675,10 @@ void do_cmd_destroy(void)
}
/* Eru wont be happy */
- if (f3 & TR3_BLESSED)
+ if (flags & TR_BLESSED)
+ {
inc_piety(GOD_ERU, -10 * k_info[o_ptr->k_idx].level);
+ }
/* Eliminate the item */
inc_stack_size(item, -amt);
@@ -700,7 +688,7 @@ void do_cmd_destroy(void)
/*
* Observe an item which has been *identify*-ed
*/
-void do_cmd_observe(void)
+void do_cmd_observe()
{
/* Get an item */
int item;
@@ -732,7 +720,7 @@ void do_cmd_observe(void)
* Remove the inscription from an object
* XXX Mention item (when done)?
*/
-void do_cmd_uninscribe(void)
+void do_cmd_uninscribe()
{
/* Get an item */
int item;
@@ -748,7 +736,7 @@ void do_cmd_uninscribe(void)
object_type *o_ptr = get_object(item);
/* Nothing to remove */
- if (!o_ptr->note)
+ if (o_ptr->inscription.empty())
{
msg_print("That item had no inscription to remove.");
return;
@@ -758,7 +746,7 @@ void do_cmd_uninscribe(void)
msg_print("Inscription removed.");
/* Remove the incription */
- o_ptr->note = 0;
+ o_ptr->inscription.clear();
/* Combine the pack */
p_ptr->notice |= (PN_COMBINE);
@@ -771,7 +759,7 @@ void do_cmd_uninscribe(void)
/*
* Inscribe an object with a comment
*/
-void do_cmd_inscribe(void)
+void do_cmd_inscribe()
{
/* Get an item */
int item;
@@ -794,22 +782,15 @@ void do_cmd_inscribe(void)
msg_format("Inscribing %s.", o_name);
msg_print(NULL);
- /* Start with nothing */
+ /* Start with old inscription */
char out_val[80];
- strcpy(out_val, "");
-
- /* Use old inscription */
- if (o_ptr->note)
- {
- /* Start with the old inscription */
- strcpy(out_val, quark_str(o_ptr->note));
- }
+ strcpy(out_val, o_ptr->inscription.c_str());
/* Get a new inscription (possibly empty) */
if (get_string("Inscription: ", out_val, sizeof(out_val)))
{
/* Save the inscription */
- o_ptr->note = quark_add(out_val);
+ o_ptr->inscription = out_val;
/* Combine the pack */
p_ptr->notice |= (PN_COMBINE);
@@ -839,7 +820,7 @@ static object_filter_t const &item_tester_refill_lantern()
/*
* Refill the players lamp (from the pack or floor)
*/
-static void do_cmd_refill_lamp(void)
+static void do_cmd_refill_lamp()
{
/* Get an item */
int item;
@@ -902,7 +883,7 @@ static object_filter_t const &item_tester_refill_torch()
/*
* Refuel the players torch (from the pack or floor)
*/
-static void do_cmd_refill_torch(void)
+static void do_cmd_refill_torch()
{
/* Get an item */
int item;
@@ -954,15 +935,10 @@ static void do_cmd_refill_torch(void)
/*
* Refill the players lamp, or restock his torches
*/
-void do_cmd_refill(void)
+void do_cmd_refill()
{
- object_type *o_ptr;
-
- u32b f1, f2, f3, f4, f5, esp;
-
-
/* Get the light */
- o_ptr = &p_ptr->inventory[INVEN_LITE];
+ auto o_ptr = &p_ptr->inventory[INVEN_LITE];
/* It is nothing */
if (o_ptr->tval != TV_LITE)
@@ -971,9 +947,9 @@ void do_cmd_refill(void)
return;
}
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
- if (f4 & TR4_FUEL_LITE)
+ if (flags & TR_FUEL_LITE)
{
/* It's a torch */
if (o_ptr->sval == SV_LITE_TORCH ||
@@ -1002,7 +978,7 @@ void do_cmd_refill(void)
/*
* Target command
*/
-void do_cmd_target(void)
+void do_cmd_target()
{
/* Target set */
if (target_set(TARGET_KILL))
@@ -1022,7 +998,7 @@ void do_cmd_target(void)
/*
* Look command
*/
-void do_cmd_look(void)
+void do_cmd_look()
{
/* Look around */
if (target_set(TARGET_LOOK))
@@ -1036,7 +1012,7 @@ void do_cmd_look(void)
/*
* Allow the player to examine other sectors on the map
*/
-void do_cmd_locate(void)
+void do_cmd_locate()
{
int dir, y1, x1, y2, x2;
int panel_hgt, panel_wid;
@@ -1249,6 +1225,8 @@ static cptr ident_info[] =
*/
static bool compare_monster_experience(int w1, int w2)
{
+ auto const &r_info = game->edit_data.r_info;
+
/* Extract experience */
s32b z1 = r_info[w1].mexp;
s32b z2 = r_info[w2].mexp;
@@ -1266,6 +1244,8 @@ static bool compare_monster_experience(int w1, int w2)
*/
static bool compare_monster_level(int w1, int w2)
{
+ auto const &r_info = game->edit_data.r_info;
+
/* Extract levels */
byte z1 = r_info[w1].level;
byte z2 = r_info[w2].level;
@@ -1278,28 +1258,13 @@ static bool compare_monster_level(int w1, int w2)
return compare_monster_experience(w1, w2);
}
-/**
- * Sort by total number of kills
- */
-static bool compare_total_kills(int w1, int w2)
-{
- /* Extract total kills */
- s16b z1 = r_info[w1].r_tkills;
- s16b z2 = r_info[w2].r_tkills;
-
- /* Compare total kills */
- if (z1 < z2) return true;
- if (z1 > z2) return false;
-
- /* Punt to monster level. */
- return compare_monster_level(w1, w2);
-}
-
/*
* Sort by player kills
*/
static bool compare_player_kills(int w1, int w2)
{
+ auto const &r_info = game->edit_data.r_info;
+
/* Extract player kills */
s16b z1 = r_info[w1].r_pkills;
s16b z2 = r_info[w2].r_pkills;
@@ -1308,8 +1273,8 @@ static bool compare_player_kills(int w1, int w2)
if (z1 < z2) return true;
if (z1 > z2) return false;
- /* Punt to total number of kills. */
- return compare_total_kills(w1, w2);
+ /* Punt to monster level. */
+ return compare_monster_level(w1, w2);
}
@@ -1318,7 +1283,9 @@ static bool compare_player_kills(int w1, int w2)
*/
static void roff_top(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
byte a1, a2;
@@ -1341,7 +1308,7 @@ static void roff_top(int r_idx)
Term_gotoxy(0, 0);
/* A title (use "The" for non-uniques) */
- if (!(r_ptr->flags1 & (RF1_UNIQUE)))
+ if (!(r_ptr->flags & RF_UNIQUE))
{
Term_addstr( -1, TERM_WHITE, "The ");
}
@@ -1374,9 +1341,9 @@ static void roff_top(int r_idx)
*
* Note that the player ghosts are ignored. XXX XXX XXX
*/
-void do_cmd_query_symbol(void)
+void do_cmd_query_symbol()
{
- int i, r_idx;
+ auto const &r_info = game->edit_data.r_info;
char sym, query;
@@ -1404,6 +1371,7 @@ void do_cmd_query_symbol(void)
"or (Ctrl-A, Ctrl-U, Ctrl-N, Ctrl-M):", &sym)) return;
/* Find that character info, and describe it */
+ std::size_t i;
for (i = 0; ident_info[i]; ++i)
{
if (sym == ident_info[i][0]) break;
@@ -1445,19 +1413,16 @@ void do_cmd_query_symbol(void)
prt(buf, 0, 0);
/* Collect matching monsters */
- std::vector<u16b> who;
- for (i = 1; i < max_r_idx; i++)
+ std::vector<std::size_t> who;
+ for (std::size_t i = 1; i < r_info.size(); i++)
{
- monster_race *r_ptr = &r_info[i];
-
- /* Nothing to recall */
- if (!cheat_know && !r_ptr->r_sights) continue;
+ auto r_ptr = &r_info[i];
/* Require non-unique monsters if needed */
- if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue;
+ if (norm && (r_ptr->flags & RF_UNIQUE)) continue;
/* Require unique monsters if needed */
- if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue;
+ if (uniq && !(r_ptr->flags & RF_UNIQUE)) continue;
/* Require monsters with the name requested if needed */
if (name)
@@ -1529,7 +1494,7 @@ void do_cmd_query_symbol(void)
while (1)
{
/* Extract a race */
- r_idx = who[i];
+ auto r_idx = who[i];
/* Hack -- Auto-recall */
monster_race_track(r_idx, 0);
@@ -1554,7 +1519,7 @@ void do_cmd_query_symbol(void)
Term_save();
/* Recall on screen */
- screen_roff(who[i], 0, 0);
+ screen_roff(who[i], 0);
/* Hack -- Complete the prompt (again) */
Term_addstr( -1, TERM_WHITE, " [(r)ecall, ESC]");
@@ -1608,206 +1573,6 @@ void do_cmd_query_symbol(void)
/*
- * research_mon
- * -KMW-
- */
-bool_ research_mon()
-{
- int i, r_idx;
-
- char sym, query;
-
- char buf[128];
-
-
- s16b oldkills;
-
- byte oldwake;
-
- bool_ oldcheat;
-
-
- bool_ all = FALSE;
-
- bool_ uniq = FALSE;
-
- bool_ norm = FALSE;
-
- bool_ notpicked;
-
-
- bool_ recall = FALSE;
-
- monster_race *r2_ptr;
-
- /* Hack -- Remember "cheat_know" flag */
- oldcheat = cheat_know;
-
-
- /* Get a character, or abort */
- if (!get_com("Enter character of monster: ", &sym)) return (TRUE);
-
- /* Find that character info, and describe it */
- for (i = 0; ident_info[i]; ++i)
- {
- if (sym == ident_info[i][0]) break;
- }
-
- if (ident_info[i])
- {
- strnfmt(buf, 128, "%c - %s.", sym, ident_info[i] + 2);
- }
- else
- {
- strnfmt(buf, 128, "%c - %s.", sym, "Unknown Symbol");
- }
-
- /* Display the result */
- prt(buf, 16, 10);
-
-
- /* Collect matching monsters */
- std::vector<u16b> who;
- for (i = 1; i < max_r_idx; i++)
- {
- monster_race *r_ptr = &r_info[i];
-
- /* Hack -- Force "cheat_know" */
- cheat_know = TRUE;
-
- /* Nothing to recall */
- if (!cheat_know && !r_ptr->r_sights) continue;
-
- /* Require non-unique monsters if needed */
- if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue;
-
- /* Require unique monsters if needed */
- if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue;
-
- /* Collect "appropriate" monsters */
- if (all || (r_ptr->d_char == sym)) {
- who.push_back(i);
- }
- }
-
- /* Nothing to recall */
- if (who.empty())
- {
- /* Restore the "cheat_know" flag */
- cheat_know = oldcheat;
-
- return (TRUE);
- }
-
-
- query = 'y';
-
- /* Sort by level */
- std::sort(std::begin(who), std::end(who), compare_monster_level);
-
-
- /* Start at the end */
- i = who.size() - 1;
-
- notpicked = TRUE;
-
- /* Scan the monster memory */
- while (notpicked)
- {
- /* Extract a race */
- r_idx = who[i];
-
- /* Hack -- Auto-recall */
- monster_race_track(r_idx, 0);
-
- /* Hack -- Handle stuff */
- handle_stuff();
-
- /* Hack -- Begin the prompt */
- roff_top(r_idx);
-
- /* Hack -- Complete the prompt */
- Term_addstr( -1, TERM_WHITE, " [(r)ecall, ESC, space to continue]");
-
- /* Interact */
- while (1)
- {
- /* Recall */
- if (recall)
- {
- /* Save the screen */
- character_icky = TRUE;
- Term_save();
-
- /* Recall on screen */
- r2_ptr = &r_info[r_idx];
-
- oldkills = r2_ptr->r_tkills;
- oldwake = r2_ptr->r_wake;
- screen_roff(who[i], 0, 1);
- r2_ptr->r_tkills = oldkills;
- r2_ptr->r_wake = oldwake;
- r2_ptr->r_sights = 1;
- cheat_know = oldcheat;
- notpicked = FALSE;
- break;
-
- }
-
- /* Command */
- query = inkey();
-
- /* Unrecall */
- if (recall)
- {
- /* Restore */
- Term_load();
- character_icky = FALSE;
- }
-
- /* Normal commands */
- if (query != 'r') break;
-
- /* Toggle recall */
- recall = !recall;
- }
-
- /* Stop scanning */
- if (query == ESCAPE) break;
-
- /* Move to "prev" monster */
- if (query == '-')
- {
- i++;
- assert(i >= 0);
- if (static_cast<size_t>(i) == who.size())
- {
- i = 0;
- }
- }
-
- /* Move to "next" monster */
- else
- {
- if (i-- == 0)
- {
- i = who.size() - 1;
- }
- }
- }
-
-
- /* Re-display the identity */
- /* prt(buf, 5, 5);*/
-
- /* Restore the "cheat_know" flag */
- cheat_know = oldcheat;
-
- return (notpicked);
-}
-
-
-/*
* Try to "sense" the grid's mana
*/
bool_ do_cmd_sense_grid_mana()
@@ -1836,9 +1601,8 @@ bool_ do_cmd_sense_grid_mana()
/* Roll for usage */
if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE))
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("You failed to sense the grid's mana.");
- sound(SOUND_FAIL);
return FALSE;
}
@@ -1976,7 +1740,7 @@ static bool_ get_string_cli(cptr prompt, char *buf, int len)
*
* See defines.h for a list of the codes used.
*/
-void do_cmd_cli(void)
+void do_cmd_cli()
{
char buff[80];
@@ -2009,33 +1773,23 @@ void do_cmd_cli(void)
*/
void do_cmd_cli_help()
{
- int i, j;
-
- FILE *fff;
-
- char file_name[1024];
-
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
+ fmt::MemoryWriter w;
+ for (int i = 0, j = -1; i < cli_total; i++)
+ {
+ if (j < i - 1)
+ {
+ w << "/";
+ }
- /* Open a new file */
- fff = my_fopen(file_name, "w");
+ w.write("[[[[[G{}]", cli_info[i].comm);
- for (i = 0, j = -1; i < cli_total; i++)
- {
- if (j < i - 1) fprintf(fff, "/");
- fprintf(fff, "[[[[[G%s]", cli_info[i].comm);
if (cli_info[i].descrip != cli_info[i + 1].descrip)
{
- fprintf(fff, " %s\n", cli_info[i].descrip);
+ w.write(" {}\n", cli_info[i].descrip);
j = i;
}
}
- /* Close the file */
- my_fclose(fff);
-
/* Enter "icky" mode */
character_icky = TRUE;
@@ -2043,16 +1797,13 @@ void do_cmd_cli_help()
Term_save();
/* Display the file contents */
- show_file(file_name, "Command line help", 0, 0);
+ show_string(w.c_str(), "Command line help");
/* Restore the screen */
Term_load();
/* Leave "icky" mode */
character_icky = FALSE;
-
- /* Remove the file */
- fd_kill(file_name);
}
diff --git a/src/cmd3.hpp b/src/cmd3.hpp
index 48677b77..97d3e22f 100644
--- a/src/cmd3.hpp
+++ b/src/cmd3.hpp
@@ -2,23 +2,22 @@
#include "h-basic.h"
-extern void do_cmd_html_dump(void);
-extern void cli_add(cptr active, cptr trigger, cptr descr);
-extern void do_cmd_cli(void);
-extern void do_cmd_cli_help(void);
-extern void do_cmd_inven(void);
-extern void do_cmd_equip(void);
-extern void do_cmd_wield(void);
-extern void do_cmd_takeoff(void);
-extern void do_cmd_drop(void);
-extern void do_cmd_destroy(void);
-extern void do_cmd_observe(void);
-extern void do_cmd_uninscribe(void);
-extern void do_cmd_inscribe(void);
-extern void do_cmd_refill(void);
-extern void do_cmd_target(void);
-extern void do_cmd_look(void);
-extern void do_cmd_locate(void);
-extern void do_cmd_query_symbol(void);
-extern bool_ do_cmd_sense_grid_mana(void);
-extern bool_ research_mon(void);
+void do_cmd_html_dump();
+void cli_add(cptr active, cptr trigger, cptr descr);
+void do_cmd_cli();
+void do_cmd_cli_help();
+void do_cmd_inven();
+void do_cmd_equip();
+void do_cmd_wield();
+void do_cmd_takeoff();
+void do_cmd_drop();
+void do_cmd_destroy();
+void do_cmd_observe();
+void do_cmd_uninscribe();
+void do_cmd_inscribe();
+void do_cmd_refill();
+void do_cmd_target();
+void do_cmd_look();
+void do_cmd_locate();
+void do_cmd_query_symbol();
+bool_ do_cmd_sense_grid_mana();
diff --git a/src/cmd4.cc b/src/cmd4.cc
index 4b6c040c..a820da41 100644
--- a/src/cmd4.cc
+++ b/src/cmd4.cc
@@ -10,26 +10,30 @@
#include "artifact_type.hpp"
#include "cave_type.hpp"
#include "corrupt.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "init1.hpp"
#include "levels.hpp"
#include "messages.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "notes.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
+#include "options.hpp"
#include "player_type.hpp"
#include "skills.hpp"
#include "squeltch.hpp"
#include "tables.hpp"
#include "town_type.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -37,11 +41,13 @@
#include "xtra1.hpp"
#include "z-rand.hpp"
+#include <algorithm>
#include <cassert>
+#include <fmt/format.h>
#include <memory>
+#include <numeric>
#include <string>
#include <vector>
-#include <algorithm>
/*
* Hack -- redraw the screen
@@ -54,7 +60,7 @@
* selecting various things, such as graphics mode, so it must call
* the "TERM_XTRA_REACT" hook before redrawing the windows.
*/
-void do_cmd_redraw(void)
+void do_cmd_redraw()
{
int j;
@@ -125,7 +131,7 @@ void do_cmd_redraw(void)
/*
* Hack -- change name
*/
-void do_cmd_change_name(void)
+void do_cmd_change_name()
{
char c;
@@ -143,8 +149,8 @@ void do_cmd_change_name(void)
/* Forever */
while (1)
{
- /* keep mode below 7 */
- mode = (mode + 6) % 6;
+ /* keep mode below 5 */
+ mode = (mode + 5) % 5;
/* Display the player */
display_player(mode);
@@ -174,7 +180,7 @@ void do_cmd_change_name(void)
/* File dump */
else if (c == 'f')
{
- strnfmt(tmp, 160, "%s.txt", player_name);
+ strnfmt(tmp, 160, "%s.txt", game->player_name.c_str());
if (get_string("Filename(you can post it to http://angband.oook.cz/): ", tmp, 80))
{
if (tmp[0] && (tmp[0] != ' '))
@@ -199,11 +205,11 @@ void do_cmd_change_name(void)
/* Change tactic */
if (c == 't')
{
- (void)do_cmd_change_tactic( -1);
+ do_cmd_change_tactic( -1);
}
else if (c == 'T')
{
- (void)do_cmd_change_tactic(1);
+ do_cmd_change_tactic(1);
}
/* Change movement */
@@ -247,12 +253,16 @@ void do_cmd_change_name(void)
/*
* Recall the most recent message
*/
-void do_cmd_message_one(void)
+void do_cmd_message_one()
{
- cptr msg = format("> %s", message_str(0));
+ auto const &messages = game->messages;
+
+ auto message = messages.at(0);
+
+ cptr msg = format("> %s", message.text_with_count().c_str());
/* Recall one message XXX XXX XXX */
- display_message(0, 0, strlen(msg), message_color(0), msg);
+ display_message(0, 0, strlen(msg), message.color, msg);
}
@@ -274,30 +284,21 @@ void do_cmd_message_one(void)
*
* Now taking advantages of big-screen. -pav-
*/
-void do_cmd_messages(void)
+void do_cmd_messages()
{
- int i, j, k, n;
- u32b q;
- int wid, hgt;
-
- char shower[80];
- char finder[80];
-
- /* Wipe finder */
- strcpy(finder, "");
-
- /* Wipe shower */
- strcpy(shower, "");
+ auto const &messages = game->messages;
+ /* String to highlight */
+ std::string shower;
/* Total messages */
- n = message_num();
+ const int n = messages.size();
/* Start on first message */
- i = 0;
+ int i = 0;
/* Start at leftmost edge */
- q = 0;
+ u32b q = 0;
/* Enter "icky" mode */
character_icky = TRUE;
@@ -312,35 +313,38 @@ void do_cmd_messages(void)
Term_clear();
/* Retrieve current screen size */
+ int wid;
+ int hgt;
Term_get_size(&wid, &hgt);
/* Dump up to 20 (or more in bigscreen) lines of messages */
+ int j;
for (j = 0; (j < (hgt - 4)) && (i + j < n); j++)
{
- cptr msg = message_str(i + j);
- byte color = message_color(i + j);
+ auto message = messages.at(i + j);
+ auto text = message.text_with_count();
+ auto color = message.color;
/* Apply horizontal scroll */
- msg = (strlen(msg) >= q) ? (msg + q) : "";
+ text = (text.size() >= q) ? text.substr(q) : "";
/* Dump the messages, bottom to top */
- display_message(0, (hgt - 3) - j, strlen(msg), color, msg);
+ display_message(0, (hgt - 3) - j, text.size(), color, text.c_str());
/* Hilite "shower" */
if (shower[0])
{
- cptr str = msg;
-
+ std::size_t pos = 0;
/* Display matches */
- while ((str = strstr(str, shower)) != NULL)
+ while ((pos = text.find(shower, pos)) != std::string::npos)
{
- int len = strlen(shower);
+ std::size_t len = shower.size();
/* Display the match */
- Term_putstr(str - msg, (hgt - 3) - j, len, TERM_YELLOW, shower);
+ Term_putstr(pos, (hgt - 3) - j, len, TERM_YELLOW, shower.c_str());
/* Advance */
- str += len;
+ pos += len;
}
}
}
@@ -353,7 +357,7 @@ void do_cmd_messages(void)
prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0);
/* Get a command */
- k = inkey();
+ const auto k = inkey();
/* Exit on Escape */
if (k == ESCAPE) break;
@@ -388,7 +392,10 @@ void do_cmd_messages(void)
prt("Show: ", hgt - 1, 0);
/* Get a "shower" string, or continue */
- if (!askfor_aux(shower, 80)) continue;
+ if (!askfor_aux(&shower, 80))
+ {
+ continue;
+ }
/* Okay */
continue;
@@ -403,18 +410,22 @@ void do_cmd_messages(void)
prt("Find: ", hgt - 1, 0);
/* Get a "finder" string, or continue */
- if (!askfor_aux(finder, 80)) continue;
+ auto finder = shower;
+ if (!askfor_aux(&finder, 80))
+ {
+ continue;
+ }
/* Show it */
- strcpy(shower, finder);
+ shower = finder;
/* Scan messages */
for (z = i + 1; z < n; z++)
{
- cptr msg = message_str(z);
+ auto message = messages.at(z);
/* Search for it */
- if (strstr(msg, finder))
+ if (message.text_with_count().find(finder) != std::string::npos)
{
/* New location */
i = z;
@@ -494,7 +505,7 @@ namespace {
/**
* Interact with given vector of options.
*/
-static void interact_with_options(std::vector<option_type *> const &options, char const *info, interaction_mode_t interaction_mode)
+static void interact_with_options(std::vector<option_type> const &options, char const *info, interaction_mode_t interaction_mode)
{
size_t n = options.size();
@@ -522,9 +533,9 @@ static void interact_with_options(std::vector<option_type *> const &options, cha
/* Display the option text */
strnfmt(buf, 80, "%-48s: %s (%s)",
- options[i]->o_desc,
- (*options[i]->o_var ? "yes" : "no "),
- options[i]->o_text);
+ options[i].o_desc,
+ (*options[i].o_var) ? "yes" : "no ",
+ options[i].o_text);
c_prt(a, buf, i + 2, 0);
}
@@ -580,7 +591,7 @@ static void interact_with_options(std::vector<option_type *> const &options, cha
{
break;
}
- *(options[k]->o_var) = TRUE;
+ *(options[k].o_var) = TRUE;
k = (k + 1) % n;
break;
}
@@ -594,7 +605,7 @@ static void interact_with_options(std::vector<option_type *> const &options, cha
break;
}
- *(options[k]->o_var) = FALSE;
+ *(options[k].o_var) = FALSE;
k = (k + 1) % n;
break;
}
@@ -614,56 +625,26 @@ static void interact_with_options(std::vector<option_type *> const &options, cha
/*
- * Cheating options
- */
-static option_type cheat_info[6] =
-{
- { &cheat_peek, FALSE, 0, 0, "cheat_peek", "Peek into object creation" },
- { &cheat_hear, FALSE, 0, 1, "cheat_hear", "Peek into monster creation" },
- { &cheat_room, FALSE, 0, 2, "cheat_room", "Peek into dungeon creation" },
- { &cheat_xtra, FALSE, 0, 3, "cheat_xtra", "Peek into something else" },
- { &cheat_know, FALSE, 0, 4, "cheat_know", "Know complete monster info" },
- { &cheat_live, FALSE, 0, 5, "cheat_live", "Allow player to avoid death" }
-};
-
-/*
* Interact with some options for cheating
*/
static void do_cmd_options_cheat(cptr info)
{
- // Calculate number of cheat options
- size_t n = std::distance(std::begin(cheat_info), std::end(cheat_info));
-
- // Build the vector of options we're going to interact with
- std::vector<option_type *> options;
- options.reserve(n);
- for (auto &option : cheat_info)
- {
- options.push_back(&option);
- }
-
// Interact
- interact_with_options(options, info, interaction_mode_t::READ_WRITE);
+ interact_with_options(options->cheat_options, info, interaction_mode_t::READ_WRITE);
// If user toggled any of the options to TRUE, then we add those cheats
// to the player's "noscore" flags. Note that it doesn't matter what the
// previous value was -- we don't "unset" noscore flags anyway.
- for (auto &option: options)
+ for (auto const &option: options->cheat_options)
{
- if (*option->o_var)
+ if (*option.o_var)
{
- noscore |= (option->o_page * 256 + option->o_bit);
+ noscore |= (option.o_page * 256 + option.o_bit);
}
}
}
-static option_type autosave_info[2] =
-{
- { &autosave_l, FALSE, 0, 6, "autosave_l", "Autosave when entering new levels" },
- { &autosave_t, FALSE, 0, 7, "autosave_t", "Timed autosave" },
-};
-
s16b toggle_frequency(s16b current)
{
if (current == 0) return (50);
@@ -687,7 +668,9 @@ static void do_cmd_options_autosave(cptr info)
{
char ch;
- int i, k = 0, n = 2;
+ int i, k = 0;
+
+ int n = options->autosave_options.size();
int dir;
@@ -714,15 +697,18 @@ static void do_cmd_options_autosave(cptr info)
/* Color current option */
if (i == k) a = TERM_L_BLUE;
+ /* Get the option */
+ auto const option = &options->autosave_options[i];
+
/* Display the option text */
strnfmt(buf, 80, "%-48s: %s (%s)",
- autosave_info[i].o_desc,
- (*autosave_info[i].o_var ? "yes" : "no "),
- autosave_info[i].o_text);
+ option->o_desc,
+ (*option->o_var) ? "yes" : "no ",
+ option->o_text);
c_prt(a, buf, i + 2, 0);
}
- prt(format("Timed autosave frequency: every %d turns", autosave_freq), 5, 0);
+ prt(format("Timed autosave frequency: every %d turns", options->autosave_freq), 5, 0);
/* Hilite current option */
@@ -768,8 +754,7 @@ static void do_cmd_options_autosave(cptr info)
case 'Y':
case '6':
{
-
- (*autosave_info[k].o_var) = TRUE;
+ (*options->autosave_options[k].o_var) = TRUE;
k = (k + 1) % n;
break;
@@ -779,7 +764,7 @@ static void do_cmd_options_autosave(cptr info)
case 'N':
case '4':
{
- (*autosave_info[k].o_var) = FALSE;
+ (*options->autosave_options[k].o_var) = FALSE;
k = (k + 1) % n;
break;
@@ -788,9 +773,9 @@ static void do_cmd_options_autosave(cptr info)
case 'f':
case 'F':
{
- autosave_freq = toggle_frequency(autosave_freq);
- prt(format("Timed autosave frequency: every %d turns",
- autosave_freq), 5, 0);
+ options->autosave_freq = toggle_frequency(options->autosave_freq);
+ prt(fmt::format("Timed autosave frequency: every {} turns",
+ options->autosave_freq), 5, 0);
break;
}
@@ -811,28 +796,29 @@ static void do_cmd_options_autosave(cptr info)
void do_cmd_options_aux(int page, cptr info, bool_ read_only)
{
// Scrape together all the options from the relevant page.
- std::vector<option_type *> options;
- options.reserve(64); // Seems a reasonable number; anything more would be unusable anyway
- for (size_t i = 0; option_info[i].o_desc; i++)
- {
- if (option_info[i].o_page == page)
- {
- options.push_back(&option_info[i]);
- }
- }
+ std::vector<option_type> page_options;
+ page_options.reserve(options->standard_options.size());
+ std::copy_if(
+ std::begin(options->standard_options),
+ std::end(options->standard_options),
+ std::back_inserter(page_options),
+ [=](option_type const &option) -> bool {
+ return (option.o_page == page);
+ }
+ );
// Interact with the options
interaction_mode_t interaction_mode = read_only
? interaction_mode_t::READ_ONLY
: interaction_mode_t::READ_WRITE;
- interact_with_options(options, info, interaction_mode);
+ interact_with_options(page_options, info, interaction_mode);
}
/*
* Modify the "window" options
*/
-static void do_cmd_options_win(void)
+static void do_cmd_options_win()
{
int i, j, d;
@@ -848,7 +834,7 @@ static void do_cmd_options_win(void)
/* Memorize old flags */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
/* Acquire current flags */
old_flag[j] = window_flag[j];
@@ -865,7 +851,7 @@ static void do_cmd_options_win(void)
prt("Window Flags (<dir>, t, y, n, ESC) ", 0, 0);
/* Display the windows */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
byte a = TERM_WHITE;
@@ -895,7 +881,7 @@ static void do_cmd_options_win(void)
Term_putstr(0, i + 5, -1, a, str);
/* Display the windows */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
byte a = TERM_WHITE;
@@ -932,7 +918,7 @@ static void do_cmd_options_win(void)
case 't':
{
/* Clear windows */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
window_flag[j] &= ~(1L << y);
}
@@ -982,7 +968,7 @@ static void do_cmd_options_win(void)
}
/* Notice changes */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
term *old = Term;
@@ -1037,25 +1023,25 @@ static errr option_dump(cptr fname)
fprintf(fff, "# Automatic option dump\n\n");
/* Dump options (skip cheat, adult, score) */
- for (i = 0; option_info[i].o_var != NULL; i++)
+ for (auto const &option: options->standard_options)
{
/* Require a real option */
- if (!option_info[i].o_text) continue;
+ if (!option.o_text) continue;
/* No birth options */
- if (option_info[i].o_page == 6) continue;
+ if (option.o_page == 6) continue;
/* Comment */
- fprintf(fff, "# Option '%s'\n", option_info[i].o_desc);
+ fprintf(fff, "# Option '%s'\n", option.o_desc);
/* Dump the option */
- if ((*option_info[i].o_var))
+ if (*option.o_var)
{
- fprintf(fff, "Y:%s\n", option_info[i].o_text);
+ fprintf(fff, "Y:%s\n", option.o_text);
}
else
{
- fprintf(fff, "X:%s\n", option_info[i].o_text);
+ fprintf(fff, "X:%s\n", option.o_text);
}
/* Skip a line */
@@ -1111,9 +1097,6 @@ static errr option_dump(cptr fname)
*/
static void do_cmd_pref_file_hack(int row)
{
- char ftmp[80];
-
-
/* Prompt */
prt("Command: Load a user pref file", row, 0);
@@ -1121,21 +1104,24 @@ static void do_cmd_pref_file_hack(int row)
prt("File: ", row + 2, 0);
/* Default filename */
- strnfmt(ftmp, 80, "%s.prf", player_base);
+ std::string ftmp = fmt::format("{}.prf", game->player_base);
/* Ask for a file (or cancel) */
- if (!askfor_aux(ftmp, 80)) return;
+ if (!askfor_aux(&ftmp, 80))
+ {
+ return;
+ }
/* Process the given filename */
- if (process_pref_file(ftmp))
+ if (process_pref_file(ftmp.c_str()))
{
/* Mention failure */
- msg_format("Failed to load '%s'!", ftmp);
+ msg_format("Failed to load '%s'!", ftmp.c_str());
}
else
{
/* Mention success */
- msg_format("Loaded '%s'.", ftmp);
+ msg_format("Loaded '%s'.", ftmp.c_str());
}
}
@@ -1146,7 +1132,7 @@ static void do_cmd_pref_file_hack(int row)
* The user must use the "Ctrl-R" command to "adapt" to changes
* in any options which control "visual" aspects of the game.
*/
-void do_cmd_options(void)
+void do_cmd_options()
{
int k;
@@ -1216,8 +1202,6 @@ void do_cmd_options(void)
case 'u':
case 'U':
{
- char ftmp[80];
-
/* Prompt */
prt("Command: Append options to a file", 21, 0);
@@ -1225,13 +1209,13 @@ void do_cmd_options(void)
prt("File: ", 21, 0);
/* Default filename */
- strnfmt(ftmp, 80, "%s.prf", player_base);
+ auto ftmp = fmt::format("{}.prf", game->player_base);
/* Ask for a file */
- if (!askfor_aux(ftmp, 80)) continue;
+ if (!askfor_aux(&ftmp, 80)) continue;
/* Dump the options */
- if (option_dump(ftmp))
+ if (option_dump(ftmp.c_str()))
{
/* Failure */
msg_print("Failed!");
@@ -1340,14 +1324,26 @@ void do_cmd_options(void)
/* Get a new value */
while (1)
{
- int msec = delay_factor * delay_factor * delay_factor;
- prt(format("Current base delay factor: %d (%d msec)",
- delay_factor, msec), 22, 0);
+ auto const msec = options->delay_factor_ms();
+
+ prt(fmt::format("Current base delay factor: {:d} ({:d} msec)",
+ options->delay_factor, msec), 22, 0);
prt("Delay Factor (0-9 or ESC to accept): ", 23, 0);
+
k = inkey();
- if (k == ESCAPE) break;
- if (isdigit(k)) delay_factor = D2I(k);
- else bell();
+ if (k == ESCAPE)
+ {
+ break;
+ }
+
+ if (isdigit(k))
+ {
+ options->delay_factor = D2I(k);
+ }
+ else
+ {
+ bell();
+ }
}
break;
@@ -1363,13 +1359,24 @@ void do_cmd_options(void)
/* Get a new value */
while (1)
{
- prt(format("Current hitpoint warning: %d0%%",
- hitpoint_warn), 22, 0);
+ prt(fmt::format("Current hitpoint warning: {:d}0%",
+ options->hitpoint_warn), 22, 0);
prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0);
+
k = inkey();
- if (k == ESCAPE) break;
- if (isdigit(k)) hitpoint_warn = D2I(k);
- else bell();
+ if (k == ESCAPE)
+ {
+ break;
+ }
+
+ if (isdigit(k))
+ {
+ options->hitpoint_warn = D2I(k);
+ }
+ else
+ {
+ bell();
+ }
}
break;
@@ -1401,7 +1408,7 @@ void do_cmd_options(void)
*
* XXX XXX XXX Allow absolute file names?
*/
-void do_cmd_pref(void)
+void do_cmd_pref()
{
char buf[80];
@@ -1413,7 +1420,7 @@ void do_cmd_pref(void)
if (!get_string("Pref: ", buf, 80)) return;
/* Process that pref command */
- (void)process_pref_file_aux(buf);
+ process_pref_file_aux(buf);
}
@@ -1642,19 +1649,10 @@ static errr keymap_dump(cptr fname)
*
* Could use some helpful instructions on this page. XXX XXX XXX
*/
-void do_cmd_macros(void)
+void do_cmd_macros()
{
- int i;
-
- char tmp[1024];
-
- char buf[1024];
-
- int mode;
-
-
/* Keymap mode */
- mode = get_keymap_mode();
+ int mode = get_keymap_mode();
/* Enter "icky" mode */
@@ -1667,6 +1665,8 @@ void do_cmd_macros(void)
/* Process requests until done */
while (1)
{
+ char buf[1024];
+
/* Clear screen */
Term_clear();
@@ -1700,7 +1700,7 @@ void do_cmd_macros(void)
prt("Command: ", 16, 0);
/* Get a command */
- i = inkey();
+ int i = inkey();
/* Leave */
if (i == ESCAPE) break;
@@ -1715,13 +1715,16 @@ void do_cmd_macros(void)
prt("File: ", 18, 0);
/* Default filename */
- strnfmt(tmp, 1024, "%s.prf", player_name);
+ auto tmp = fmt::format("{}.prf", game->player_name);
/* Ask for a file */
- if (!askfor_aux(tmp, 80)) continue;
+ if (!askfor_aux(&tmp, 80))
+ {
+ continue;
+ }
/* Process the given filename */
- if (0 != process_pref_file(tmp))
+ if (0 != process_pref_file(tmp.c_str()))
{
/* Prompt */
msg_print("Could not load file!");
@@ -1738,13 +1741,16 @@ void do_cmd_macros(void)
prt("File: ", 18, 0);
/* Default filename */
- strnfmt(tmp, 1024, "%s.prf", player_name);
+ auto tmp = fmt::format("{}.prf", game->player_name);
/* Ask for a file */
- if (!askfor_aux(tmp, 80)) continue;
+ if (!askfor_aux(&tmp, 80))
+ {
+ continue;
+ }
/* Dump the macros */
- (void)macro_dump(tmp);
+ macro_dump(tmp.c_str());
/* Prompt */
msg_print("Appended macros.");
@@ -1794,6 +1800,8 @@ void do_cmd_macros(void)
/* Create a macro */
else if (i == '4')
{
+ char tmp[1024];
+
/* Prompt */
prt("Command: Create a macro", 16, 0);
@@ -1855,13 +1863,16 @@ void do_cmd_macros(void)
prt("File: ", 18, 0);
/* Default filename */
- strnfmt(tmp, 1024, "%s.prf", player_name);
+ auto tmp = fmt::format("{}.prf", game->player_name);
/* Ask for a file */
- if (!askfor_aux(tmp, 80)) continue;
+ if (!askfor_aux(&tmp, 80))
+ {
+ continue;
+ }
/* Dump the macros */
- (void)keymap_dump(tmp);
+ keymap_dump(tmp.c_str());
/* Prompt */
msg_print("Appended keymaps.");
@@ -1911,6 +1922,8 @@ void do_cmd_macros(void)
/* Create a keymap */
else if (i == '8')
{
+ char tmp[1024];
+
/* Prompt */
prt("Command: Create a keymap", 16, 0);
@@ -1967,6 +1980,8 @@ void do_cmd_macros(void)
/* Enter a new action */
else if (i == '0')
{
+ char tmp[1024];
+
/* Prompt */
prt("Command: Enter a new action", 16, 0);
@@ -2005,8 +2020,12 @@ void do_cmd_macros(void)
/*
* Interact with "visuals"
*/
-void do_cmd_visuals(void)
+void do_cmd_visuals()
{
+ auto &r_info = game->edit_data.r_info;
+ auto &f_info = game->edit_data.f_info;
+ auto &k_info = game->edit_data.k_info;
+
int i;
FILE *fff;
@@ -2069,7 +2088,7 @@ void do_cmd_visuals(void)
if (!askfor_aux(tmp, 70)) continue;
/* Process the given filename */
- (void)process_pref_file(tmp);
+ process_pref_file(tmp);
}
/* Dump monster attr/chars */
@@ -2101,9 +2120,9 @@ void do_cmd_visuals(void)
fprintf(fff, "# Monster attr/char definitions\n\n");
/* Dump monsters */
- for (i = 0; i < max_r_idx; i++)
+ for (std::size_t i = 0; i < r_info.size(); i++)
{
- monster_race *r_ptr = &r_info[i];
+ auto r_ptr = &r_info[i];
/* Skip non-entries */
if (!r_ptr->name) continue;
@@ -2112,7 +2131,7 @@ void do_cmd_visuals(void)
fprintf(fff, "# %s\n", r_ptr->name);
/* Dump the monster attr/char info */
- fprintf(fff, "R:%d:0x%02X:0x%02X\n\n", i,
+ fprintf(fff, "R:%zu:0x%02X:0x%02X\n\n", i,
static_cast<unsigned int>(r_ptr->x_attr),
static_cast<unsigned int>(r_ptr->x_char));
}
@@ -2156,9 +2175,9 @@ void do_cmd_visuals(void)
fprintf(fff, "# Object attr/char definitions\n\n");
/* Dump objects */
- for (i = 0; i < max_k_idx; i++)
+ for (std::size_t k = 0; k < k_info.size(); k++)
{
- object_kind *k_ptr = &k_info[i];
+ object_kind *k_ptr = &k_info[k];
/* Skip non-entries */
if (!k_ptr->name) continue;
@@ -2167,7 +2186,7 @@ void do_cmd_visuals(void)
fprintf(fff, "# %s\n", k_ptr->name);
/* Dump the object attr/char info */
- fprintf(fff, "K:%d:0x%02X:0x%02X\n\n", i,
+ fprintf(fff, "K:%zu:0x%02X:0x%02X\n\n", k,
(byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
}
@@ -2210,9 +2229,9 @@ void do_cmd_visuals(void)
fprintf(fff, "# Feature attr/char definitions\n\n");
/* Dump features */
- for (i = 0; i < max_f_idx; i++)
+ for (std::size_t f_idx = 0; f_idx < f_info.size(); f_idx++)
{
- feature_type *f_ptr = &f_info[i];
+ auto f_ptr = &f_info[f_idx];
/* Skip non-entries */
if (!f_ptr->name) continue;
@@ -2221,7 +2240,7 @@ void do_cmd_visuals(void)
fprintf(fff, "# %s\n", f_ptr->name);
/* Dump the feature attr/char info */
- fprintf(fff, "F:%d:0x%02X:0x%02X\n\n", i,
+ fprintf(fff, "F:%zu:0x%02X:0x%02X\n\n", f_idx,
(byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
}
@@ -2246,7 +2265,7 @@ void do_cmd_visuals(void)
/* Hack -- query until done */
while (1)
{
- monster_race *r_ptr = &r_info[r];
+ auto r_ptr = &r_info[r];
byte da = (r_ptr->d_attr);
char dc = (r_ptr->d_char);
@@ -2281,8 +2300,8 @@ void do_cmd_visuals(void)
if (i == ESCAPE) break;
/* Analyze */
- if (i == 'n') r = (r + max_r_idx + 1) % max_r_idx;
- if (i == 'N') r = (r + max_r_idx - 1) % max_r_idx;
+ if (i == 'n') r = (r + r_info.size() + 1) % r_info.size();
+ if (i == 'N') r = (r + r_info.size() - 1) % r_info.size();
if (i == 'a') r_ptr->x_attr = (ca + 1);
if (i == 'A') r_ptr->x_attr = (ca - 1);
if (i == 'c') r_ptr->x_char = (cc + 1);
@@ -2336,8 +2355,8 @@ void do_cmd_visuals(void)
if (i == ESCAPE) break;
/* Analyze */
- if (i == 'n') k = (k + max_k_idx + 1) % max_k_idx;
- if (i == 'N') k = (k + max_k_idx - 1) % max_k_idx;
+ if (i == 'n') k = (k + k_info.size() + 1) % k_info.size();
+ if (i == 'N') k = (k + k_info.size() - 1) % k_info.size();
if (i == 'a') k_info[k].x_attr = (ca + 1);
if (i == 'A') k_info[k].x_attr = (ca - 1);
if (i == 'c') k_info[k].x_char = (cc + 1);
@@ -2356,7 +2375,7 @@ void do_cmd_visuals(void)
/* Hack -- query until done */
while (1)
{
- feature_type *f_ptr = &f_info[f];
+ auto f_ptr = &f_info[f];
byte da = f_ptr->d_attr;
char dc = f_ptr->d_char;
@@ -2391,8 +2410,8 @@ void do_cmd_visuals(void)
if (i == ESCAPE) break;
/* Analyze */
- if (i == 'n') f = (f + max_f_idx + 1) % max_f_idx;
- if (i == 'N') f = (f + max_f_idx - 1) % max_f_idx;
+ if (i == 'n') f = (f + f_info.size() + 1) % f_info.size();
+ if (i == 'N') f = (f + f_info.size() - 1) % f_info.size();
if (i == 'a') f_info[f].x_attr = (ca + 1);
if (i == 'A') f_info[f].x_attr = (ca - 1);
if (i == 'c') f_info[f].x_char = (cc + 1);
@@ -2437,7 +2456,7 @@ void do_cmd_visuals(void)
/*
* Interact with "colors"
*/
-void do_cmd_colors(void)
+void do_cmd_colors()
{
int i;
@@ -2494,7 +2513,7 @@ void do_cmd_colors(void)
if (!askfor_aux(tmp, 70)) continue;
/* Process the given filename */
- (void)process_pref_file(tmp);
+ process_pref_file(tmp);
/* Mega-Hack -- react to changes */
Term_xtra(TERM_XTRA_REACT, 0);
@@ -2659,7 +2678,7 @@ void do_cmd_colors(void)
* Take notes. There are two ways this can happen, either in the message
* recall or a file.
*/
-void do_cmd_note(void)
+void do_cmd_note()
{
char buf[80];
@@ -2680,7 +2699,7 @@ void do_cmd_note(void)
/*
* Mention the current version
*/
-void do_cmd_version(void)
+void do_cmd_version()
{
/* Silly message */
msg_format("You are playing %s made by %s (%s).",
@@ -2714,14 +2733,16 @@ static cptr do_cmd_feeling_text[11] =
* Note that "feeling" is set to zero unless some time has passed.
* Note that this is done when the level is GENERATED, not entered.
*/
-void do_cmd_feeling(void)
+void do_cmd_feeling()
{
+ auto const &d_info = game->edit_data.d_info;
+
/* Verify the feeling */
if (feeling < 0) feeling = 0;
if (feeling > 10) feeling = 10;
/* Feeling of the fate */
- if (fate_flag && !(dungeon_flags2 & DF2_SPECIAL) && !p_ptr->inside_quest)
+ if (fate_flag && !(dungeon_flags & DF_SPECIAL) && !p_ptr->inside_quest)
{
msg_print("You feel that you will meet your fate here.");
}
@@ -2733,11 +2754,11 @@ void do_cmd_feeling(void)
}
/* No useful feeling in special levels */
- if (dungeon_flags2 & DF2_DESC)
+ if (dungeon_flags & DF_DESC)
{
char buf[1024];
- if ((get_dungeon_save(buf)) || (generate_special_feeling) || (dungeon_flags2 & DF2_DESC_ALWAYS))
+ if (get_dungeon_save(buf) || game->generate_special_feeling || (dungeon_flags & DF_DESC_ALWAYS))
{
if (!get_level_desc(buf)) msg_print("Someone forgot to describe this level!");
else msg_print(buf);
@@ -2757,7 +2778,7 @@ void do_cmd_feeling(void)
{
/* This could be simplified with a correct p_ptr->town_num */
int i, town_level = 0;
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto d_ptr = &d_info[dungeon_type];
/* Is it a town level ? */
for (i = 0; i < TOWN_DUNGEON; i++)
@@ -2784,7 +2805,7 @@ static char hack[17] = "dwsorgbuDWvyRGBU";
/*
* Hack -- load a screen dump from a file
*/
-void do_cmd_load_screen(void)
+void do_cmd_load_screen()
{
int i, y, x;
@@ -2872,7 +2893,7 @@ void do_cmd_load_screen(void)
for (x = 0; x < len; x++)
{
/* Get the attr/char */
- (void)(Term_what(x, y, &a, &c));
+ (Term_what(x, y, &a, &c));
/* Look up the attr */
for (i = 0; i < 16; i++)
@@ -2908,7 +2929,7 @@ void do_cmd_load_screen(void)
/*
* Hack -- save a screen dump to a file
*/
-void do_cmd_save_screen(void)
+void do_cmd_save_screen()
{
int y, x;
int wid, hgt;
@@ -2948,7 +2969,7 @@ void do_cmd_save_screen(void)
for (x = 0; x < wid; x++)
{
/* Get the attr/char */
- (void)(Term_what(x, y, &a, &c));
+ (Term_what(x, y, &a, &c));
/* Dump it */
buf[x] = c;
@@ -2972,7 +2993,7 @@ void do_cmd_save_screen(void)
for (x = 0; x < wid; x++)
{
/* Get the attr/char */
- (void)(Term_what(x, y, &a, &c));
+ (Term_what(x, y, &a, &c));
/* Dump it */
buf[x] = hack[a & 0x0F];
@@ -3009,30 +3030,20 @@ void do_cmd_save_screen(void)
/*
* Check the status of "artifacts"
*/
-void do_cmd_knowledge_artifacts(void)
+void do_cmd_knowledge_artifacts()
{
- int i, k, z, x, y;
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
- FILE *fff;
-
- char file_name[1024];
+ int i, z, x, y;
char base_name[80];
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
/* Scan the artifacts */
- std::unique_ptr<bool_[]> okay(new bool_[max_a_idx]);
- for (k = 0; k < max_a_idx; k++)
+ std::vector<bool_> okay(a_info.size(), FALSE);
+ for (std::size_t k = 0; k < a_info.size(); k++)
{
- artifact_type *a_ptr = &a_info[k];
-
- /* Default */
- okay[k] = FALSE;
+ auto a_ptr = &a_info[k];
/* Skip "empty" artifacts */
if (!a_ptr->name) continue;
@@ -3044,16 +3055,13 @@ void do_cmd_knowledge_artifacts(void)
okay[k] = TRUE;
}
- std::unique_ptr<bool_[]> okayk(new bool_[max_k_idx]);
- for (k = 0; k < max_k_idx; k++)
+ std::vector<bool_> okayk(k_info.size(), FALSE);
+ for (std::size_t k = 0; k < k_info.size(); k++)
{
- object_kind *k_ptr = &k_info[k];
-
- /* Default */
- okayk[k] = FALSE;
+ auto k_ptr = &k_info[k];
/* Skip "empty" artifacts */
- if (!(k_ptr->flags3 & TR3_NORM_ART)) continue;
+ if (!(k_ptr->flags & TR_NORM_ART)) continue;
/* Skip "uncreated" artifacts */
if (!k_ptr->artifact) continue;
@@ -3085,7 +3093,7 @@ void do_cmd_knowledge_artifacts(void)
if (object_known_p(o_ptr)) continue;
/* Note the artifact */
- if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART)
+ if (k_info[o_ptr->k_idx].flags & TR_NORM_ART)
{
okayk[o_ptr->k_idx] = FALSE;
}
@@ -3118,7 +3126,7 @@ void do_cmd_knowledge_artifacts(void)
if (object_known_p(o_ptr)) continue;
/* Note the artifact */
- if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART)
+ if (k_info[o_ptr->k_idx].flags & TR_NORM_ART)
{
okayk[o_ptr->k_idx] = FALSE;
}
@@ -3147,7 +3155,7 @@ void do_cmd_knowledge_artifacts(void)
if (object_known_p(o_ptr)) continue;
/* Note the artifact */
- if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART)
+ if (k_info[o_ptr->k_idx].flags & TR_NORM_ART)
{
okayk[o_ptr->k_idx] = FALSE;
}
@@ -3157,10 +3165,13 @@ void do_cmd_knowledge_artifacts(void)
}
}
+ /* Output buffer */
+ fmt::MemoryWriter w;
+
/* Scan the artifacts */
- for (k = 0; k < max_a_idx; k++)
+ for (std::size_t k = 0; k < a_info.size(); k++)
{
- artifact_type *a_ptr = &a_info[k];
+ auto a_ptr = &a_info[k];
/* List "dead" ones */
if (!okay[k]) continue;
@@ -3176,7 +3187,6 @@ void do_cmd_knowledge_artifacts(void)
{
object_type forge;
object_type *q_ptr;
- u32b f1, f2, f3, f4, f5, esp;
/* Get local object */
q_ptr = &forge;
@@ -3188,19 +3198,21 @@ void do_cmd_knowledge_artifacts(void)
q_ptr->name1 = k;
/* Spell in it ? no ! */
- object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f5 & TR5_SPELL_CONTAIN)
+ auto const flags = object_flags(q_ptr);
+ if (flags & TR_SPELL_CONTAIN)
+ {
q_ptr->pval2 = -1;
+ }
/* Describe the artifact */
object_desc_store(base_name, q_ptr, FALSE, 0);
}
/* Hack -- Build the artifact name */
- fprintf(fff, " The %s\n", base_name);
+ w.write(" The {}\n", base_name);
}
- for (k = 0; k < max_k_idx; k++)
+ for (std::size_t k = 0; k < k_info.size(); k++)
{
/* List "dead" ones */
if (!okayk[k]) continue;
@@ -3225,68 +3237,18 @@ void do_cmd_knowledge_artifacts(void)
}
/* Hack -- Build the artifact name */
- fprintf(fff, " The %s\n", base_name);
+ w.write(" The {}\n", base_name);
}
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Artifacts Seen", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ /* Display */
+ show_string(w.c_str(), "Artifacts Seen");
}
-/*
- * Check the status of traps
- */
-void do_cmd_knowledge_traps(void)
+static int monster_get_race_level(int r_idx)
{
- int k;
-
- FILE *fff;
-
- trap_type *t_ptr;
-
- char file_name[1024];
-
+ auto const &r_info = game->edit_data.r_info;
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- /* Scan the traps */
- for (k = 0; k < max_t_idx; k++)
- {
- /* Get the trap */
- t_ptr = &t_info[k];
-
- /* Skip "empty" traps */
- if (!t_ptr->name) continue;
-
- /* Skip unidentified traps */
- if (!t_ptr->ident) continue;
-
- /* Hack -- Build the trap name */
- fprintf(fff, " %s\n", t_ptr->name);
- }
-
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Traps known", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
-}
-
-
-static int monster_get_race_level(int r_idx) {
/* Hack -- Morgoth is always last */
if (r_idx == 862) {
return 20000;
@@ -3295,40 +3257,23 @@ static int monster_get_race_level(int r_idx) {
return r_info[r_idx].level;
}
-static bool compare_monster_level(int r_idx1, int r_idx2) {
- return monster_get_race_level(r_idx1) < monster_get_race_level(r_idx2);
-}
-
/*
* Display known uniques
- *
- * Note that the player ghosts are ignored. XXX XXX XXX
*/
-static void do_cmd_knowledge_uniques(void)
+static void do_cmd_knowledge_uniques()
{
- int k;
-
- FILE *fff;
-
- char file_name[1024];
-
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
+ auto const &r_info = game->edit_data.r_info;
// Extract the unique race indexes.
- std::vector<int> unique_r_idxs;
- for (k = 1; k < max_r_idx; k++)
+ std::vector<std::size_t> unique_r_idxs;
+ for (std::size_t k = 1; k < r_info.size(); k++)
{
- monster_race *r_ptr = &r_info[k];
+ auto r_ptr = &r_info[k];
/* Only print Uniques */
- if (r_ptr->flags1 & (RF1_UNIQUE) &&
- !(r_ptr->flags7 & RF7_PET) &&
- !(r_ptr->flags7 & RF7_NEUTRAL))
+ if ((r_ptr->flags & RF_UNIQUE) &&
+ !(r_ptr->flags & RF_PET) &&
+ !(r_ptr->flags & RF_NEUTRAL))
{
unique_r_idxs.push_back(k);
}
@@ -3337,48 +3282,41 @@ static void do_cmd_knowledge_uniques(void)
// Sort races by level.
std::sort(std::begin(unique_r_idxs),
std::end(unique_r_idxs),
- compare_monster_level);
+ [](auto r_idx1, auto r_idx2) -> bool {
+ return monster_get_race_level(r_idx1) < monster_get_race_level(r_idx2);
+ });
- /* Scan the monster races */
- for (int r_idx : unique_r_idxs)
+ // Scan the monster races
+ fmt::MemoryWriter w;
+ for (std::size_t r_idx : unique_r_idxs)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
/* Only print Uniques */
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
bool_ dead = (r_ptr->max_num == 0);
- /* Only display "known" uniques */
- if (dead || cheat_know || r_ptr->r_sights)
+ /* Print a message */
+ if (dead)
{
- /* Print a message */
- if (dead)
- {
- fprintf(fff, "[[[[[%c%c] [[[[[R%-68s is dead]\n",
- conv_color[r_ptr->d_attr],
- r_ptr->d_char,
- r_ptr->name);
- }
- else
- {
- fprintf(fff, "[[[[[%c%c] [[[[[w%-68s is alive]\n",
- conv_color[r_ptr->d_attr],
- r_ptr->d_char,
- r_ptr->name);
- }
+ w.write("[[[[[{}{}] [[[[[R{:<68} is dead]\n",
+ static_cast<char>(conv_color[r_ptr->d_attr]),
+ static_cast<char>(r_ptr->d_char),
+ r_ptr->name);
+ }
+ else
+ {
+ w.write("[[[[[{}{}] [[[[[w{:<68} is alive]\n",
+ static_cast<char>(conv_color[r_ptr->d_attr]),
+ static_cast<char>(r_ptr->d_char),
+ r_ptr->name);
}
}
}
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Known Uniques", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ // Display
+ show_string(w.c_str(), "Known Uniques");
}
@@ -3438,29 +3376,29 @@ static void plural_aux(char *name)
}
/* Broken plurals are, well, broken */
- else if (name[name_len - 1] == 'y')
+ else if (name_len >= 1 && name[name_len - 1] == 'y')
{
strcpy(&name[name_len - 1], "ies");
}
- else if (streq(&name[name_len - 4], "ouse"))
+ else if (name_len >= 4 && streq(&name[name_len - 4], "ouse"))
{
strcpy(&name[name_len - 4], "ice");
}
- else if (streq(&name[name_len - 6], "kelman"))
+ else if (name_len >= 6 && streq(&name[name_len - 6], "kelman"))
{
strcpy(&name[name_len - 6], "kelmen");
}
- else if (streq(&name[name_len - 2], "ex"))
+ else if (name_len >= 2 && streq(&name[name_len - 2], "ex"))
{
strcpy(&name[name_len - 2], "ices");
}
- else if (streq(&name[name_len - 3], "olf"))
+ else if (name_len >= 3 && streq(&name[name_len - 3], "olf"))
{
strcpy(&name[name_len - 3], "olves");
}
/* Now begins sane cases */
- else if ((streq(&name[name_len - 2], "ch")) || (name[name_len - 1] == 's'))
+ else if ((name_len >= 2 && streq(&name[name_len - 2], "ch")) || (name_len >= 1 && name[name_len - 1] == 's'))
{
strcpy(&name[name_len], "es");
}
@@ -3474,38 +3412,19 @@ static void plural_aux(char *name)
/*
* Display current pets
*/
-static void do_cmd_knowledge_pets(void)
+static void do_cmd_knowledge_pets()
{
- int i;
-
- FILE *fff;
-
- monster_type *m_ptr;
-
int t_friends = 0;
-
int t_levels = 0;
- int show_upkeep = 0;
-
- int upkeep_divider = 20;
-
- char file_name[1024];
-
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- if (has_ability(AB_PERFECT_CASTING)) upkeep_divider = 15;
+ // Buffer
+ fmt::MemoryWriter w;
/* Process the monsters (backwards) */
- for (i = m_max - 1; i >= 1; i--)
+ for (int i = m_max - 1; i >= 1; i--)
{
/* Access the monster */
- m_ptr = &m_list[i];
+ monster_type *m_ptr = &m_list[i];
/* Ignore "dead" monsters */
if (!m_ptr->r_idx) continue;
@@ -3521,13 +3440,17 @@ static void do_cmd_knowledge_pets(void)
char pet_name[80];
monster_desc(pet_name, m_ptr, 0x88);
- fprintf(fff, "%s%s (%s)\n",
- (r_ptr->flags1 & RF1_UNIQUE) ? "#####G" : "",
- pet_name,
- (m_ptr->status < MSTATUS_COMPANION) ? "pet" : "companion");
+ w.write("{}{} ({})\n",
+ (r_ptr->flags & RF_UNIQUE) ? "#####G" : "",
+ pet_name,
+ (m_ptr->status < MSTATUS_COMPANION) ? "pet" : "companion");
}
}
+ // Calculate upkeep
+ int show_upkeep = 0;
+ int upkeep_divider = p_ptr->has_ability(AB_PERFECT_CASTING) ? 15 : 20;
+
if (t_friends > 1 + (p_ptr->lev / (upkeep_divider)))
{
show_upkeep = (t_levels);
@@ -3536,104 +3459,78 @@ static void do_cmd_knowledge_pets(void)
else if (show_upkeep < 10) show_upkeep = 10;
}
+ // Summary
+ w.write("----------------------------------------------\n");
+ w.write(" Total: {} pet{}.\n", t_friends, (t_friends == 1 ? "" : "s"));
+ w.write(" Upkeep: {}% mana.\n", show_upkeep);
- fprintf(fff, "----------------------------------------------\n");
- fprintf(fff, " Total: %d pet%s.\n", t_friends, (t_friends == 1 ? "" : "s"));
- fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep);
-
-
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Current Pets", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ // Display
+ show_string(w.c_str(), "Current Pets");
}
/*
* Total kill count
- *
- * Note that the player ghosts are ignored. XXX XXX XXX
*/
-static void do_cmd_knowledge_kill_count(void)
+static void do_cmd_knowledge_kill_count()
{
- int k;
-
- FILE *fff;
-
- char file_name[1024];
+ auto const &r_info = game->edit_data.r_info;
s32b Total = 0;
+ // Buffer
+ fmt::MemoryWriter w;
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
+ // Summary of monsters slain
{
- /* Monsters slain */
- int kk;
-
/* For all monsters */
- for (kk = 1; kk < max_r_idx; kk++)
+ for (auto const &r_ref: r_info)
{
- monster_race *r_ptr = &r_info[kk];
+ auto r_ptr = &r_ref;
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
- bool_ dead = (r_ptr->max_num == 0);
-
- if (dead)
+ if (r_ptr->max_num == 0)
{
Total++;
}
}
else
{
- s16b This = r_ptr->r_pkills;
-
- if (This > 0)
- {
- Total += This;
- }
+ Total += std::max<s16b>(r_ptr->r_pkills, 0);
}
}
if (Total < 1)
{
- fprintf(fff, "You have defeated no enemies yet.\n\n");
+ w.write("You have defeated no enemies yet.\n\n");
}
else if (Total == 1)
{
- fprintf(fff, "You have defeated one enemy.\n\n");
+ w.write("You have defeated one enemy.\n\n");
}
else
{
- fprintf(fff, "You have defeated " FMTs32b " enemies.\n\n", Total);
+ w.write("You have defeated {} enemies.\n\n", Total);
}
}
Total = 0;
/* Scan the monster races */
- for (k = 0; k < max_r_idx; k++)
+ for (auto const &r_ref: r_info)
{
- monster_race *r_ptr = &r_info[k];
+ auto r_ptr = &r_ref;
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
bool_ dead = (r_ptr->max_num == 0);
if (dead)
{
/* Print a message */
- fprintf(fff, " %s\n", r_ptr->name);
+ w.write(" {}\n", r_ptr->name);
Total++;
}
}
@@ -3647,11 +3544,11 @@ static void do_cmd_knowledge_kill_count(void)
{
if (strstr(r_ptr->name, "coins"))
{
- fprintf(fff, " 1 pile of %s\n", r_ptr->name);
+ w.write(" 1 pile of {}\n", r_ptr->name);
}
else
{
- fprintf(fff, " 1 %s\n", r_ptr->name);
+ w.write(" 1 {}\n", r_ptr->name);
}
}
else
@@ -3659,7 +3556,7 @@ static void do_cmd_knowledge_kill_count(void)
char to_plural[80];
strcpy(to_plural, r_ptr->name);
plural_aux(to_plural);
- fprintf(fff, " %d %s\n", This, to_plural);
+ w.write(" {} {}\n", This, to_plural);
}
Total += This;
@@ -3667,147 +3564,100 @@ static void do_cmd_knowledge_kill_count(void)
}
}
- fprintf(fff, "----------------------------------------------\n");
- fprintf(fff, " Total: " FMTs32b " creature%s killed.\n", Total, (Total == 1 ? "" : "s"));
-
- /* Close the file */
- my_fclose(fff);
+ w.write("----------------------------------------------\n");
+ w.write(" Total: {} creature{} killed.\n", Total, (Total == 1 ? "" : "s"));
/* Display the file contents */
- show_file(file_name, "Kill Count", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ show_string(w.c_str(), "Kill Count");
}
/*
* Display known objects
*/
-static void do_cmd_knowledge_objects(void)
+static void do_cmd_knowledge_objects()
{
- int k;
-
- FILE *fff;
-
- char o_name[80];
+ auto const &k_info = game->edit_data.k_info;
- char file_name[1024];
-
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
+ fmt::MemoryWriter w;
/* Scan the object kinds */
- for (k = 1; k < max_k_idx; k++)
+ for (std::size_t k = 1; k < k_info.size(); k++)
{
- object_kind *k_ptr = &k_info[k];
+ auto k_ptr = &k_info[k];
/* Hack -- skip artifacts */
- if (k_ptr->flags3 & (TR3_INSTA_ART)) continue;
+ if (k_ptr->flags & (TR_INSTA_ART)) continue;
/* List known flavored objects */
if (k_ptr->flavor && k_ptr->aware)
{
- object_type *i_ptr;
object_type object_type_body;
/* Get local object */
- i_ptr = &object_type_body;
+ object_type *i_ptr = &object_type_body;
/* Create fake object */
object_prep(i_ptr, k);
/* Describe the object */
+ char o_name[80];
object_desc_store(o_name, i_ptr, FALSE, 0);
/* Print a message */
- fprintf(fff, " %s\n", o_name);
+ w.write(" {}\n", o_name);
}
}
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Known Objects", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ // Display
+ show_string(w.c_str(), "Known Objects");
}
/*
* List recall depths
*/
-static void do_cmd_knowledge_dungeons(void)
+static void do_cmd_knowledge_dungeons()
{
- int y;
- char file_name[1024];
- FILE *fff;
+ auto const &d_info = game->edit_data.d_info;
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- /* Oops */
- if (fff == NULL) return;
+ fmt::MemoryWriter w;
/* Scan all dungeons */
- for (y = 1; y < max_d_idx; y++)
+ for (std::size_t y = 1; y < d_info.size(); y++)
{
/* The dungeon has a valid recall depth set */
if (max_dlv[y])
{
/* Describe the recall depth */
- fprintf(fff, " %c%s: Level %d (%d')\n",
- (p_ptr->recall_dungeon == y) ? '*' : ' ',
+ w.write(" {}{}: Level {}\n",
+ (p_ptr->recall_dungeon == y) ? '*' : ' ',
d_info[y].name,
- max_dlv[y], 50 * (max_dlv[y]));
+ max_dlv[y]);
}
}
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Recall Depths", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ // Display
+ show_string(w.c_str(), "Recall Depths");
}
/*
* List known towns
*/
-void do_cmd_knowledge_towns(void)
+void do_cmd_knowledge_towns()
{
- int i, j;
- char file_name[1024];
- FILE *fff;
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
+ auto const &d_info = game->edit_data.d_info;
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- /* Oops */
- if (fff == NULL) return;
+ fmt::MemoryWriter w;
/* Scan all dungeons */
- for (i = 0; i < max_d_idx; i++)
+ for (auto const &d_ref: d_info)
{
- dungeon_info_type *d_ptr = &d_info[i];
+ auto d_ptr = &d_ref;
/* Scan all dungeon town slots */
- for (j = 0; j < TOWN_DUNGEON; j++)
+ for (int j = 0; j < TOWN_DUNGEON; j++)
{
int town_idx = d_ptr->t_idx[j];
@@ -3818,127 +3668,51 @@ void do_cmd_knowledge_towns(void)
if (!(town_info[town_idx].flags & (TOWN_KNOWN))) continue;
/* Describe the dungeon town */
- fprintf(fff, " %s: Level %d (%d')\n",
+ w.write(" {}: Level {}\n",
d_ptr->name,
- d_ptr->t_level[j],
- 50 * d_ptr->t_level[j]);
+ d_ptr->t_level[j]);
}
}
- /* Close the file */
- my_fclose(fff);
-
/* Display the file contents */
- show_file(file_name, "Dungeon Towns", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ show_string(w.c_str(), "Dungeon Towns");
}
/*
* List corruptions
*/
-static void do_cmd_knowledge_corruptions(void)
+static void do_cmd_knowledge_corruptions()
{
- FILE *fff;
-
- char file_name[1024];
-
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- /* Dump the corruptions to file */
- if (fff)
- {
- dump_corruptions(fff, TRUE, FALSE);
- }
-
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Corruptions", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
-}
-
-
-/*
- * Helper function for do_cmd_knowledge_quests
- */
-static void insert_sort_quest(int *order, int *num, int q_idx)
-{
- int i, j;
-
- quest_type *q_ptr = &quest[q_idx];
-
- int level = q_ptr->level;
-
-
- /* Find the place */
- for (i = 0; i < *num; i++)
- {
- quest_type *q2_ptr = &quest[order[i]];
- int level2 = q2_ptr->level;
-
- if (level < level2) break;
- }
-
- /* Move the remaining items */
- for (j = *num - 1; j >= i; j--)
- {
- order[j + 1] = order[j];
- }
-
- /* Insert it */
- order[i] = q_idx;
- (*num)++;
+ show_string(dump_corruptions(true, false).c_str(), "Corruptions");
}
/*
* Print quest status of all active quests
*/
-static void do_cmd_knowledge_quests(void)
+static void do_cmd_knowledge_quests()
{
- FILE *fff;
-
- char file_name[1024];
-
- int order[MAX_Q_IDX] = { };
-
- int num = 0;
-
- int i, j, z;
-
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- for (i = 0; i < MAX_Q_IDX; i++)
- {
- insert_sort_quest(order, &num, i);
- }
-
- for (z = 0; z < MAX_Q_IDX; z++)
+ /* Figure out display order of quests */
+ int order[MAX_Q_IDX];
+ std::iota(order, order + MAX_Q_IDX, 0); // Start with order of definition
+ std::sort(order, order + MAX_Q_IDX, [](int qi, int qj) -> bool {
+ return (quest[qi].level < quest[qj].level);
+ });
+
+ /* Write */
+ fmt::MemoryWriter w;
+ for (int z = 0; z < MAX_Q_IDX; z++)
{
- i = order[z];
+ int const i = order[z];
/* Dynamic descriptions */
if (quest[i].gen_desc != NULL)
{
- if (!quest[i].gen_desc(fff))
+ auto s = quest[i].gen_desc();
+ if (!s.empty())
{
- continue;
+ w.write("{}\n\n", s);
}
}
@@ -3948,68 +3722,42 @@ static void do_cmd_knowledge_quests(void)
if (quest[i].status == QUEST_STATUS_TAKEN)
{
/* Print the quest info */
- fprintf(fff, "#####y%s (Danger level: %d)\n",
+ w.write("#####y{} (Danger level: {})\n",
quest[i].name, quest[i].level);
- j = 0;
+ int j = 0;
while ((j < 10) && (quest[i].desc[j][0] != '\0'))
{
- fprintf(fff, "%s\n", quest[i].desc[j++]);
+ w.write("{}\n", quest[i].desc[j++]);
}
- fprintf(fff, "\n");
+ w.write("\n");
}
else if (quest[i].status == QUEST_STATUS_COMPLETED)
{
- fprintf(fff , "#####G%s Completed - Unrewarded\n", quest[i].name);
- fprintf(fff, "\n");
+ w.write("#####G{} Completed - Unrewarded\n", quest[i].name);
+ w.write("\n");
}
}
}
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Quest status", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ /* Display */
+ show_string(w.c_str(), "Quest status");
}
/*
* Print fate status
*/
-static void do_cmd_knowledge_fates(void)
+static void do_cmd_knowledge_fates()
{
- FILE *fff;
-
- char file_name[1024];
-
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- dump_fates(fff);
-
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Fate status", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
+ show_string(dump_fates().c_str(), "Fate status");
}
/*
* Print the note file
*/
-void do_cmd_knowledge_notes(void)
+void do_cmd_knowledge_notes()
{
/* Spawn */
show_notes_file();
@@ -4022,7 +3770,7 @@ void do_cmd_knowledge_notes(void)
/*
* Interact with "knowledge"
*/
-void do_cmd_knowledge(void)
+void do_cmd_knowledge()
{
int i;
@@ -4052,12 +3800,11 @@ void do_cmd_knowledge(void)
prt("(7) Display current pets", 10, 5);
prt("(8) Display current quests", 11, 5);
prt("(9) Display current fates", 12, 5);
- prt("(0) Display known traps", 13, 5);
- prt("(A) Display known dungeon towns", 14, 5);
- prt("(B) Display notes", 15, 5);
+ prt("(0) Display known dungeon towns", 13, 5);
+ prt("(A) Display notes", 14, 5);
/* Prompt */
- prt("Command: ", 17, 0);
+ prt("Command: ", 16, 0);
/* Prompt */
i = inkey();
@@ -4139,17 +3886,8 @@ void do_cmd_knowledge(void)
break;
}
- /* Traps */
- case '0':
- {
- do_cmd_knowledge_traps();
-
- break;
- }
-
/* Dungeon towns */
- case 'A':
- case 'a':
+ case '0':
{
do_cmd_knowledge_towns();
@@ -4157,8 +3895,8 @@ void do_cmd_knowledge(void)
}
/* Notes */
- case 'B':
- case 'b':
+ case 'A':
+ case 'a':
{
do_cmd_knowledge_notes();
@@ -4190,7 +3928,7 @@ void do_cmd_knowledge(void)
* Check on the status of an active quest -KMW-
* TODO: Spill out status when not a simple kill # monster.
*/
-void do_cmd_checkquest(void)
+void do_cmd_checkquest()
{
/* Enter "icky" mode */
character_icky = TRUE;
@@ -4267,9 +4005,10 @@ void do_cmd_time()
strcpy(desc, "It is a strange time.");
/* Display day */
- u32b days = bst(DAY, turn) + 1;
+ auto days = bst(DAY, turn) + 1;
+ auto days_str = get_day(days);
msg_format("This is the %s day of your adventure.",
- get_day(days));
+ days_str.c_str());
/* Message */
msg_format("The time is %d:%02d %s.",
diff --git a/src/cmd4.hpp b/src/cmd4.hpp
index 4470c94f..39f1c16c 100644
--- a/src/cmd4.hpp
+++ b/src/cmd4.hpp
@@ -2,27 +2,27 @@
#include "h-basic.h"
-extern void macro_recorder_start(void);
-extern void macro_recorder_add(char c);
-extern void macro_recorder_stop(void);
-extern void do_cmd_macro_recorder(void);
-extern void do_cmd_redraw(void);
-extern void do_cmd_change_name(void);
-extern void do_cmd_message_one(void);
-extern void do_cmd_messages(void);
-extern void do_cmd_options(void);
-extern void do_cmd_pref(void);
-extern void do_cmd_macros(void);
-extern void do_cmd_visuals(void);
-extern void do_cmd_colors(void);
-extern void do_cmd_note(void);
-extern void do_cmd_version(void);
-extern void do_cmd_feeling(void);
-extern void do_cmd_load_screen(void);
-extern void do_cmd_save_screen(void);
-extern void do_cmd_knowledge(void);
-extern void do_cmd_checkquest(void);
-extern void do_cmd_change_tactic(int i);
-extern void do_cmd_change_movement(int i);
-extern void do_cmd_time(void);
-extern void do_cmd_options_aux(int page, cptr info, bool_ read_only);
+void macro_recorder_start();
+void macro_recorder_add(char c);
+void macro_recorder_stop();
+void do_cmd_macro_recorder();
+void do_cmd_redraw();
+void do_cmd_change_name();
+void do_cmd_message_one();
+void do_cmd_messages();
+void do_cmd_options();
+void do_cmd_pref();
+void do_cmd_macros();
+void do_cmd_visuals();
+void do_cmd_colors();
+void do_cmd_note();
+void do_cmd_version();
+void do_cmd_feeling();
+void do_cmd_load_screen();
+void do_cmd_save_screen();
+void do_cmd_knowledge();
+void do_cmd_checkquest();
+void do_cmd_change_tactic(int i);
+void do_cmd_change_movement(int i);
+void do_cmd_time();
+void do_cmd_options_aux(int page, cptr info, bool_ read_only);
diff --git a/src/cmd5.cc b/src/cmd5.cc
index a1dd5cbf..a93759b0 100644
--- a/src/cmd5.cc
+++ b/src/cmd5.cc
@@ -12,11 +12,16 @@
#include "cave.hpp"
#include "cave_type.hpp"
#include "corrupt.hpp"
+#include "dungeon_flag.hpp"
+#include "game.hpp"
#include "lua_bind.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_type.hpp"
#include "player_class.hpp"
#include "player_race.hpp"
@@ -35,7 +40,6 @@
#include "util.h"
#include "variable.h"
#include "variable.hpp"
-#include "quark.hpp"
#include "wizard2.hpp"
#include "xtra1.hpp"
#include "xtra2.hpp"
@@ -69,7 +73,7 @@ static object_filter_t const &hook_school_spellable()
static auto instance = Or(
is_school_book(),
And(
- HasFlag5(TR5_SPELL_CONTAIN),
+ HasFlags(TR_SPELL_CONTAIN),
has_pval2));
return instance;
}
@@ -221,22 +225,21 @@ static void browse_school_spell(int book, int spell_idx, object_type *o_ptr)
* and in the dark, primarily to allow browsing in stores.
*/
-extern void do_cmd_browse_aux(object_type *o_ptr)
+void do_cmd_browse_aux(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
if (is_school_book()(o_ptr))
{
browse_school_spell(o_ptr->sval, o_ptr->pval, o_ptr);
}
- else if (f5 & TR5_SPELL_CONTAIN && o_ptr->pval2 != -1)
+ else if ((flags & TR_SPELL_CONTAIN) && (o_ptr->pval2 != -1))
{
browse_school_spell(255, o_ptr->pval2, o_ptr);
}
}
-void do_cmd_browse(void)
+void do_cmd_browse()
{
/* Get an item */
int item;
@@ -283,8 +286,10 @@ static void do_poly_wounds()
}
}
-void do_poly_self(void)
+void do_poly_self()
{
+ auto const &race_info = game->edit_data.race_info;
+
int power = p_ptr->lev;
int poly_power;
@@ -298,25 +303,6 @@ void do_poly_self(void)
/* Some form of racial polymorph... */
power -= 10;
- if ((power > rand_int(5)) && (rand_int(4) == 0))
- {
- /* sex change */
- power -= 2;
-
- if (p_ptr->psex == SEX_MALE)
- {
- p_ptr->psex = SEX_FEMALE;
- sp_ptr = &sex_info[p_ptr->psex];
- strcpy(effect_msg, "female");
- }
- else
- {
- p_ptr->psex = SEX_MALE;
- sp_ptr = &sex_info[p_ptr->psex];
- strcpy(effect_msg, "male");
- }
- }
-
if ((power > rand_int(30)) && (rand_int(5) == 0))
{
int tmp = 0;
@@ -328,14 +314,14 @@ void do_poly_self(void)
{
if ( rand_int(2) == 0)
{
- (void)dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0));
+ dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0));
power -= 1;
}
tmp++;
}
/* Deformities are discriminated against! */
- (void)dec_stat(A_CHR, randint(6), TRUE);
+ dec_stat(A_CHR, randint(6), TRUE);
if (effect_msg[0])
{
@@ -374,34 +360,34 @@ void do_poly_self(void)
/* Roll until an appropriate selection is made */
while (1)
{
- new_race = rand_int(max_rp_idx);
- expfact = race_info[new_race].r_exp;
+ new_race = rand_int(race_info.size());
+ expfact = race_info[new_race].ps.exp;
- if ((new_race != p_ptr->prace) && (expfact <= goalexpfact)) break;
+ if ((new_race != p_ptr->prace) && (expfact <= goalexpfact))
+ {
+ break;
+ }
}
if (effect_msg[0])
{
msg_format("You turn into a%s %s!",
- ((is_a_vowel(*race_info[new_race].title)) ? "n" : ""),
- race_info[new_race].title);
+ (is_a_vowel(race_info[new_race].title[0]) ? "n" : ""),
+ race_info[new_race].title.c_str());
}
else
{
msg_format("You turn into a %s %s!", effect_msg,
- race_info[new_race].title);
+ race_info[new_race].title.c_str());
}
p_ptr->prace = new_race;
rp_ptr = &race_info[p_ptr->prace];
/* Experience factor */
- p_ptr->expfact = rp_ptr->r_exp + rmp_ptr->r_exp + cp_ptr->c_exp;
-
- /* Calculate the height/weight */
- get_height_weight();
-
+ p_ptr->expfact = rp_ptr->ps.exp + rmp_ptr->ps.exp + cp_ptr->ps.exp;
+ /* Level up if necessary */
check_experience();
p_ptr->max_plv = p_ptr->lev;
@@ -423,7 +409,7 @@ void do_poly_self(void)
msg_print("Your internal organs are rearranged!");
while (tmp < 6)
{
- (void)dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0));
+ dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0));
tmp++;
}
if (rand_int(6) == 0)
@@ -552,179 +538,141 @@ void fetch(int dir, int wgt, bool_ require_los)
/*
- * Handle random effects of player shrieking
- */
-void shriek_effect()
-{
- switch (randint(9))
- {
- case 1:
- case 5:
- case 8:
- case 9:
- {
- msg_print("You make a high-pitched shriek!");
- aggravate_monsters(1);
-
- break;
- }
- case 2:
- case 6:
- {
- msg_print("Oops! You call a monster.");
- summon_specific(p_ptr->py, p_ptr->px, max_dlv[dungeon_type], 0);
-
- break;
- }
- case 3:
- case 7:
- {
- msg_print("The dungeon collapses!");
- earthquake(p_ptr->py, p_ptr->px, 5);
-
- break;
- }
- case 4:
- {
- msg_print("Your shriek is so horrible that you damage your health!");
- take_hit(damroll(p_ptr->lev / 5, 8), "inner hemorrhaging");
-
- break;
- }
- }
-}
-
-/*
* Return the symbiote's name or description.
*/
-cptr symbiote_name(bool_ capitalize)
+std::string symbiote_name(bool capitalize)
{
+ auto const &r_info = game->edit_data.r_info;
+
object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY];
- static char buf[80];
- /* Make sure there actually is a symbiote there... */
+ std::string buf;
+ buf.reserve(32);
+
+ // Fallback; shouldn't ever be necessary
if (!o_ptr->k_idx)
{
- strcpy(buf, "A non-existent symbiote");
+ buf += "A non-existent symbiote";
}
else
{
- monster_race *r_ptr = &r_info[o_ptr->pval];
- cptr s = NULL;
+ auto r_ptr = &r_info[o_ptr->pval];
+ std::size_t i = 0;
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
- /* Unique monster; no preceding "your", and ignore our name. */
- strncpy(buf, r_ptr->name, sizeof(buf));
+ // Unique monster; no preceding "your" and ignore name
+ buf += r_ptr->name;
}
- else if (o_ptr->note &&
- (s = strstr(quark_str(o_ptr->note), "#named ")) != NULL)
+ else if ((i = o_ptr->inscription.find("#named ")) != std::string::npos)
{
- /* We've named it. */
- strncpy(buf, s + 7, sizeof(buf));
+ // We've named it; extract the name */
+ buf += o_ptr->inscription.substr(i);
}
else
{
- /* No special cases, just return "Your <monster type>". */
- strcpy(buf, "your ");
- strncpy(buf + 5, r_ptr->name, sizeof(buf) - 5);
+ // No special cases; just return "Your <monster type>".
+ buf += "your ";
+ buf += r_ptr->name;
}
}
- /* Just in case... */
- buf[sizeof(buf) - 1] = '\0';
- if (capitalize) buf[0] = toupper(buf[0]);
+ // Capitalize?
+ if (capitalize)
+ {
+ buf[0] = toupper(buf[0]);
+ }
+
+ // Done
return buf;
}
+
/*
- * Use a power of the monster in symbiosis
+ * Find monster power
*/
-int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost)
+monster_power const *lookup_monster_power(std::size_t idx)
{
- int power = -1;
-
- int num = 0, dir = 0 , i;
-
- int powers[96];
-
- bool_ flag;
-
- int ask, plev = p_ptr->lev;
-
- char choice;
-
- char out_val[160];
-
- monster_race *r_ptr = &r_info[r_idx];
-
- int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
-
- int x = p_ptr->px, y = p_ptr->py, k;
-
- int rad;
-
- int label;
-
-
- /* List the monster powers -- RF4_* */
- for (i = 0; i < 32; i++)
+ for (auto const &p: monster_powers)
{
- if (r_ptr->flags4 & BIT(i))
+ if (p.monster_spell_index == idx)
{
- if (monster_powers[i].great && (!great)) continue;
- if (!monster_powers[i].power) continue;
- powers[num++] = i;
+ return &p;
}
}
+ return nullptr;
+}
- /* List the monster powers -- RF5_* */
- for (i = 0; i < 32; i++)
- {
- if (r_ptr->flags5 & BIT(i))
- {
- if (monster_powers[i + 32].great && (!great)) continue;
- if (!monster_powers[i + 32].power) continue;
- powers[num++] = i + 32;
- }
- }
- /* List the monster powers -- RF6_* */
- for (i = 0; i < 32; i++)
+/*
+ * Extract powers
+ */
+std::vector<monster_power const *> extract_monster_powers(monster_race const *r_ptr, bool great)
+{
+ std::vector<monster_power const *> powers;
+ powers.reserve(MONSTER_POWERS_MAX);
+
+ for (std::size_t i = 0; i < monster_spell_flag_set::nbits; i++)
{
- if (r_ptr->flags6 & BIT(i))
+ if (r_ptr->spells.bit(i))
{
- if (monster_powers[i + 64].great && (!great)) continue;
- if (!monster_powers[i + 64].power) continue;
- powers[num++] = i + 64;
+ if (auto power = lookup_monster_power(i))
+ {
+ if (power->great && (!great))
+ {
+ continue;
+ }
+ powers.push_back(power);
+ }
}
}
+ return powers;
+}
+
+/**
+ * Calculate mana required for a given monster power.
+ */
+static int calc_monster_spell_mana(monster_power const *mp_ptr)
+{
+ int mana = mp_ptr->mana / 10;
+ if (mana > p_ptr->msp) mana = p_ptr->msp;
+ if (!mana) mana = 1;
+ return mana;
+}
+
+/**
+ * Choose a monster power
+ */
+static std::tuple<int, int> choose_monster_power(monster_race const *r_ptr, bool great, bool symbiosis)
+{
+ /* Extract available monster powers */
+ auto powers = extract_monster_powers(r_ptr, great);
+ int const num = powers.size(); // Avoid signed/unsigned warnings
+
if (!num)
{
msg_print("You have no powers you can use.");
- return (0);
+ return std::make_tuple(0, num);
}
- if (only_number) return (num);
-
- /* Nothing chosen yet */
- flag = FALSE;
-
/* Get the last label */
- label = (num <= 26) ? I2A(num - 1) : I2D(num - 1 - 26);
+ int label = (num <= 26) ? I2A(num - 1) : I2D(num - 1 - 26);
/* Build a prompt (accept all spells) */
/* Mega Hack -- if no_cost is false, we're actually a Possessor -dsb */
+ char out_val[160];
strnfmt(out_val, 78,
"(Powers a-%c, ESC=exit) Use which power of your %s? ",
- label, (no_cost ? "symbiote" : "body"));
+ label, (symbiosis ? "symbiote" : "body"));
/* Save the screen */
character_icky = TRUE;
Term_save();
/* Get a spell from the user */
+ monster_power const *power = nullptr;
+ bool_ flag = FALSE; // Nothing chosen yet
while (!flag)
{
/* Show the list */
@@ -732,26 +680,26 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
byte y = 1, x = 0;
int ctr = 0;
char dummy[80];
-
strcpy(dummy, "");
prt ("", y++, x);
while (ctr < num)
{
- monster_power *mp_ptr = &monster_powers[powers[ctr]];
- int mana = mp_ptr->mana / 10;
-
- if (mana > p_ptr->msp) mana = p_ptr->msp;
-
- if (!mana) mana = 1;
+ monster_power const *mp_ptr = powers[ctr];
label = (ctr < 26) ? I2A(ctr) : I2D(ctr - 26);
- if (!no_cost)
+ byte color = TERM_L_GREEN;
+ if (!symbiosis)
{
+ int mana = calc_monster_spell_mana(mp_ptr);
strnfmt(dummy, 80, " %c) %2d %s",
label, mana, mp_ptr->name);
+ // Gray out if player doesn't have enough mana to cast.
+ if (mana > p_ptr->csp) {
+ color = TERM_L_DARK;
+ }
}
else
{
@@ -761,11 +709,11 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
if (ctr < 17)
{
- prt(dummy, y + ctr, x);
+ c_prt(color, dummy, y + ctr, x);
}
else
{
- prt(dummy, y + ctr - 17, x + 40);
+ c_prt(color, dummy, y + ctr - 17, x + 40);
}
ctr++;
@@ -781,6 +729,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
}
}
+ char choice;
if (!get_com(out_val, &choice))
{
flag = FALSE;
@@ -792,6 +741,8 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
choice = 'a';
}
+ int i;
+ int ask;
if (isalpha(choice))
{
/* Note verify */
@@ -818,16 +769,26 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
continue;
}
- /* Save the spell index */
+ /* Save the spell */
power = powers[i];
+ /* Make sure it's actually possible for the player to cast */
+ if (!symbiosis)
+ {
+ if (p_ptr->csp < calc_monster_spell_mana(power))
+ {
+ bell();
+ continue;
+ }
+ }
+
/* Verify it */
if (ask)
{
char tmp_val[160];
/* Prompt */
- strnfmt(tmp_val, 78, "Use %s? ", monster_powers[power].name);
+ strnfmt(tmp_val, 78, "Use %s? ", power->name);
/* Belay that order */
if (!get_check(tmp_val)) continue;
@@ -842,55 +803,60 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
character_icky = FALSE;
/* Abort if needed */
- if (!flag)
+ if (!flag || (power == nullptr))
{
- energy_use = 0;
- return -1;
+ return std::make_tuple(-1, num);
}
- /* 'Powerful' monsters have wider radii */
- if (r_ptr->flags2 & RF2_POWERFUL)
- {
- rad = 1 + (p_ptr->lev / 15);
- }
- else
- {
- rad = 1 + (p_ptr->lev / 20);
- }
+ return std::make_tuple(power->monster_spell_index, num);
+}
+
+/*
+ * Apply the effect of a monster power
+ */
+static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_spell_idx)
+{
+ assert(monster_spell_idx < monster_spell_flag_set::nbits);
+
+ /* Shorthand */
+ int const x = p_ptr->px;
+ int const y = p_ptr->py;
+ int const plev = p_ptr->lev;
+ int const rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
+
+ /* 'Powerful' monsters have wider radii */
+ int rad = (r_ptr->flags & RF_POWERFUL)
+ ? 1 + (p_ptr->lev / 15)
+ : 1 + (p_ptr->lev / 20);
/* Analyse power */
- switch (power)
+ switch (monster_spell_idx)
{
- /**** RF4 (bit position) ****/
-
- /* SHRIEK */
- case 0:
+ case SF_SHRIEK_IDX:
{
aggravate_monsters( -1);
break;
}
- /* MULTIPLY */
- case 1:
+ case SF_MULTIPLY_IDX:
{
do_cmd_wiz_named_friendly(p_ptr->body_monster, FALSE);
break;
}
- /* S_ANIMAL */
- case 2:
+ case SF_S_ANIMAL_IDX:
{
summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE);
break;
}
- /* ROCKET */
- case 3:
+ case SF_ROCKET_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_ROCKET, dir, p_ptr->lev * 12, 1 + (p_ptr->lev / 20));
@@ -898,9 +864,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* ARROW_1 */
- case 4:
+ case SF_ARROW_1_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_ARROW, dir, damroll(1, 6));
@@ -908,9 +874,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* ARROW_2 */
- case 5:
+ case SF_ARROW_2_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_ARROW, dir, damroll(3, 6));
@@ -918,9 +884,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* ARROW_3 */
- case 6:
+ case SF_ARROW_3_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_ARROW, dir, damroll(5, 6));
@@ -928,9 +894,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* ARROW_4 */
- case 7:
+ case SF_ARROW_4_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_ARROW, dir, damroll(7, 6));
@@ -938,9 +904,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_ACID */
- case 8:
+ case SF_BR_ACID_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_ACID, dir, p_ptr->lev * 5, rad);
@@ -948,9 +914,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_ELEC */
- case 9:
+ case SF_BR_ELEC_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_ELEC, dir, p_ptr->lev * 5, rad);
@@ -958,9 +924,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_FIRE */
- case 10:
+ case SF_BR_FIRE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_FIRE, dir, p_ptr->lev * 5, rad);
@@ -968,9 +934,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_COLD */
- case 11:
+ case SF_BR_COLD_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_COLD, dir, p_ptr->lev * 5, rad);
@@ -978,9 +944,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_POIS */
- case 12:
+ case SF_BR_POIS_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_POIS, dir, p_ptr->lev * 5, rad);
@@ -988,9 +954,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_NETH */
- case 13:
+ case SF_BR_NETH_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_NETHER, dir, p_ptr->lev * 5, rad);
@@ -998,9 +964,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_LITE */
- case 14:
+ case SF_BR_LITE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_LITE, dir, p_ptr->lev * 8, rad);
@@ -1008,9 +974,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_DARK */
- case 15:
+ case SF_BR_DARK_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_DARK, dir, p_ptr->lev * 8, rad);
@@ -1018,9 +984,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_CONF */
- case 16:
+ case SF_BR_CONF_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_CONFUSION, dir, p_ptr->lev * 8, rad);
@@ -1028,9 +994,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_SOUN */
- case 17:
+ case SF_BR_SOUN_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_SOUND, dir, p_ptr->lev * 8, rad);
@@ -1038,9 +1004,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_CHAO */
- case 18:
+ case SF_BR_CHAO_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_CHAOS, dir, p_ptr->lev * 7, rad);
@@ -1048,9 +1014,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_DISE */
- case 19:
+ case SF_BR_DISE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_DISENCHANT, dir, p_ptr->lev * 7, rad);
@@ -1058,9 +1024,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_NEXU */
- case 20:
+ case SF_BR_NEXU_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_NEXUS, dir, p_ptr->lev * 5, rad);
@@ -1068,9 +1034,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_TIME */
- case 21:
+ case SF_BR_TIME_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_TIME, dir, p_ptr->lev * 3, rad);
@@ -1078,9 +1044,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_INER */
- case 22:
+ case SF_BR_INER_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_INERTIA, dir, p_ptr->lev * 4, rad);
@@ -1088,9 +1054,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_GRAV */
- case 23:
+ case SF_BR_GRAV_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_GRAVITY, dir, p_ptr->lev * 4, rad);
@@ -1098,9 +1064,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_SHAR */
- case 24:
+ case SF_BR_SHAR_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_SHARDS, dir, p_ptr->lev * 8, rad);
@@ -1108,9 +1074,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_PLAS */
- case 25:
+ case SF_BR_PLAS_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_PLASMA, dir, p_ptr->lev * 3, rad);
@@ -1118,9 +1084,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_WALL */
- case 26:
+ case SF_BR_WALL_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_FORCE, dir, p_ptr->lev * 4, rad);
@@ -1128,9 +1094,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_MANA */
- case 27:
+ case SF_BR_MANA_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_MANA, dir, p_ptr->lev * 5, rad);
@@ -1138,9 +1104,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_NUKE */
- case 28:
+ case SF_BA_NUKE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_NUKE, dir, p_ptr->lev * 8, 1 + (p_ptr->lev / 20));
@@ -1148,9 +1114,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_NUKE */
- case 29:
+ case SF_BR_NUKE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_NUKE, dir, p_ptr->lev * 8, 1 + (p_ptr->lev / 20));
@@ -1158,9 +1124,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_CHAO */
- case 30:
+ case SF_BA_CHAO_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_CHAOS, dir, p_ptr->lev * 4, 2);
@@ -1168,9 +1134,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BR_DISI */
- case 31:
+ case SF_BR_DISI_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_DISINTEGRATE, dir, p_ptr->lev * 5, 1 + (p_ptr->lev / 20));
@@ -1178,12 +1144,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
-
- /**** RF5 (bit position + 32) ****/
-
- /* BA_ACID */
- case 32:
+ case SF_BA_ACID_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_ACID, dir, randint(p_ptr->lev * 6) + 20, 2);
@@ -1191,9 +1154,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_ELEC */
- case 33:
+ case SF_BA_ELEC_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_ELEC, dir, randint(p_ptr->lev * 3) + 20, 2);
@@ -1201,9 +1164,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_FIRE */
- case 34:
+ case SF_BA_FIRE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_FIRE, dir, randint(p_ptr->lev * 7) + 20, 2);
@@ -1211,9 +1174,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_COLD */
- case 35:
+ case SF_BA_COLD_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_COLD, dir, randint(p_ptr->lev * 3) + 20, 2);
@@ -1221,9 +1184,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_POIS */
- case 36:
+ case SF_BA_POIS_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_POIS, dir, damroll(12, 2), 2);
@@ -1231,9 +1194,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_NETH */
- case 37:
+ case SF_BA_NETH_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_NETHER, dir, randint(p_ptr->lev * 4) + 20, 2);
@@ -1241,9 +1204,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_WATE */
- case 38:
+ case SF_BA_WATE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_WATER, dir, randint(p_ptr->lev * 4) + 20, 2);
@@ -1251,9 +1214,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_MANA */
- case 39:
+ case SF_BA_MANA_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_MANA, dir, randint(p_ptr->lev * 3) + 20, 2);
@@ -1261,9 +1224,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BA_DARK */
- case 40:
+ case SF_BA_DARK_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_ball(GF_DARK, dir, randint(p_ptr->lev * 3) + 20, 2);
@@ -1271,15 +1234,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* 41 DRAIN_MANA -- Not available */
-
- /* 42 MIND_BLAST -- Not available */
-
- /* 43 BRAIN_SMASH -- Not available */
-
- /* CAUSE_1 */
- case 44:
+ case SF_CAUSE_1_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_MANA, dir, damroll(3, 8));
@@ -1287,9 +1244,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* CAUSE_2 */
- case 45:
+ case SF_CAUSE_2_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_MANA, dir, damroll(8, 8));
@@ -1297,9 +1254,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* CAUSE_3 */
- case 46:
+ case SF_CAUSE_3_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_MANA, dir, damroll(10, 15));
@@ -1307,9 +1264,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* CAUSE_4 */
- case 47:
+ case SF_CAUSE_4_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_MANA, dir, damroll(15, 15));
@@ -1317,9 +1274,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_ACID */
- case 48:
+ case SF_BO_ACID_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_ACID, dir, damroll(7, 8) + (p_ptr->lev / 3));
@@ -1327,9 +1284,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_ELEC */
- case 49:
+ case SF_BO_ELEC_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_ELEC, dir, damroll(4, 8) + (p_ptr->lev / 3));
@@ -1337,9 +1294,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_FIRE */
- case 50:
+ case SF_BO_FIRE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_FIRE, dir, damroll(9, 8) + (p_ptr->lev / 3));
@@ -1347,9 +1304,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_COLD */
- case 51:
+ case SF_BO_COLD_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_COLD, dir, damroll(6, 8) + (p_ptr->lev / 3));
@@ -1357,9 +1314,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_POIS */
- case 52:
+ case SF_BO_POIS_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_POIS, dir, damroll(7, 8) + (p_ptr->lev / 3));
@@ -1367,9 +1324,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_NETH */
- case 53:
+ case SF_BO_NETH_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_NETHER, dir, damroll(5, 5) + (p_ptr->lev / 3));
@@ -1377,9 +1334,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_WATE */
- case 54:
+ case SF_BO_WATE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_WATER, dir, damroll(10, 10) + (p_ptr->lev / 3));
@@ -1387,9 +1344,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_MANA */
- case 55:
+ case SF_BO_MANA_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_MANA, dir, damroll(3, 8) + (p_ptr->lev / 3));
@@ -1397,9 +1354,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_PLAS */
- case 56:
+ case SF_BO_PLAS_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_PLASMA, dir, damroll(8, 8) + (p_ptr->lev / 3));
@@ -1407,9 +1364,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BO_ICEE */
- case 57:
+ case SF_BO_ICEE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_ICE, dir, damroll(6, 6) + (p_ptr->lev / 3));
@@ -1417,9 +1374,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* MISSILE */
- case 58:
+ case SF_MISSILE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_MISSILE, dir, damroll(2, 6) + (p_ptr->lev / 3));
@@ -1427,9 +1384,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* SCARE */
- case 59:
+ case SF_SCARE_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fear_monster(dir, plev);
@@ -1437,9 +1394,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BLIND */
- case 60:
+ case SF_BLIND_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_CONFUSION, dir, damroll(1, 8) + (p_ptr->lev / 3));
@@ -1447,9 +1404,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* CONF */
- case 61:
+ case SF_CONF_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_CONFUSION, dir, damroll(7, 8) + (p_ptr->lev / 3));
@@ -1457,9 +1414,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* SLOW */
- case 62:
+ case SF_SLOW_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_OLD_SLOW, dir, damroll(6, 8) + (p_ptr->lev / 3));
@@ -1467,9 +1424,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* HOLD */
- case 63:
+ case SF_HOLD_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_OLD_SLEEP, dir, damroll(5, 8) + (p_ptr->lev / 3));
@@ -1477,27 +1434,23 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
-
- /**** RF6 (bit position + 64) ****/
-
- /* HASTE */
- case 64:
+ case SF_HASTE_IDX:
{
if (!p_ptr->fast)
{
- (void)set_fast(randint(20 + (plev) ) + plev, 10);
+ set_fast(randint(20 + (plev) ) + plev, 10);
}
else
{
- (void)set_fast(p_ptr->fast + randint(5), 10);
+ set_fast(p_ptr->fast + randint(5), 10);
}
break;
}
- /* HAND_DOOM */
- case 65:
+ case SF_HAND_DOOM_IDX:
{
+ int dir;
if (!get_aim_dir(&dir)) break;
fire_bolt(GF_MANA, dir, damroll(10, 8) + (p_ptr->lev));
@@ -1505,18 +1458,16 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* HEAL */
- case 66:
+ case SF_HEAL_IDX:
{
hp_player(damroll(8, 5));
break;
}
- /* S_ANIMALS */
- case 67:
+ case SF_S_ANIMALS_IDX:
{
- for (k = 0; k < 4; k++)
+ for (int k = 0; k < 4; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE);
}
@@ -1524,10 +1475,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* BLINK */
- case 68:
+ case SF_BLINK_IDX:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels...");
break;
@@ -1538,10 +1488,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* TPORT */
- case 69:
+ case SF_TPORT_IDX:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels...");
break;
@@ -1552,12 +1501,11 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* TELE_TO */
- case 70:
+ case SF_TELE_TO_IDX:
{
int ii, ij;
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels...");
break;
@@ -1570,8 +1518,8 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
p_ptr->energy -= 60 - plev;
if (!cave_empty_bold(ij, ii) ||
- (cave[ij][ii].info & CAVE_ICKY) ||
- (distance(ij, ii, p_ptr->py, p_ptr->px) > plev * 20 + 2))
+ (cave[ij][ii].info & CAVE_ICKY) ||
+ (distance(ij, ii, p_ptr->py, p_ptr->px) > plev * 20 + 2))
{
msg_print("You fail to show the destination correctly!");
p_ptr->energy -= 100;
@@ -1582,26 +1530,25 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* TELE_AWAY */
- case 71:
+ case SF_TELE_AWAY_IDX:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels...");
break;
}
+ int dir;
if (!get_aim_dir(&dir)) break;
- (void)fire_beam(GF_AWAY_ALL, dir, plev);
+ fire_beam(GF_AWAY_ALL, dir, plev);
break;
}
- /* TELE_LEVEL */
- case 72:
+ case SF_TELE_LEVEL_IDX:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels...");
break;
@@ -1612,11 +1559,10 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* DARKNESS */
- case 73:
+ case SF_DARKNESS_IDX:
{
- (void)project( -1, 3, p_ptr->py, p_ptr->px, 0, GF_DARK_WEAK,
- PROJECT_GRID | PROJECT_KILL);
+ project( -1, 3, p_ptr->py, p_ptr->px, 0, GF_DARK_WEAK,
+ PROJECT_GRID | PROJECT_KILL);
/* Unlite the room */
unlite_room(p_ptr->py, p_ptr->px);
@@ -1624,34 +1570,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* TRAPS */
- case 74:
+ case SF_S_THUNDERLORD_IDX:
{
- trap_creation();
-
- break;
- }
-
- /* 75 FORGET -- Not available */
-
- /* ANIM_DEAD -- Use the same code as the nether spell */
- case 76:
- {
- if (!get_aim_dir(&dir)) break;
-
- fire_ball(GF_RAISE, dir, 1, 0);
-
- break;
- }
-
- /* 77 S_BUG -- Not available, well we do that anyway ;) */
-
- /* 78 S_RNG -- Not available, who dares? */
-
- /* S_THUNDERLORD */
- case 79:
- {
- for (k = 0; k < 1; k++)
+ for (int k = 0; k < 1; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_THUNDERLORD, TRUE);
}
@@ -1659,13 +1580,12 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_KIN -- Summon Kin, because we code bugs :) */
- case 80:
+ case SF_S_KIN_IDX:
{
/* Big hack */
summon_kin_type = r_ptr->d_char;
- for (k = 0; k < 6; k++)
+ for (int k = 0; k < 6; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_KIN, TRUE);
}
@@ -1673,10 +1593,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_HI_DEMON */
- case 81:
+ case SF_S_HI_DEMON_IDX:
{
- for (k = 0; k < 1; k++)
+ for (int k = 0; k < 1; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_HI_DEMON, TRUE);
}
@@ -1684,10 +1603,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_MONSTER */
- case 82:
+ case SF_S_MONSTER_IDX:
{
- for (k = 0; k < 1; k++)
+ for (int k = 0; k < 1; k++)
{
summon_specific_friendly(y, x, rlev, 0, TRUE);
}
@@ -1695,10 +1613,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_MONSTERS */
- case 83:
+ case SF_S_MONSTERS_IDX:
{
- for (k = 0; k < 6; k++)
+ for (int k = 0; k < 6; k++)
{
summon_specific_friendly(y, x, rlev, 0, TRUE);
}
@@ -1706,10 +1623,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_ANT */
- case 84:
+ case SF_S_ANT_IDX:
{
- for (k = 0; k < 6; k++)
+ for (int k = 0; k < 6; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_ANT, TRUE);
}
@@ -1717,10 +1633,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_SPIDER */
- case 85:
+ case SF_S_SPIDER_IDX:
{
- for (k = 0; k < 6; k++)
+ for (int k = 0; k < 6; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_SPIDER, TRUE);
}
@@ -1728,10 +1643,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_HOUND */
- case 86:
+ case SF_S_HOUND_IDX:
{
- for (k = 0; k < 6; k++)
+ for (int k = 0; k < 6; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_HOUND, TRUE);
}
@@ -1739,10 +1653,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_HYDRA */
- case 87:
+ case SF_S_HYDRA_IDX:
{
- for (k = 0; k < 6; k++)
+ for (int k = 0; k < 6; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_HYDRA, TRUE);
}
@@ -1750,10 +1663,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_ANGEL */
- case 88:
+ case SF_S_ANGEL_IDX:
{
- for (k = 0; k < 1; k++)
+ for (int k = 0; k < 1; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_ANGEL, TRUE);
}
@@ -1761,10 +1673,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_DEMON */
- case 89:
+ case SF_S_DEMON_IDX:
{
- for (k = 0; k < 1; k++)
+ for (int k = 0; k < 1; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_DEMON, TRUE);
}
@@ -1772,10 +1683,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_UNDEAD */
- case 90:
+ case SF_S_UNDEAD_IDX:
{
- for (k = 0; k < 1; k++)
+ for (int k = 0; k < 1; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_UNDEAD, TRUE);
}
@@ -1783,10 +1693,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_DRAGON */
- case 91:
+ case SF_S_DRAGON_IDX:
{
- for (k = 0; k < 1; k++)
+ for (int k = 0; k < 1; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_DRAGON, TRUE);
}
@@ -1794,10 +1703,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_HI_UNDEAD */
- case 92:
+ case SF_S_HI_UNDEAD_IDX:
{
- for (k = 0; k < 8; k++)
+ for (int k = 0; k < 8; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_HI_UNDEAD_NO_UNIQUES, TRUE);
}
@@ -1805,10 +1713,9 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_HI_DRAGON */
- case 93:
+ case SF_S_HI_DRAGON_IDX:
{
- for (k = 0; k < 8; k++)
+ for (int k = 0; k < 8; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_HI_DRAGON_NO_UNIQUES, TRUE);
}
@@ -1816,38 +1723,43 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
break;
}
- /* S_WRAITH */
- case 94:
+ case SF_S_WRAITH_IDX:
{
- for (k = 0; k < 8; k++)
+ for (int k = 0; k < 8; k++)
{
summon_specific_friendly(y, x, rlev, SUMMON_WRAITH, TRUE);
}
break;
}
-
- /* 95 S_UNIQUE -- Not available */
}
+}
- /* Take some SP */
- if (!no_cost)
- {
- int chance, pchance;
-
- chance = (monster_powers[power].mana + r_ptr->level);
- pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION);
- if (rand_int(chance) >= pchance)
- {
- int m = monster_powers[power].mana / 10;
+/*
+ * Use a monster power and call the given callback.
+ */
+static int use_monster_power_aux(monster_race const *r_ptr, bool great, bool symbiosis, std::function<void(monster_power const *power)> f)
+{
+ int power;
+ int num;
+ std::tie(power, num) = choose_monster_power(r_ptr, great, symbiosis);
+
+ // Early exit?
+ if (power == 0) {
+ // No powers available
+ return 0;
+ } else if (power < 0) {
+ // Canceled by user
+ energy_use = 0;
+ return -1;
+ }
- if (m > p_ptr->msp) m = p_ptr->msp;
- if (!m) m = 1;
+ // Apply the effect
+ apply_monster_power(r_ptr, power);
- p_ptr->csp -= m;
- }
- }
+ // Post-processing
+ f(&monster_powers[power]);
/* Redraw mana */
p_ptr->redraw |= (PR_FRAME);
@@ -1858,6 +1770,38 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost
return (num);
}
+/**
+ * Use a power of the monster in symbiosis
+ */
+int use_symbiotic_power(int r_idx, bool great)
+{
+ auto const &r_info = game->edit_data.r_info;
+
+ monster_race const *r_ptr = &r_info[r_idx];
+ return use_monster_power_aux(r_ptr, great, true, [](monster_power const *) {
+ // Don't need to do anything post-cast.
+ });
+}
+
+/**
+ * Use a power of a possessed body.
+ */
+void use_monster_power(int r_idx, bool great)
+{
+ auto const &r_info = game->edit_data.r_info;
+
+ monster_race const *r_ptr = &r_info[r_idx];
+ use_monster_power_aux(r_ptr, great, false, [r_ptr](monster_power const *power) {
+ // Sometimes give a free cast.
+ int chance = (power->mana + r_ptr->level);
+ int pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION);
+ if (rand_int(chance) >= pchance)
+ {
+ p_ptr->csp -= calc_monster_spell_mana(power);
+ }
+ });
+}
+
/*
* Schooled magic
*/
@@ -1888,11 +1832,10 @@ boost::optional<int> get_item_hook_find_spell(object_filter_t const &)
object_type *o_ptr = &p_ptr->inventory[i];
/* Extract object flags */
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Must we wield it to cast from it? */
- if ((wield_slot(o_ptr) != -1) && (i < INVEN_WIELD) && (f5 & TR5_WIELD_CAST))
+ if ((wield_slot(o_ptr) != -1) && (i < INVEN_WIELD) && (flags & TR_WIELD_CAST))
{
continue;
}
@@ -1901,7 +1844,7 @@ boost::optional<int> get_item_hook_find_spell(object_filter_t const &)
if (!is_school_book()(o_ptr))
{
/* Does it contain the appropriate spell? */
- if ((f5 & TR5_SPELL_CONTAIN) && (o_ptr->pval2 == spell))
+ if ((flags & TR_SPELL_CONTAIN) && (o_ptr->pval2 == spell))
{
hack_force_spell = spell;
hack_force_spell_pval = o_ptr->pval;
@@ -1961,7 +1904,6 @@ s32b get_school_spell(cptr do_what, s16b force_book)
object_type *o_ptr, forge;
int tmp;
int sval, pval;
- u32b f1, f2, f3, f4, f5, esp;
hack_force_spell = -1;
hack_force_spell_pval = -1;
@@ -1987,10 +1929,10 @@ s32b get_school_spell(cptr do_what, s16b force_book)
/* Get the item */
o_ptr = get_object(item);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const f = object_flags(o_ptr);
/* If it can be wielded, it must */
- if ((wield_slot(o_ptr) != -1) && (item < INVEN_WIELD) && (f5 & TR5_WIELD_CAST))
+ if ((wield_slot(o_ptr) != -1) && (item < INVEN_WIELD) && (f & TR_WIELD_CAST))
{
msg_format("You cannot %s from that object; it must be wielded first.", do_what);
return -1;
@@ -2178,10 +2120,9 @@ void cast_school_spell()
/* Can it contains a schooled spell ? */
static bool hook_school_can_spellable(object_type const *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const f = object_flags(o_ptr);
- return ((f5 & TR5_SPELL_CONTAIN) && (o_ptr->pval2 == -1));
+ return ((f & TR_SPELL_CONTAIN) && (o_ptr->pval2 == -1));
}
/*
diff --git a/src/cmd5.hpp b/src/cmd5.hpp
index 1b3b062a..d25efb73 100644
--- a/src/cmd5.hpp
+++ b/src/cmd5.hpp
@@ -2,15 +2,22 @@
#include "h-basic.h"
#include "object_type_fwd.hpp"
+#include "monster_race_fwd.hpp"
+#include "monster_power_fwd.hpp"
-extern bool_ is_magestaff(void);
-extern void do_cmd_browse_aux(object_type *o_ptr);
-extern void do_cmd_browse(void);
-extern void fetch(int dir, int wgt, bool_ require_los);
-extern void do_poly_self(void);
-extern cptr symbiote_name(bool_ capitalize);
-extern int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost);
-extern bool_ is_ok_spell(s32b spell_idx, s32b pval);
-extern s32b get_school_spell(cptr do_what, s16b force_book);
-extern void do_cmd_copy_spell(void);
-extern void cast_school_spell(void);
+#include <string>
+#include <vector>
+
+bool_ is_magestaff();
+void do_cmd_browse_aux(object_type *o_ptr);
+void do_cmd_browse();
+void fetch(int dir, int wgt, bool_ require_los);
+void do_poly_self();
+std::string symbiote_name(bool capitalize);
+int use_symbiotic_power(int r_idx, bool great);
+void use_monster_power(int r_idx, bool great);
+bool_ is_ok_spell(s32b spell_idx, s32b pval);
+s32b get_school_spell(cptr do_what, s16b force_book);
+void do_cmd_copy_spell();
+void cast_school_spell();
+std::vector<monster_power const *> extract_monster_powers(monster_race const *r_ptr, bool great);
diff --git a/src/cmd6.cc b/src/cmd6.cc
index 0a5595fa..e36f0cb6 100644
--- a/src/cmd6.cc
+++ b/src/cmd6.cc
@@ -14,9 +14,11 @@
#include "cmd1.hpp"
#include "cmd7.hpp"
#include "corrupt.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
#include "ego_item_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hook_eat_in.hpp"
#include "hook_eat_out.hpp"
#include "hooks.hpp"
@@ -24,12 +26,16 @@
#include "mimic.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "options.hpp"
+#include "player_race_flag.hpp"
#include "player_type.hpp"
#include "randart.hpp"
#include "skills.hpp"
@@ -55,12 +61,6 @@
using boost::algorithm::iequals;
/*
- * Forward declare
- */
-static bool_ activate_spell(object_type * o_ptr, byte choice);
-
-
-/*
* General function to find an item by its name
*/
static select_by_name_t select_object_by_name(std::string const &prompt)
@@ -148,7 +148,9 @@ static select_by_name_t select_object_by_name(std::string const &prompt)
*/
static void corpse_effect(object_type *o_ptr, bool_ cutting)
{
- monster_race *r_ptr = &r_info[o_ptr->pval2];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[o_ptr->pval2];
/* Assume no bad effects */
bool_ harmful = FALSE;
@@ -538,7 +540,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
*/
/* Acid */
- if (r_ptr->flags4 & RF4_BR_ACID && brpow > 0)
+ if ((r_ptr->spells & SF_BR_ACID) && brpow > 0)
{
brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3));
@@ -553,13 +555,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
o_ptr->pval = 1;
}
- else if (r_ptr->flags4 & RF4_BR_ACID)
+ else if (r_ptr->spells & SF_BR_ACID)
{
set_oppose_acid(p_ptr->oppose_acid + rand_int(10) + 10);
}
/* Electricity */
- if (r_ptr->flags4 & RF4_BR_ELEC && brpow > 0)
+ if ((r_ptr->spells & SF_BR_ELEC) && brpow > 0)
{
brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3));
@@ -575,13 +577,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
o_ptr->weight = o_ptr->weight - brpow;
o_ptr->pval = o_ptr->weight;
}
- else if (r_ptr->flags4 & RF4_BR_ELEC)
+ else if (r_ptr->spells & SF_BR_ELEC)
{
set_oppose_elec(p_ptr->oppose_elec + rand_int(10) + 10);
}
/* Fire */
- if (r_ptr->flags4 & RF4_BR_FIRE && brpow > 0)
+ if ((r_ptr->spells & SF_BR_FIRE) && brpow > 0)
{
brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3));
@@ -596,13 +598,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
o_ptr->pval = 1;
}
- else if (r_ptr->flags4 & RF4_BR_FIRE)
+ else if (r_ptr->spells & SF_BR_FIRE)
{
set_oppose_fire(p_ptr->oppose_fire + rand_int(10) + 10);
}
/* Cold */
- if (r_ptr->flags4 & RF4_BR_COLD && brpow > 0)
+ if ((r_ptr->spells & SF_BR_COLD) && brpow > 0)
{
brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3));
@@ -618,13 +620,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
o_ptr->weight = o_ptr->weight - brpow;
o_ptr->pval = o_ptr->weight;
}
- else if (r_ptr->flags4 & RF4_BR_COLD)
+ else if (r_ptr->spells & SF_BR_COLD)
{
set_oppose_cold(p_ptr->oppose_cold + rand_int(10) + 10);
}
/* Poison */
- if (r_ptr->flags4 & RF4_BR_POIS && brpow > 0)
+ if ((r_ptr->spells & SF_BR_POIS) && brpow > 0)
{
brdam = ((brpow / 3) > 800 ? 800 : (brpow / 3));
@@ -636,7 +638,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
{
- (void)set_poisoned(p_ptr->poisoned + rand_int(brdam) + 10);
+ set_poisoned(p_ptr->poisoned + rand_int(brdam) + 10);
}
/* Take damage */
@@ -647,7 +649,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
/* Nether */
- if (r_ptr->flags4 & RF4_BR_NETH && brpow > 0)
+ if ((r_ptr->spells & SF_BR_NETH) && brpow > 0)
{
brdam = ((brpow / 6) > 550 ? 550 : (brpow / 6));
@@ -684,7 +686,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
/* Confusion */
- if (r_ptr->flags4 & RF4_BR_CONF && brpow > 0)
+ if ((r_ptr->spells & SF_BR_CONF) && brpow > 0)
{
msg_print("A strange liquid splashes on you!");
@@ -697,7 +699,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
/* Chaos */
- if (r_ptr->flags4 & RF4_BR_CHAO && brpow > 0)
+ if ((r_ptr->spells & SF_BR_CHAO) && brpow > 0)
{
brdam = ((brpow / 6) > 600 ? 600 : (brpow / 6));
@@ -711,12 +713,12 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
if (!p_ptr->resist_conf)
{
- (void)set_confused(p_ptr->confused + rand_int(20) + 10);
+ set_confused(p_ptr->confused + rand_int(20) + 10);
}
if (!p_ptr->resist_chaos)
{
- (void)set_image(p_ptr->image + randint(10));
+ set_image(p_ptr->image + randint(10));
}
if (!p_ptr->resist_neth && !p_ptr->resist_chaos)
@@ -743,7 +745,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
/* Disenchantment */
- if (r_ptr->flags4 & RF4_BR_DISE && brpow > 0)
+ if ((r_ptr->spells & SF_BR_DISE) && brpow > 0)
{
brdam = ((brpow / 6) > 500 ? 500 : (brpow / 6));
@@ -756,7 +758,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
else
{
- (void)apply_disenchant(0);
+ apply_disenchant(0);
}
/* Take damage */
@@ -765,7 +767,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
/* Plasma */
- if (r_ptr->flags4 & RF4_BR_PLAS && brpow > 0)
+ if ((r_ptr->spells & SF_BR_PLAS) && brpow > 0)
{
brdam = ((brpow / 6) > 150 ? 150 : (brpow / 6));
@@ -777,7 +779,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
if (!p_ptr->resist_sound)
{
int k = (randint((brdam > 40) ? 35 : (brdam * 3 / 4 + 5)));
- (void)set_stun(p_ptr->stun + k);
+ set_stun(p_ptr->stun + k);
}
/* Take damage */
@@ -787,7 +789,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
}
/* Hack -- Jellies are immune to acid only if they are already acidic */
- if (strchr("j", r_ptr->d_char) && (r_ptr->flags3 & RF3_IM_ACID))
+ if (strchr("j", r_ptr->d_char) && (r_ptr->flags & RF_IM_ACID))
{
dam = damroll(8, 8);
@@ -809,7 +811,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
* are immune to poison because their body already contains
* poisonous chemicals.
*/
- if (strchr("ijkmS,", r_ptr->d_char) && (r_ptr->flags3 & RF3_IM_POIS))
+ if (strchr("ijkmS,", r_ptr->d_char) && (r_ptr->flags & RF_IM_POIS))
{
if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
{
@@ -824,82 +826,82 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
*/
if (!harmful && !cutting && (o_ptr->sval != SV_CORPSE_MEAT))
{
- if (r_ptr->flags3 & RF3_IM_ACID)
+ if (r_ptr->flags & RF_IM_ACID)
{
set_oppose_acid(p_ptr->oppose_acid + rand_int(10) + 10);
}
- if (r_ptr->flags3 & RF3_IM_ELEC)
+ if (r_ptr->flags & RF_IM_ELEC)
{
set_oppose_elec(p_ptr->oppose_elec + rand_int(10) + 10);
}
- if (r_ptr->flags3 & RF3_IM_FIRE)
+ if (r_ptr->flags & RF_IM_FIRE)
{
set_oppose_fire(p_ptr->oppose_fire + rand_int(10) + 10);
}
- if (r_ptr->flags3 & RF3_IM_COLD)
+ if (r_ptr->flags & RF_IM_COLD)
{
set_oppose_cold(p_ptr->oppose_cold + rand_int(10) + 10);
}
- if (r_ptr->flags3 & RF3_IM_POIS)
+ if (r_ptr->flags & RF_IM_POIS)
{
set_oppose_pois(p_ptr->oppose_pois + rand_int(10) + 10);
}
- if (r_ptr->flags3 & RF3_RES_NETH)
+ if (r_ptr->flags & RF_RES_NETH)
{
set_protevil(p_ptr->protevil + rand_int(25) + 3 * r_ptr->level);
}
- if (r_ptr->flags3 & RF3_RES_PLAS)
+ if (r_ptr->flags & RF_RES_PLAS)
{
set_oppose_fire(p_ptr->oppose_fire + rand_int(20) + 20);
}
- if (r_ptr->flags2 & RF2_SHAPECHANGER)
+ if (r_ptr->flags & RF_SHAPECHANGER)
{
- /* DGDGDG (void)set_mimic(20 , rand_int(MIMIC_VALAR)); */
+ /* DGDGDG set_mimic(20 , rand_int(MIMIC_VALAR)); */
}
- if (r_ptr->flags3 & RF3_DEMON)
+ if (r_ptr->flags & RF_DEMON)
{
- /* DGDGDG (void)set_mimic(30 , MIMIC_DEMON); */
+ /* DGDGDG set_mimic(30 , MIMIC_DEMON); */
}
- if (r_ptr->flags3 & RF3_UNDEAD)
+ if (r_ptr->flags & RF_UNDEAD)
{
- /* DGDGDG (void)set_mimic(30 , MIMIC_VAMPIRE); */
+ /* DGDGDG set_mimic(30 , MIMIC_VAMPIRE); */
}
- if (r_ptr->flags3 & RF3_NO_FEAR)
+ if (r_ptr->flags & RF_NO_FEAR)
{
- (void)set_afraid(0);
+ set_afraid(0);
}
- if (r_ptr->flags3 & RF3_NO_STUN)
+ if (r_ptr->flags & RF_NO_STUN)
{
- (void)set_stun(0);
+ set_stun(0);
}
- if (r_ptr->flags3 & RF3_NO_CONF)
+ if (r_ptr->flags & RF_NO_CONF)
{
- (void)set_confused(0);
+ set_confused(0);
}
- if (r_ptr->flags6 & RF6_S_THUNDERLORD)
+ if (r_ptr->spells & SF_S_THUNDERLORD)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_THUNDERLORD, FALSE);
}
- if (r_ptr->flags6 & RF6_S_DEMON)
+ if (r_ptr->spells & SF_S_DEMON)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DEMON, FALSE);
}
- if (r_ptr->flags6 & RF6_S_KIN)
+ if (r_ptr->spells & SF_S_KIN)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_KIN, FALSE);
}
- if (r_ptr->flags6 & RF6_S_HI_DEMON)
+ if (r_ptr->spells & SF_S_HI_DEMON)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DEMON, FALSE);
}
- if (r_ptr->flags6 & RF6_S_MONSTER)
+ if (r_ptr->spells & SF_S_MONSTER)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, 0, FALSE);
}
- if (r_ptr->flags6 & RF6_S_MONSTERS)
+ if (r_ptr->spells & SF_S_MONSTERS)
{
int k;
for (k = 0; k < 8; k++)
@@ -907,47 +909,47 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting)
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, 0, FALSE);
}
}
- if (r_ptr->flags6 & RF6_S_UNDEAD)
+ if (r_ptr->spells & SF_S_UNDEAD)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNDEAD, FALSE);
}
- if (r_ptr->flags6 & RF6_S_DRAGON)
+ if (r_ptr->spells & SF_S_DRAGON)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DRAGON, FALSE);
}
- if (r_ptr->flags6 & RF6_S_ANT)
+ if (r_ptr->spells & SF_S_ANT)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANT, FALSE);
}
- if (r_ptr->flags6 & RF6_S_SPIDER)
+ if (r_ptr->spells & SF_S_SPIDER)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_SPIDER, FALSE);
}
- if (r_ptr->flags6 & RF6_S_HOUND)
+ if (r_ptr->spells & SF_S_HOUND)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HOUND, FALSE);
}
- if (r_ptr->flags6 & RF6_S_HYDRA)
+ if (r_ptr->spells & SF_S_HYDRA)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HYDRA, FALSE);
}
- if (r_ptr->flags6 & RF6_S_ANGEL)
+ if (r_ptr->spells & SF_S_ANGEL)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANGEL, FALSE);
}
- if (r_ptr->flags6 & RF6_S_HI_DRAGON)
+ if (r_ptr->spells & SF_S_HI_DRAGON)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DRAGON, FALSE);
}
- if (r_ptr->flags6 & RF6_S_HI_UNDEAD)
+ if (r_ptr->spells & SF_S_HI_UNDEAD)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_UNDEAD, FALSE);
}
- if (r_ptr->flags6 & RF6_S_WRAITH)
+ if (r_ptr->spells & SF_S_WRAITH)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_WRAITH, FALSE);
}
- if (r_ptr->flags6 & RF6_S_UNIQUE)
+ if (r_ptr->spells & SF_S_UNIQUE)
{
summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNIQUE, FALSE);
}
@@ -972,14 +974,15 @@ static object_filter_t const &item_tester_hook_eatable()
/*
* Eat some food (from the pack or floor)
*/
-void do_cmd_eat_food(void)
+void do_cmd_eat_food()
{
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+
int ident, lev, fval = 0;
object_type *q_ptr, forge;
- monster_race *r_ptr;
-
bool_ destroy = TRUE;
/* Get an item */
@@ -997,10 +1000,6 @@ void do_cmd_eat_food(void)
/* Get the item */
object_type *o_ptr = get_object(item);
- /* Sound */
- sound(SOUND_EAT);
-
-
/* Take a turn */
energy_use = 100;
@@ -1114,7 +1113,7 @@ void do_cmd_eat_food(void)
case SV_FOOD_WEAKNESS:
{
take_hit(damroll(6, 6), "poisonous food");
- (void)do_dec_stat(A_STR, STAT_DEC_NORMAL);
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
ident = TRUE;
@@ -1124,7 +1123,7 @@ void do_cmd_eat_food(void)
case SV_FOOD_SICKNESS:
{
take_hit(damroll(6, 6), "poisonous food");
- (void)do_dec_stat(A_CON, STAT_DEC_NORMAL);
+ do_dec_stat(A_CON, STAT_DEC_NORMAL);
ident = TRUE;
@@ -1134,7 +1133,7 @@ void do_cmd_eat_food(void)
case SV_FOOD_STUPIDITY:
{
take_hit(damroll(8, 8), "poisonous food");
- (void)do_dec_stat(A_INT, STAT_DEC_NORMAL);
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
ident = TRUE;
@@ -1144,7 +1143,7 @@ void do_cmd_eat_food(void)
case SV_FOOD_NAIVETY:
{
take_hit(damroll(8, 8), "poisonous food");
- (void)do_dec_stat(A_WIS, STAT_DEC_NORMAL);
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
ident = TRUE;
@@ -1154,7 +1153,7 @@ void do_cmd_eat_food(void)
case SV_FOOD_UNHEALTH:
{
take_hit(damroll(10, 10), "poisonous food");
- (void)do_dec_stat(A_CON, STAT_DEC_NORMAL);
+ do_dec_stat(A_CON, STAT_DEC_NORMAL);
ident = TRUE;
@@ -1164,7 +1163,7 @@ void do_cmd_eat_food(void)
case SV_FOOD_DISEASE:
{
take_hit(damroll(10, 10), "poisonous food");
- (void)do_dec_stat(A_STR, STAT_DEC_NORMAL);
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
ident = TRUE;
@@ -1308,8 +1307,8 @@ void do_cmd_eat_food(void)
case SV_FOOD_WAYBREAD:
{
msg_print("That tastes very good.");
- (void)set_poisoned(0);
- (void)hp_player(damroll(4, 8));
+ set_poisoned(0);
+ hp_player(damroll(4, 8));
set_food(PY_FOOD_MAX - 1);
ident = TRUE;
@@ -1330,7 +1329,7 @@ void do_cmd_eat_food(void)
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
break;
}
@@ -1339,9 +1338,9 @@ void do_cmd_eat_food(void)
{
msg_print("A fresh, clean essence rises, driving away wounds and poison.");
- (void)set_poisoned(0);
- (void)set_stun(0);
- (void)set_cut(0);
+ set_poisoned(0);
+ set_stun(0);
+ set_cut(0);
if (p_ptr->black_breath)
{
msg_print("The hold of the Black Breath on you is broken!");
@@ -1358,7 +1357,7 @@ void do_cmd_eat_food(void)
/* Corpses... */
else
{
- r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
/* Analyse the corpse */
switch (o_ptr->sval)
@@ -1370,7 +1369,7 @@ void do_cmd_eat_food(void)
/* Not all is edible. Apologies if messy. */
/* Check weight -- they have to have some meat left */
- if (r_ptr->flags9 & RF9_DROP_SKELETON)
+ if (r_ptr->flags & RF_DROP_SKELETON)
{
if (o_ptr->weight <= (r_ptr->weight * 3) / 5)
{
@@ -1491,10 +1490,10 @@ void do_cmd_eat_food(void)
/* Food can feed the player, in a different ways */
/* Vampires */
- if ((race_flags1_p(PR1_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire")))
+ if ((race_flags_p(PR_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire")))
{
/* Reduced nutritional benefit */
- /* (void)set_food(p_ptr->food + (fval / 10)); -- No more */
+ /* set_food(p_ptr->food + (fval / 10)); -- No more */
msg_print("Mere victuals hold scant sustenance for a being such as yourself.");
/* Hungry */
@@ -1504,9 +1503,9 @@ void do_cmd_eat_food(void)
}
}
- else if (race_flags1_p(PR1_NO_FOOD))
+ else if (race_flags_p(PR_NO_FOOD))
{
- if (race_flags1_p(PR1_UNDEAD))
+ if (race_flags_p(PR_UNDEAD))
{
msg_print("The food of mortals is poor sustenance for you.");
}
@@ -1520,7 +1519,7 @@ void do_cmd_eat_food(void)
/* Those living in fresh */
else
{
- (void)set_food(p_ptr->food + fval);
+ set_food(p_ptr->food + fval);
}
@@ -1535,8 +1534,10 @@ void do_cmd_eat_food(void)
/*
* Cut a corpse up for convenient storage
*/
-void do_cmd_cut_corpse(void)
+void do_cmd_cut_corpse()
{
+ auto const &r_info = game->edit_data.r_info;
+
int item, meat = 0, not_meat = 0;
/* Get an item */
@@ -1552,7 +1553,7 @@ void do_cmd_cut_corpse(void)
/* Get the item */
object_type *o_ptr = get_object(item);
- monster_race *r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
if ((o_ptr->sval != SV_CORPSE_CORPSE) && (o_ptr->sval != SV_CORPSE_HEAD))
{
@@ -1564,7 +1565,7 @@ void do_cmd_cut_corpse(void)
{
case SV_CORPSE_CORPSE:
{
- if (r_ptr->flags9 & RF9_DROP_SKELETON)
+ if (r_ptr->flags & RF_DROP_SKELETON)
{
not_meat = (r_ptr->weight * 3) / 5;
}
@@ -1634,7 +1635,7 @@ void do_cmd_cut_corpse(void)
*
* Salt water works well.
*/
-void do_cmd_cure_meat(void)
+void do_cmd_cure_meat()
{
int item, num, cure;
@@ -1813,9 +1814,9 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
case SV_POTION_SALT_WATER:
{
msg_print("The potion makes you vomit!");
- (void)set_food(PY_FOOD_STARVE - 1);
- (void)set_poisoned(0);
- (void)set_paralyzed(4);
+ set_food(PY_FOOD_STARVE - 1);
+ set_poisoned(0);
+ set_paralyzed(4);
ident = TRUE;
break;
@@ -1907,12 +1908,12 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
{
msg_print("Your nerves and muscles feel weak and lifeless!");
take_hit(damroll(10, 10), "a potion of Ruination");
- (void)dec_stat(A_DEX, 25, TRUE);
- (void)dec_stat(A_WIS, 25, TRUE);
- (void)dec_stat(A_CON, 25, TRUE);
- (void)dec_stat(A_STR, 25, TRUE);
- (void)dec_stat(A_CHR, 25, TRUE);
- (void)dec_stat(A_INT, 25, TRUE);
+ dec_stat(A_DEX, 25, TRUE);
+ dec_stat(A_WIS, 25, TRUE);
+ dec_stat(A_CON, 25, TRUE);
+ dec_stat(A_STR, 25, TRUE);
+ dec_stat(A_CHR, 25, TRUE);
+ dec_stat(A_INT, 25, TRUE);
ident = TRUE;
break;
@@ -1964,8 +1965,8 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
{
msg_print("Massive explosions rupture your body!");
take_hit(damroll(50, 20), "a potion of Detonation");
- (void)set_stun(p_ptr->stun + 75);
- (void)set_cut(p_ptr->cut + 5000);
+ set_stun(p_ptr->stun + 75);
+ set_cut(p_ptr->cut + 5000);
ident = TRUE;
break;
@@ -2029,7 +2030,7 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
}
else
{
- (void)set_fast(p_ptr->fast + 5, 10);
+ set_fast(p_ptr->fast + 5, 10);
}
break;
@@ -2133,18 +2134,18 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
msg_print("You feel life flow through your body!");
restore_level();
hp_player(5000);
- (void)set_poisoned(0);
- (void)set_blind(0);
- (void)set_confused(0);
- (void)set_image(0);
- (void)set_stun(0);
- (void)set_cut(0);
- (void)do_res_stat(A_STR, TRUE);
- (void)do_res_stat(A_CON, TRUE);
- (void)do_res_stat(A_DEX, TRUE);
- (void)do_res_stat(A_WIS, TRUE);
- (void)do_res_stat(A_INT, TRUE);
- (void)do_res_stat(A_CHR, TRUE);
+ set_poisoned(0);
+ set_blind(0);
+ set_confused(0);
+ set_image(0);
+ set_stun(0);
+ set_cut(0);
+ do_res_stat(A_STR, TRUE);
+ do_res_stat(A_CON, TRUE);
+ do_res_stat(A_DEX, TRUE);
+ do_res_stat(A_WIS, TRUE);
+ do_res_stat(A_INT, TRUE);
+ do_res_stat(A_CHR, TRUE);
if (p_ptr->black_breath)
{
msg_print("The hold of the Black Breath on you is broken!");
@@ -2287,26 +2288,14 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
msg_print("You begin to feel more enlightened...");
msg_print(NULL);
wiz_lite_extra();
- (void)do_inc_stat(A_INT);
- (void)do_inc_stat(A_WIS);
- (void)detect_traps(DEFAULT_RADIUS);
- (void)detect_doors(DEFAULT_RADIUS);
- (void)detect_stairs(DEFAULT_RADIUS);
- (void)detect_treasure(DEFAULT_RADIUS);
- (void)detect_objects_gold(DEFAULT_RADIUS);
- (void)detect_objects_normal(DEFAULT_RADIUS);
+ do_inc_stat(A_INT);
+ do_inc_stat(A_WIS);
+ detect_doors(DEFAULT_RADIUS);
+ detect_stairs(DEFAULT_RADIUS);
+ detect_treasure(DEFAULT_RADIUS);
+ detect_objects_gold(DEFAULT_RADIUS);
+ detect_objects_normal(DEFAULT_RADIUS);
identify_pack();
- self_knowledge(NULL);
- ident = TRUE;
-
- break;
- }
-
- case SV_POTION_SELF_KNOWLEDGE:
- {
- msg_print("You begin to know yourself a little better...");
- msg_print(NULL);
- self_knowledge(NULL);
ident = TRUE;
break;
@@ -2326,11 +2315,11 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
case SV_POTION_RESISTANCE:
{
- (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
- (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
- (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
- (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20);
- (void)set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20);
+ set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
+ set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
+ set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
+ set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20);
+ set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20);
ident = TRUE;
break;
@@ -2352,7 +2341,7 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
case SV_POTION_INVULNERABILITY:
{
- (void)set_invuln(p_ptr->invuln + randint(7) + 7);
+ set_invuln(p_ptr->invuln + randint(7) + 7);
ident = TRUE;
break;
@@ -2489,8 +2478,10 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
/*
* Quaff a potion (from the pack or the floor)
*/
-void do_cmd_quaff_potion(void)
+void do_cmd_quaff_potion()
{
+ auto const &k_info = game->edit_data.k_info;
+
int ident, lev;
/* Get an item */
@@ -2509,10 +2500,6 @@ void do_cmd_quaff_potion(void)
object_type *o_ptr = get_object(item);
- /* Sound */
- sound(SOUND_QUAFF);
-
-
/* Take a turn */
energy_use = 100;
@@ -2552,7 +2539,7 @@ void do_cmd_quaff_potion(void)
/* Potions can feed the player */
- (void)set_food(p_ptr->food + o_ptr->pval);
+ set_food(p_ptr->food + o_ptr->pval);
/* Destroy potion */
@@ -2563,7 +2550,7 @@ void do_cmd_quaff_potion(void)
/*
* Fill an empty bottle
*/
-static void do_cmd_fill_bottle(void)
+static void do_cmd_fill_bottle()
{
cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px];
@@ -2649,16 +2636,16 @@ static void do_cmd_fill_bottle(void)
/*
* Drink from a fountain
*/
-void do_cmd_drink_fountain(void)
+void do_cmd_drink_fountain()
{
+ auto const &k_info = game->edit_data.k_info;
+
cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px];
bool_ ident;
int tval, sval, pval = 0;
- int i;
-
char ch;
@@ -2695,9 +2682,9 @@ void do_cmd_drink_fountain(void)
sval = c_ptr->special - SV_POTION_LAST;
}
- for (i = 0; i < max_k_idx; i++)
+ for (auto const &k_ref: k_info)
{
- object_kind *k_ptr = &k_info[i];
+ auto k_ptr = &k_ref;
if (k_ptr->tval != tval) continue;
if (k_ptr->sval != sval) continue;
@@ -2724,7 +2711,7 @@ void do_cmd_drink_fountain(void)
/*
* Curse the players armor
*/
-bool_ curse_armor(void)
+bool_ curse_armor()
{
object_type *o_ptr;
@@ -2742,7 +2729,7 @@ bool_ curse_armor(void)
object_desc(o_name, o_ptr, FALSE, 3);
/* Attempt a saving throw for artifacts */
- if (((o_ptr->art_name) || artifact_p(o_ptr)) && (rand_int(100) < 50))
+ if (artifact_p(o_ptr) && (rand_int(100) < 50))
{
/* Cool */
msg_format("A terrible black aura tries to surround your armour, "
@@ -2764,10 +2751,7 @@ bool_ curse_armor(void)
o_ptr->ac = 0;
o_ptr->dd = 0;
o_ptr->ds = 0;
- o_ptr->art_flags1 = 0;
- o_ptr->art_flags2 = 0;
- o_ptr->art_flags3 = 0;
- o_ptr->art_flags4 = 0;
+ o_ptr->art_flags = object_flag_set();
/* Curse it */
o_ptr->ident |= (IDENT_CURSED);
@@ -2789,7 +2773,7 @@ bool_ curse_armor(void)
/*
* Curse the players weapon
*/
-bool_ curse_weapon(void)
+bool_ curse_weapon()
{
object_type *o_ptr;
@@ -2807,7 +2791,7 @@ bool_ curse_weapon(void)
object_desc(o_name, o_ptr, FALSE, 3);
/* Attempt a saving throw */
- if ((artifact_p(o_ptr) || o_ptr->art_name) && (rand_int(100) < 50))
+ if (artifact_p(o_ptr) && (rand_int(100) < 50))
{
/* Cool */
msg_format("A terrible black aura tries to surround your weapon, "
@@ -2829,10 +2813,7 @@ bool_ curse_weapon(void)
o_ptr->ac = 0;
o_ptr->dd = 0;
o_ptr->ds = 0;
- o_ptr->art_flags1 = 0;
- o_ptr->art_flags2 = 0;
- o_ptr->art_flags3 = 0;
- o_ptr->art_flags4 = 0;
+ o_ptr->art_flags = object_flag_set();
/* Curse it */
@@ -2874,8 +2855,12 @@ static object_filter_t const &item_tester_hook_readable()
* include scrolls with no effects but recharge or identify, which are
* cancelled before use. XXX Reading them still takes a turn, though.
*/
-void do_cmd_read_scroll(void)
+void do_cmd_read_scroll()
{
+ auto const &d_info = game->edit_data.d_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto &r_info = game->edit_data.r_info;
+
/* Check some conditions */
if (p_ptr->blind)
{
@@ -2942,12 +2927,12 @@ void do_cmd_read_scroll(void)
msg_print("You feel the souls of the dead coming back "
"from the Halls of Mandos.");
- for (int k = 0; k < max_r_idx; k++)
+ for (auto &r_ref: r_info)
{
- monster_race *r_ptr = &r_info[k];
+ auto r_ptr = &r_ref;
- if (r_ptr->flags1 & RF1_UNIQUE &&
- !(r_ptr->flags9 & RF9_SPECIAL_GENE))
+ if (r_ptr->flags & RF_UNIQUE &&
+ !(r_ptr->flags & RF_SPECIAL_GENE))
{
r_ptr->max_num = 1;
}
@@ -2983,7 +2968,7 @@ void do_cmd_read_scroll(void)
}
msg_format("Recall reset to %s at level %d.",
- d_info[p_ptr->recall_dungeon].name,
+ d_info[p_ptr->recall_dungeon].name.c_str(),
max_dlv[p_ptr->recall_dungeon]);
ident = TRUE;
@@ -2995,7 +2980,6 @@ void do_cmd_read_scroll(void)
case SV_SCROLL_DIVINATION:
{
int i, count = 0;
- char buf[120];
while (count < 1000)
{
@@ -3007,8 +2991,7 @@ void do_cmd_read_scroll(void)
msg_print("A message appears on the scroll. It says:");
msg_print(NULL);
- fate_desc(buf, i);
- msg_format("%s", buf);
+ msg_format("%s", fate_desc(i).c_str());
msg_print(NULL);
msg_print("The scroll disappears in a puff of smoke!");
@@ -3026,7 +3009,7 @@ void do_cmd_read_scroll(void)
{
if (!(p_ptr->resist_blind) && !(p_ptr->resist_dark))
{
- (void)set_blind(p_ptr->blind + 3 + randint(5));
+ set_blind(p_ptr->blind + 3 + randint(5));
}
if (unlite_area(10, 3)) ident = TRUE;
@@ -3093,13 +3076,6 @@ void do_cmd_read_scroll(void)
break;
}
- case SV_SCROLL_TRAP_CREATION:
- {
- if (trap_creation()) ident = TRUE;
-
- break;
- }
-
case SV_SCROLL_PHASE_DOOR:
{
teleport_player(10);
@@ -3120,7 +3096,7 @@ void do_cmd_read_scroll(void)
case SV_SCROLL_TELEPORT_LEVEL:
{
- (void)teleport_player_level();
+ teleport_player_level();
ident = TRUE;
@@ -3129,7 +3105,7 @@ void do_cmd_read_scroll(void)
case SV_SCROLL_WORD_OF_RECALL:
{
- if ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? "))
+ if ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? "))
{
used_up = FALSE;
}
@@ -3174,9 +3150,11 @@ void do_cmd_read_scroll(void)
case SV_SCROLL_STAR_REMOVE_CURSE:
{
- remove_all_curse();
-
- ident = TRUE;
+ if (remove_all_curse())
+ {
+ msg_print("You feel as if someone is watching over you.");
+ ident = TRUE;
+ }
break;
}
@@ -3275,13 +3253,6 @@ void do_cmd_read_scroll(void)
break;
}
- case SV_SCROLL_DETECT_TRAP:
- {
- if (detect_traps(DEFAULT_RADIUS)) ident = TRUE;
-
- break;
- }
-
case SV_SCROLL_DETECT_DOOR:
{
if (detect_doors(DEFAULT_RADIUS)) ident = TRUE;
@@ -3357,13 +3328,6 @@ void do_cmd_read_scroll(void)
break;
}
- case SV_SCROLL_TRAP_DOOR_DESTRUCTION:
- {
- if (destroy_doors_touch()) ident = TRUE;
-
- break;
- }
-
case SV_SCROLL_STAR_DESTRUCTION:
{
/* Prevent destruction of quest levels and town */
@@ -3390,7 +3354,7 @@ void do_cmd_read_scroll(void)
case SV_SCROLL_GENOCIDE:
{
- (void)genocide(TRUE);
+ genocide(TRUE);
ident = TRUE;
@@ -3399,7 +3363,7 @@ void do_cmd_read_scroll(void)
case SV_SCROLL_MASS_GENOCIDE:
{
- (void)mass_genocide(TRUE);
+ mass_genocide(TRUE);
ident = TRUE;
@@ -3586,14 +3550,15 @@ void do_cmd_read_scroll(void)
cptr q = format("book-%d.txt", o_ptr->sval);
/* Peruse the help file */
- (void)show_file(q, NULL, 0, 0);
+ show_file(q, NULL);
/* Load screen */
screen_load();
+ /* Inscriptions become known upon reading */
if (o_ptr->sval >= 100)
{
- inscription_info[o_ptr->sval - 100].know = TRUE;
+ p_ptr->inscriptions[o_ptr->sval - 100] = TRUE;
}
used_up = FALSE;
@@ -3621,8 +3586,6 @@ void do_cmd_read_scroll(void)
/* Hack -- allow certain scrolls to be "preserved" */
if (!used_up) return;
- sound(SOUND_SCROLL);
-
/* Destroy scroll */
inc_stack_size(item, -1);
}
@@ -3694,12 +3657,10 @@ static void activate_stick(object_type *o_ptr, bool_ *obvious, bool_ *use_charge
*
* Hack -- staffs of identify can be "cancelled".
*/
-void do_cmd_use_staff(void)
+void do_cmd_use_staff()
{
bool_ obvious, use_charge;
- u32b f1, f2, f3, f4, f5, esp;
-
/* No magic */
if (p_ptr->antimagic)
{
@@ -3746,10 +3707,10 @@ void do_cmd_use_staff(void)
unset_stick_mode();
/* Extract object flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Is it simple to use ? */
- if (f4 & TR4_EASY_USE)
+ if (flags & TR_EASY_USE)
{
chance /= 3;
}
@@ -3763,25 +3724,21 @@ void do_cmd_use_staff(void)
/* Roll for usage */
if (magik(chance))
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("You failed to use the staff properly.");
- sound(SOUND_FAIL);
return;
}
/* Notice empty staffs */
if (o_ptr->pval <= 0)
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("The staff has no charges left.");
o_ptr->ident |= (IDENT_EMPTY);
return;
}
- /* Sound */
- sound(SOUND_ZAP);
-
/* Analyze the staff */
activate_stick(o_ptr, &obvious, &use_charge);
@@ -3871,13 +3828,10 @@ void do_cmd_use_staff(void)
* basic "bolt" rods, but the basic "ball" wands do the same damage
* as the basic "ball" rods.
*/
-void do_cmd_aim_wand(void)
+void do_cmd_aim_wand()
{
bool_ obvious, use_charge;
- u32b f1, f2, f3, f4, f5, esp;
-
-
/* No magic */
if (p_ptr->antimagic)
{
@@ -3924,10 +3878,10 @@ void do_cmd_aim_wand(void)
unset_stick_mode();
/* Extract object flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Is it simple to use ? */
- if (f4 & TR4_EASY_USE)
+ if (flags & TR_EASY_USE)
{
chance /= 3;
}
@@ -3935,24 +3889,20 @@ void do_cmd_aim_wand(void)
/* Roll for usage */
if (magik(chance))
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("You failed to use the wand properly.");
- sound(SOUND_FAIL);
return;
}
/* The wand is already empty! */
if (o_ptr->pval <= 0)
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("The wand has no charges left.");
o_ptr->ident |= (IDENT_EMPTY);
return;
}
- /* Sound */
- sound(SOUND_ZAP);
-
/* Analyze the wand */
activate_stick(o_ptr, &obvious, &use_charge);
@@ -4038,12 +3988,6 @@ static bool item_tester_hook_attachable(object_type const *o_ptr)
*/
void zap_combine_rod_tip(object_type *q_ptr, int tip_item)
{
- int item;
-
- u32b f1, f2, f3, f4, f5, esp;
- s32b cost;
-
-
/* No magic */
if (p_ptr->antimagic)
{
@@ -4052,6 +3996,7 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item)
}
/* Get an item */
+ int item;
if (!get_item(&item,
"Attach the rod tip with which rod? ",
"You have no rod to attach to.",
@@ -4065,12 +4010,11 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item)
object_type *o_ptr = get_object(item);
/* Examine the rod */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Calculate rod tip's mana cost */
- cost = q_ptr->pval;
-
- if (f4 & TR4_CHEAPNESS)
+ s32b cost = q_ptr->pval;
+ if (flags & TR_CHEAPNESS)
{
cost /= 2;
}
@@ -4096,18 +4040,16 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item)
/*
* Zap a rod, or attack a rod tip to a rod
*/
-void do_cmd_zap_rod(void)
+void do_cmd_zap_rod()
{
+ auto const &k_info = game->edit_data.k_info;
+
int item, ident, chance, dir, lev;
int cost;
bool_ require_dir;
- object_kind *tip_ptr;
-
- u32b f1, f2, f3, f4, f5, esp;
-
/* Hack -- let perception get aborted */
bool_ use_charge = TRUE;
@@ -4161,7 +4103,6 @@ void do_cmd_zap_rod(void)
{
switch (o_ptr->pval)
{
- case SV_ROD_DETECT_TRAP:
case SV_ROD_HAVOC:
case SV_ROD_HOME:
{
@@ -4188,15 +4129,18 @@ void do_cmd_zap_rod(void)
energy_use = 100;
/* Examine the rod */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
- if (f4 & TR4_FAST_CAST) energy_use /= 2;
+ if (flags & TR_FAST_CAST)
+ {
+ energy_use /= 2;
+ }
/* Not identified yet */
ident = FALSE;
/* Extract the item level */
- tip_ptr = &k_info[lookup_kind(TV_ROD, o_ptr->pval)];
+ auto tip_ptr = &k_info[lookup_kind(TV_ROD, o_ptr->pval)];
lev = k_info[lookup_kind(TV_ROD, o_ptr->pval)].level;
/* Base chance of success */
@@ -4214,7 +4158,7 @@ void do_cmd_zap_rod(void)
}
/* Is it simple to use ? */
- if (f4 & TR4_EASY_USE)
+ if (flags & TR_EASY_USE)
{
chance *= 10;
}
@@ -4229,13 +4173,11 @@ void do_cmd_zap_rod(void)
if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE))
{
/* Flush input if necessary */
- if (flush_failure) flush();
+ flush_on_failure();
/* Message */
msg_print("You failed to use the rod properly.");
- sound(SOUND_FAIL);
-
return;
}
@@ -4243,13 +4185,13 @@ void do_cmd_zap_rod(void)
cost = tip_ptr->pval;
/* "Cheapness" ego halven the cost */
- if (f4 & TR4_CHEAPNESS) cost = cost / 2;
+ if (flags & TR_CHEAPNESS) cost = cost / 2;
/* A single rod is still charging */
if (o_ptr->timeout < cost)
{
/* Flush input if necessary */
- if (flush_failure) flush();
+ flush_on_failure();
/* Message */
msg_print("The rod does not have enough mana yet.");
@@ -4260,9 +4202,6 @@ void do_cmd_zap_rod(void)
/* Increase the timeout by the rod kind's pval. */
o_ptr->timeout -= cost;
- /* Sound */
- sound(SOUND_ZAP);
-
/* Analyze the rod */
switch (o_ptr->pval)
{
@@ -4275,13 +4214,6 @@ void do_cmd_zap_rod(void)
break;
}
- case SV_ROD_DETECT_TRAP:
- {
- if (detect_traps(DEFAULT_RADIUS)) ident = TRUE;
-
- break;
- }
-
case SV_ROD_DETECT_DOOR:
{
if (detect_doors(DEFAULT_RADIUS)) ident = TRUE;
@@ -4301,7 +4233,7 @@ void do_cmd_zap_rod(void)
case SV_ROD_RECALL:
{
- if ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? "))
+ if ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? "))
{
use_charge = FALSE;
}
@@ -4340,15 +4272,6 @@ void do_cmd_zap_rod(void)
break;
}
- case SV_ROD_PROBING:
- {
- probing();
-
- ident = TRUE;
-
- break;
- }
-
case SV_ROD_CURING:
{
if (set_blind(0)) ident = TRUE;
@@ -4391,7 +4314,7 @@ void do_cmd_zap_rod(void)
}
else
{
- (void)set_fast(p_ptr->fast + 5, 10);
+ set_fast(p_ptr->fast + 5, 10);
}
break;
@@ -4404,13 +4327,6 @@ void do_cmd_zap_rod(void)
break;
}
- case SV_ROD_DISARMING:
- {
- if (disarm_trap(dir)) ident = TRUE;
-
- break;
- }
-
case SV_ROD_LITE:
{
msg_print("A line of blue shimmering light appears.");
@@ -4571,7 +4487,7 @@ static object_filter_t const &item_tester_hook_activate()
using namespace object_filter;
static auto instance = And(
IsKnown(),
- HasFlag3(TR3_ACTIVATE));
+ HasFlags(TR_ACTIVATE));
return instance;
}
@@ -4672,7 +4588,7 @@ int ring_of_power()
/*
* Enchant some bolts
*/
-bool_ brand_bolts(void)
+bool_ brand_bolts()
{
int i;
@@ -4686,7 +4602,7 @@ bool_ brand_bolts(void)
if (o_ptr->tval != TV_BOLT) continue;
/* Skip artifacts and ego-items */
- if (o_ptr->art_name || artifact_p(o_ptr) || ego_item_p(o_ptr)) continue;
+ if (artifact_p(o_ptr) || ego_item_p(o_ptr)) continue;
/* Skip cursed/broken items */
if (cursed_p(o_ptr)) continue;
@@ -4711,7 +4627,7 @@ bool_ brand_bolts(void)
}
/* Flush */
- if (flush_failure) flush();
+ flush_on_failure();
/* Fail */
msg_print("The fiery enchantment failed.");
@@ -4878,13 +4794,12 @@ static void activate_valaroma()
* Note that it always takes a turn to activate an object, even if
* the user hits "escape" at the "direction" prompt.
*/
-void do_cmd_activate(void)
+void do_cmd_activate()
{
- int item, lev, chance;
-
- char ch, spell_choice;
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
- u32b f1, f2, f3, f4, f5, esp;
+ int item, lev, chance;
/* Get an item */
command_wrk = USE_EQUIP;
@@ -4901,10 +4816,10 @@ void do_cmd_activate(void)
object_type *o_ptr = get_object(item);
/* Extract object flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Wearable items have to be worn */
- if (!(f5 & TR5_ACTIVATE_NO_WIELD))
+ if (!(flags & TR_ACTIVATE_NO_WIELD))
{
if (item < INVEN_WIELD)
{
@@ -4924,7 +4839,7 @@ void do_cmd_activate(void)
{
if (o_ptr->tval == TV_RANDART)
{
- lev = random_artifacts[o_ptr->sval].level;
+ lev = game->random_artifacts[o_ptr->sval].level;
}
else
{
@@ -4947,7 +4862,7 @@ void do_cmd_activate(void)
}
/* Is it simple to use ? */
- if (f4 & TR4_EASY_USE)
+ if (flags & TR_EASY_USE)
{
chance *= 10;
}
@@ -4961,24 +4876,16 @@ void do_cmd_activate(void)
/* Roll for usage */
if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE))
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("You failed to activate it properly.");
- sound(SOUND_FAIL);
return;
}
/* Check the recharge */
if (o_ptr->timeout)
{
- /* Mage Staff of Spells -- Have another timeout in xtra2 */
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL) && o_ptr->xtra2)
- {
- msg_print("It whines, glows and fades...");
- return;
- }
-
/* Monster eggs */
- else if (o_ptr->tval == TV_EGG)
+ if (o_ptr->tval == TV_EGG)
{
msg_print("You resume the development of the egg.");
o_ptr->timeout = 0;
@@ -5002,9 +4909,6 @@ void do_cmd_activate(void)
/* Activate the item */
msg_print("You activate it...");
- /* Sound */
- sound(SOUND_ZAP);
-
/* New mostly unified activation code
This has to be early to allow artifacts to override normal items -- neil */
@@ -5017,61 +4921,6 @@ void do_cmd_activate(void)
return;
}
- /* Mage Staff of Spells */
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))
- {
- while (TRUE)
- {
- if (!get_com("Use Spell [1] or [2]?", &ch))
- {
- return;
- }
-
- if (ch == '1')
- {
- spell_choice = 1;
- break;
- }
-
- if (ch == '2')
- {
- spell_choice = 2;
- break;
- }
- }
-
- if (spell_choice == 1)
- {
- /* Still need to check timeouts because there is another counter */
- if (o_ptr->timeout)
- {
- msg_print("The first spell is still charging!");
- return;
- }
-
- /* Cast spell 1 */
- activate_spell(o_ptr, spell_choice);
- }
- else if (spell_choice == 2)
- {
- /* Still need to check timeouts because there is another counter */
- if (o_ptr->xtra2)
- {
- msg_print("The second spell is still charging!");
- return;
- }
-
- /* Cast spell 2 */
- activate_spell(o_ptr, spell_choice);
- }
-
- /* Window stuff */
- p_ptr->window |= (PW_INVEN | PW_EQUIP);
-
- /* Success */
- return;
- }
-
/* Monster eggs */
if (o_ptr->tval == TV_EGG)
{
@@ -5108,6 +4957,10 @@ void do_cmd_activate(void)
const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
+ auto const &e_info = game->edit_data.e_info;
+
int plev = get_skill(SKILL_DEVICE);
int i = 0, ii = 0, ij = 0, k, dir, dummy = 0;
@@ -5125,7 +4978,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
spell = a_info[o_ptr->name1].activate;
/* Random Artifacts */
- if (!spell && o_ptr->art_name)
+ if (!spell && (!o_ptr->artifact_name.empty()))
spell = o_ptr->xtra2;
/* Ego Items */
@@ -5227,67 +5080,6 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
break;
}
- case ACT_NUMENOR:
- {
- /* Give full knowledge */
- /* Hack -- Maximal info */
- monster_race *r_ptr;
- cave_type *c_ptr;
- int x, y, m;
-
- if (!doit) return "analyze monster every 500+d200 turns";
-
- if (!tgt_pt(&x, &y)) break;
-
- c_ptr = &cave[y][x];
- if (!c_ptr->m_idx) break;
-
- r_ptr = &r_info[c_ptr->m_idx];
-
- /* Observe "maximal" attacks */
- for (m = 0; m < 4; m++)
- {
- /* Examine "actual" blows */
- if (r_ptr->blow[m].effect || r_ptr->blow[m].method)
- {
- /* Hack -- maximal observations */
- r_ptr->r_blows[m] = MAX_UCHAR;
- }
- }
-
- /* Hack -- maximal drops */
- r_ptr->r_drop_gold = r_ptr->r_drop_item =
- (((r_ptr->flags1 & (RF1_DROP_4D2)) ? 8 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_3D2)) ? 6 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_2D2)) ? 4 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_1D2)) ? 2 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_90)) ? 1 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_60)) ? 1 : 0));
-
- /* Hack -- but only "valid" drops */
- if (r_ptr->flags1 & (RF1_ONLY_GOLD)) r_ptr->r_drop_item = 0;
- if (r_ptr->flags1 & (RF1_ONLY_ITEM)) r_ptr->r_drop_gold = 0;
-
- /* Hack -- observe many spells */
- r_ptr->r_cast_inate = MAX_UCHAR;
- r_ptr->r_cast_spell = MAX_UCHAR;
-
- /* Hack -- know all the flags */
- r_ptr->r_flags1 = r_ptr->flags1;
- r_ptr->r_flags2 = r_ptr->flags2;
- r_ptr->r_flags3 = r_ptr->flags3;
- r_ptr->r_flags4 = r_ptr->flags4;
- r_ptr->r_flags5 = r_ptr->flags5;
- r_ptr->r_flags6 = r_ptr->flags6;
- r_ptr->r_flags7 = r_ptr->flags7;
- r_ptr->r_flags8 = r_ptr->flags8;
- r_ptr->r_flags9 = r_ptr->flags9;
-
- o_ptr->timeout = rand_int(200) + 500;
-
- break;
- }
-
case ACT_KNOWLEDGE:
{
if (!doit) return "whispers from beyond(sanity drain) every 100+d200 turns";
@@ -5305,12 +5097,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("The phial wells with dark light...");
unlite_area(damroll(2, 15), 3);
take_hit(damroll(10, 10), "activating The Phial of Undeath");
- (void)dec_stat(A_DEX, 25, STAT_DEC_PERMANENT);
- (void)dec_stat(A_WIS, 25, STAT_DEC_PERMANENT);
- (void)dec_stat(A_CON, 25, STAT_DEC_PERMANENT);
- (void)dec_stat(A_STR, 25, STAT_DEC_PERMANENT);
- (void)dec_stat(A_CHR, 25, STAT_DEC_PERMANENT);
- (void)dec_stat(A_INT, 25, STAT_DEC_PERMANENT);
+ dec_stat(A_DEX, 25, STAT_DEC_PERMANENT);
+ dec_stat(A_WIS, 25, STAT_DEC_PERMANENT);
+ dec_stat(A_CON, 25, STAT_DEC_PERMANENT);
+ dec_stat(A_STR, 25, STAT_DEC_PERMANENT);
+ dec_stat(A_CHR, 25, STAT_DEC_PERMANENT);
+ dec_stat(A_INT, 25, STAT_DEC_PERMANENT);
o_ptr->timeout = rand_int(10) + 10;
@@ -5332,7 +5124,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "dispel small life every 55+d55 turns";
msg_print("You exterminate small life.");
- (void)dispel_monsters(4);
+ dispel_monsters(4);
o_ptr->timeout = rand_int(55) + 55;
@@ -5345,11 +5137,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("The ring glows brightly...");
if (!p_ptr->fast)
{
- (void)set_fast(randint(75) + 75, 10);
+ set_fast(randint(75) + 75, 10);
}
else
{
- (void)set_fast(p_ptr->fast + 5, 10);
+ set_fast(p_ptr->fast + 5, 10);
}
o_ptr->timeout = rand_int(150) + 150;
@@ -5428,7 +5220,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("The stone reveals hidden mysteries...");
if (!ident_spell()) break;
- if (has_ability(AB_PERFECT_CASTING))
+ if (p_ptr->has_ability(AB_PERFECT_CASTING))
{
/* Sufficient mana */
if (20 <= p_ptr->csp)
@@ -5450,10 +5242,10 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("You are too weak to control the stone!");
/* Hack -- Bypass free action */
- (void)set_paralyzed(randint(5 * oops + 1));
+ set_paralyzed(randint(5 * oops + 1));
/* Confusing. */
- (void)set_confused(p_ptr->confused +
+ set_confused(p_ptr->confused +
randint(5 * oops + 1));
}
@@ -5466,7 +5258,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
/* Confusing. */
if (rand_int(5) == 0)
{
- (void)set_confused(p_ptr->confused + randint(10));
+ set_confused(p_ptr->confused + randint(10));
}
/* Exercise a little care... */
@@ -5508,15 +5300,15 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("You breathe the elements.");
fire_ball(GF_MISSILE, dir, 300, 4);
msg_print("Your armor glows many colours...");
- (void)set_afraid(0);
- (void)set_shero(p_ptr->shero + randint(50) + 50);
- (void)hp_player(30);
- (void)set_blessed(p_ptr->blessed + randint(50) + 50);
- (void)set_oppose_acid(p_ptr->oppose_acid + randint(50) + 50);
- (void)set_oppose_elec(p_ptr->oppose_elec + randint(50) + 50);
- (void)set_oppose_fire(p_ptr->oppose_fire + randint(50) + 50);
- (void)set_oppose_cold(p_ptr->oppose_cold + randint(50) + 50);
- (void)set_oppose_pois(p_ptr->oppose_pois + randint(50) + 50);
+ set_afraid(0);
+ set_shero(p_ptr->shero + randint(50) + 50);
+ hp_player(30);
+ set_blessed(p_ptr->blessed + randint(50) + 50);
+ set_oppose_acid(p_ptr->oppose_acid + randint(50) + 50);
+ set_oppose_elec(p_ptr->oppose_elec + randint(50) + 50);
+ set_oppose_fire(p_ptr->oppose_fire + randint(50) + 50);
+ set_oppose_cold(p_ptr->oppose_cold + randint(50) + 50);
+ set_oppose_pois(p_ptr->oppose_pois + randint(50) + 50);
o_ptr->timeout = 400;
@@ -5527,13 +5319,13 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return ("heal (777), curing and heroism every 300 turns");
msg_print("A heavenly choir sings...");
- (void)set_poisoned(0);
- (void)set_cut(0);
- (void)set_stun(0);
- (void)set_confused(0);
- (void)set_blind(0);
- (void)set_hero(p_ptr->hero + randint(25) + 25);
- (void)hp_player(777);
+ set_poisoned(0);
+ set_cut(0);
+ set_stun(0);
+ set_confused(0);
+ set_blind(0);
+ set_hero(p_ptr->hero + randint(25) + 25);
+ hp_player(777);
o_ptr->timeout = 300;
@@ -5554,11 +5346,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "resistance (20+d20 turns) every 111 turns";
msg_print("Your cloak glows many colours...");
- (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
- (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
- (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
- (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20);
- (void)set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20);
+ set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
+ set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
+ set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
+ set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20);
+ set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20);
o_ptr->timeout = 111;
@@ -5608,7 +5400,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case 11:
case 12:
{
- (void)stair_creation();
+ stair_creation();
break;
}
@@ -5654,7 +5446,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "summon the Legion of the Dawn every 500+d500 turns";
msg_print("You summon the Legion of the Dawn.");
- (void)summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DAWN, TRUE);
+ summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DAWN, TRUE);
o_ptr->timeout = 500 + randint(500);
@@ -5689,7 +5481,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "fire branding of bolts every 999 turns";
msg_print("Your crossbow glows deep red...");
- (void)brand_bolts();
+ brand_bolts();
o_ptr->timeout = 999;
@@ -5760,9 +5552,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!doit) return "clairvoyance every 100+d100 turns";
msg_print("The stone glows a deep green...");
wiz_lite_extra();
- (void)detect_traps(DEFAULT_RADIUS);
- (void)detect_doors(DEFAULT_RADIUS);
- (void)detect_stairs(DEFAULT_RADIUS);
+ detect_doors(DEFAULT_RADIUS);
+ detect_stairs(DEFAULT_RADIUS);
o_ptr->timeout = rand_int(100) + 100;
@@ -5847,11 +5638,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!doit) return "berserker and +10 to speed (50) every 100+d200 turns";
if (!p_ptr->fast)
{
- (void)set_fast(randint(50) + 50, 10);
+ set_fast(randint(50) + 50, 10);
}
else
{
- (void)set_fast(p_ptr->fast + 5, 10);
+ set_fast(p_ptr->fast + 5, 10);
}
hp_player(30);
set_afraid(0);
@@ -5927,7 +5718,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "detect orcs every 10 turns";
msg_print("Your weapon glows brightly...");
- (void)detect_monsters_xxx(RF3_ORC, DEFAULT_RADIUS);
+ detect_monsters_orcs(DEFAULT_RADIUS);
o_ptr->timeout = 10;
@@ -6306,7 +6097,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "teleport away every 200 turns";
if (!get_aim_dir(&dir)) break;
- (void)fire_beam(GF_AWAY_ALL, dir, plev);
+ fire_beam(GF_AWAY_ALL, dir, plev);
o_ptr->timeout = 200;
@@ -6330,7 +6121,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "genocide every 500 turns";
msg_print("It glows deep blue...");
- (void)genocide(TRUE);
+ genocide(TRUE);
o_ptr->timeout = 500;
@@ -6341,7 +6132,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "mass genocide every 1000 turns";
msg_print("It lets out a long, shrill note...");
- (void)mass_genocide(TRUE);
+ mass_genocide(TRUE);
o_ptr->timeout = 1000;
@@ -6354,7 +6145,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "charm animal every 300 turns";
if (!get_aim_dir(&dir)) break;
- (void) charm_animal(dir, plev);
+ charm_animal(dir, plev);
o_ptr->timeout = 300;
@@ -6365,7 +6156,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "enslave undead every 333 turns";
if (!get_aim_dir(&dir)) break;
- (void)control_one_undead(dir, plev);
+ control_one_undead(dir, plev);
o_ptr->timeout = 333;
@@ -6376,7 +6167,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "charm monster every 400 turns";
if (!get_aim_dir(&dir)) break;
- (void) charm_monster(dir, plev);
+ charm_monster(dir, plev);
o_ptr->timeout = 400;
@@ -6386,7 +6177,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_CHARM_ANIMALS:
{
if (!doit) return "animal friendship every 500 turns";
- (void) charm_animals(plev * 2);
+ charm_animals(plev * 2);
o_ptr->timeout = 500;
@@ -6406,7 +6197,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_SUMMON_ANIMAL:
{
if (!doit) return "summon animal every 200+d300 turns";
- (void)summon_specific_friendly(p_ptr->py, p_ptr->px, plev, SUMMON_ANIMAL_RANGER, TRUE);
+ summon_specific_friendly(p_ptr->py, p_ptr->px, plev, SUMMON_ANIMAL_RANGER, TRUE);
o_ptr->timeout = 200 + randint(300);
@@ -6417,7 +6208,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "summon phantasmal servant every 200+d200 turns";
msg_print("You summon a phantasmal servant.");
- (void)summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_PHANTOM, TRUE);
+ summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_PHANTOM, TRUE);
o_ptr->timeout = 200 + randint(200);
@@ -6509,8 +6300,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_CURE_LW:
{
if (!doit) return format("cure light wounds every %d turns", (is_junkart ? 50 : 10));
- (void)set_afraid(0);
- (void)hp_player(30);
+ set_afraid(0);
+ hp_player(30);
o_ptr->timeout = 10;
@@ -6522,7 +6313,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!doit) return format("cure serious wounds every %s turns", (is_junkart? "75" : "3+d3"));
msg_print("It radiates deep purple...");
hp_player(damroll(4, 8));
- (void)set_cut((p_ptr->cut / 2) - 50);
+ set_cut((p_ptr->cut / 2) - 50);
o_ptr->timeout = rand_int(3) + 3;
@@ -6533,8 +6324,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "remove fear and cure poison every 5 turns";
msg_print("It glows deep blue...");
- (void)set_afraid(0);
- (void)set_poisoned(0);
+ set_afraid(0);
+ set_poisoned(0);
o_ptr->timeout = 5;
@@ -6556,13 +6347,13 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return format("restore stats and life levels every %d turns", (is_junkart ? 200 : 750));
msg_print("It glows a deep green...");
- (void)do_res_stat(A_STR, TRUE);
- (void)do_res_stat(A_INT, TRUE);
- (void)do_res_stat(A_WIS, TRUE);
- (void)do_res_stat(A_DEX, TRUE);
- (void)do_res_stat(A_CON, TRUE);
- (void)do_res_stat(A_CHR, TRUE);
- (void)restore_level();
+ do_res_stat(A_STR, TRUE);
+ do_res_stat(A_INT, TRUE);
+ do_res_stat(A_WIS, TRUE);
+ do_res_stat(A_DEX, TRUE);
+ do_res_stat(A_CON, TRUE);
+ do_res_stat(A_CHR, TRUE);
+ restore_level();
o_ptr->timeout = 750;
@@ -6574,8 +6365,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!doit) return format("heal 700 hit points every %d turns", (is_junkart ? 100 : 250));
msg_print("It glows deep blue...");
msg_print("You feel a warm tingling inside...");
- (void)hp_player(700);
- (void)set_cut(0);
+ hp_player(700);
+ set_cut(0);
o_ptr->timeout = 250;
@@ -6587,8 +6378,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!doit) return "heal 1000 hit points every 888 turns";
msg_print("It glows a bright white...");
msg_print("You feel much better...");
- (void)hp_player(1000);
- (void)set_cut(0);
+ hp_player(1000);
+ set_cut(0);
o_ptr->timeout = 888;
@@ -6598,7 +6389,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_ESP:
{
if (!doit) return "temporary ESP (dur 25+d30) every 200 turns";
- (void)set_tim_esp(p_ptr->tim_esp + randint(30) + 25);
+ set_tim_esp(p_ptr->tim_esp + randint(30) + 25);
o_ptr->timeout = 200;
@@ -6608,8 +6399,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_BERSERK:
{
if (!doit) return "heroism and berserk (dur 50+d50) every 100+d100 turns";
- (void)set_shero(p_ptr->shero + randint(50) + 50);
- (void)set_blessed(p_ptr->blessed + randint(50) + 50);
+ set_shero(p_ptr->shero + randint(50) + 50);
+ set_blessed(p_ptr->blessed + randint(50) + 50);
o_ptr->timeout = 100 + randint(100);
@@ -6621,7 +6412,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!doit) return "protection from evil (dur level*3 + d25) every 225+d225 turns";
msg_print("It lets out a shrill wail...");
k = 3 * p_ptr->lev;
- (void)set_protevil(p_ptr->protevil + randint(25) + k);
+ set_protevil(p_ptr->protevil + randint(25) + k);
o_ptr->timeout = rand_int(225) + 225;
@@ -6632,11 +6423,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "resist elements (dur 40+d40) every 200 turns";
msg_print("It glows many colours...");
- (void)set_oppose_acid(p_ptr->oppose_acid + randint(40) + 40);
- (void)set_oppose_elec(p_ptr->oppose_elec + randint(40) + 40);
- (void)set_oppose_fire(p_ptr->oppose_fire + randint(40) + 40);
- (void)set_oppose_cold(p_ptr->oppose_cold + randint(40) + 40);
- (void)set_oppose_pois(p_ptr->oppose_pois + randint(40) + 40);
+ set_oppose_acid(p_ptr->oppose_acid + randint(40) + 40);
+ set_oppose_elec(p_ptr->oppose_elec + randint(40) + 40);
+ set_oppose_fire(p_ptr->oppose_fire + randint(40) + 40);
+ set_oppose_cold(p_ptr->oppose_cold + randint(40) + 40);
+ set_oppose_pois(p_ptr->oppose_pois + randint(40) + 40);
o_ptr->timeout = 200;
@@ -6649,11 +6440,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("It glows bright green...");
if (!p_ptr->fast)
{
- (void)set_fast(randint(20) + 20, 10);
+ set_fast(randint(20) + 20, 10);
}
else
{
- (void)set_fast(p_ptr->fast + 5, 10);
+ set_fast(p_ptr->fast + 5, 10);
}
o_ptr->timeout = 250;
@@ -6667,11 +6458,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("It glows brightly...");
if (!p_ptr->fast)
{
- (void)set_fast(randint(75) + 75, 10);
+ set_fast(randint(75) + 75, 10);
}
else
{
- (void)set_fast(p_ptr->fast + 5, 10);
+ set_fast(p_ptr->fast + 5, 10);
}
o_ptr->timeout = rand_int(200) + 200;
@@ -6692,7 +6483,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_INVULN:
{
if (!doit) return "invulnerability (dur 8+d8) every 1000 turns";
- (void)set_invuln(p_ptr->invuln + randint(8) + 8);
+ set_invuln(p_ptr->invuln + randint(8) + 8);
o_ptr->timeout = 1000;
@@ -6738,10 +6529,9 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_DETECT_XTRA:
{
- if (!doit) return "detection, probing and identify true every 1000 turns";
+ if (!doit) return "detection and identify true every 1000 turns";
msg_print("It glows brightly...");
detect_all(DEFAULT_RADIUS);
- probing();
identify_fully();
o_ptr->timeout = 1000;
@@ -6795,7 +6585,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_SATIATE:
{
if (!doit) return "satisfy hunger every 200 turns";
- (void)set_food(PY_FOOD_MAX - 1);
+ set_food(PY_FOOD_MAX - 1);
o_ptr->timeout = 200;
@@ -6839,7 +6629,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
if (!doit) return "alchemy every 500 turns";
msg_print("It glows bright yellow...");
- (void) alchemy();
+ alchemy();
o_ptr->timeout = 500;
@@ -6849,7 +6639,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_DIM_DOOR:
{
if (!doit) return "dimension door every 100 turns";
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("Not on special levels!");
break;
@@ -6892,7 +6682,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_RECALL:
{
- if (!(dungeon_flags2 & DF2_ASK_LEAVE) || ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? ")))
+ if (!(dungeon_flags & DF_ASK_LEAVE) || ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? ")))
{
if (!doit) return "word of recall every 200 turns";
msg_print("It glows soft white...");
@@ -6920,12 +6710,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
msg_print("Your nerves and muscles feel weak and lifeless!");
take_hit(damroll(10, 10), "activating Ruination");
- (void)dec_stat(A_DEX, 25, TRUE);
- (void)dec_stat(A_WIS, 25, TRUE);
- (void)dec_stat(A_CON, 25, TRUE);
- (void)dec_stat(A_STR, 25, TRUE);
- (void)dec_stat(A_CHR, 25, TRUE);
- (void)dec_stat(A_INT, 25, TRUE);
+ dec_stat(A_DEX, 25, TRUE);
+ dec_stat(A_WIS, 25, TRUE);
+ dec_stat(A_CON, 25, TRUE);
+ dec_stat(A_STR, 25, TRUE);
+ dec_stat(A_CHR, 25, TRUE);
+ dec_stat(A_INT, 25, TRUE);
/* Timeout is set before return */
@@ -6945,7 +6735,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_UNINT:
{
if (!doit) return "decreasing Intelligence";
- (void)dec_stat(A_INT, 25, FALSE);
+ dec_stat(A_INT, 25, FALSE);
/* Timeout is set before return */
@@ -6955,7 +6745,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_UNSTR:
{
if (!doit) return "decreasing Strength";
- (void)dec_stat(A_STR, 25, FALSE);
+ dec_stat(A_STR, 25, FALSE);
/* Timeout is set before return */
@@ -6965,7 +6755,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_UNCON:
{
if (!doit) return "decreasing Constitution";
- (void)dec_stat(A_CON, 25, FALSE);
+ dec_stat(A_CON, 25, FALSE);
/* Timeout is set before return */
@@ -6975,7 +6765,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_UNCHR:
{
if (!doit) return "decreasing Charisma";
- (void)dec_stat(A_CHR, 25, FALSE);
+ dec_stat(A_CHR, 25, FALSE);
/* Timeout is set before return */
@@ -6985,7 +6775,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_UNDEX:
{
if (!doit) return "decreasing Dexterity";
- (void)dec_stat(A_DEX, 25, FALSE);
+ dec_stat(A_DEX, 25, FALSE);
/* Timeout is set before return */
@@ -6995,7 +6785,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_UNWIS:
{
if (!doit) return "decreasing Wisdom";
- (void)dec_stat(A_WIS, 25, FALSE);
+ dec_stat(A_WIS, 25, FALSE);
/* Timeout is set before return */
@@ -7005,12 +6795,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_STATLOSS:
{
if (!doit) return "stat loss";
- (void)dec_stat(A_STR, 15, FALSE);
- (void)dec_stat(A_INT, 15, FALSE);
- (void)dec_stat(A_WIS, 15, FALSE);
- (void)dec_stat(A_DEX, 15, FALSE);
- (void)dec_stat(A_CON, 15, FALSE);
- (void)dec_stat(A_CHR, 15, FALSE);
+ dec_stat(A_STR, 15, FALSE);
+ dec_stat(A_INT, 15, FALSE);
+ dec_stat(A_WIS, 15, FALSE);
+ dec_stat(A_DEX, 15, FALSE);
+ dec_stat(A_CON, 15, FALSE);
+ dec_stat(A_CHR, 15, FALSE);
/* Timeout is set before return */
@@ -7020,12 +6810,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_HISTATLOSS:
{
if (!doit) return "high stat loss";
- (void)dec_stat(A_STR, 25, FALSE);
- (void)dec_stat(A_INT, 25, FALSE);
- (void)dec_stat(A_WIS, 25, FALSE);
- (void)dec_stat(A_DEX, 25, FALSE);
- (void)dec_stat(A_CON, 25, FALSE);
- (void)dec_stat(A_CHR, 25, FALSE);
+ dec_stat(A_STR, 25, FALSE);
+ dec_stat(A_INT, 25, FALSE);
+ dec_stat(A_WIS, 25, FALSE);
+ dec_stat(A_DEX, 25, FALSE);
+ dec_stat(A_CON, 25, FALSE);
+ dec_stat(A_CHR, 25, FALSE);
/* Timeout is set before return */
@@ -7095,7 +6885,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_HUNGER:
{
if (!doit) return "create hunger";
- (void)set_food(PY_FOOD_WEAK);
+ set_food(PY_FOOD_WEAK);
/* Timeout is set before return */
@@ -7196,7 +6986,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
case ACT_CURE_HUNGER:
{
if (!doit) return "satisfy hunger every 100 turns";
- (void)set_food(PY_FOOD_MAX - 1);
+ set_food(PY_FOOD_MAX - 1);
/* Timeout is set before return */
@@ -7373,8 +7163,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
c_ptr->info &= ~(CAVE_GLOW);
/* Hack -- Forget "boring" grids */
- if (cave_plain_floor_grid(c_ptr) &&
- !(c_ptr->info & (CAVE_TRDT)))
+ if (cave_plain_floor_grid(c_ptr))
{
/* Forget the grid */
c_ptr->info &= ~(CAVE_MARK);
@@ -7561,7 +7350,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!get_aim_dir(&dir)) break;
fire_ball(GF_COLD, dir, 50, 2);
- (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20);
+ set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20);
o_ptr->timeout = rand_int(50) + 50;
@@ -7575,7 +7364,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!get_aim_dir(&dir)) break;
fire_ball(GF_FIRE, dir, 50, 2);
- (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
+ set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20);
o_ptr->timeout = rand_int(50) + 50;
@@ -7588,7 +7377,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!get_aim_dir(&dir)) break;
fire_ball(GF_ACID, dir, 50, 2);
- (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
+ set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20);
o_ptr->timeout = rand_int(50) + 50;
@@ -7602,7 +7391,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
if (!get_aim_dir(&dir)) break;
fire_ball(GF_ELEC, dir, 50, 2);
- (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
+ set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20);
o_ptr->timeout = rand_int(50) + 50;
@@ -7892,37 +7681,3 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
return NULL;
}
-
-
-static bool_ activate_spell(object_type * o_ptr, byte choice)
-{
- int mana = 0, gf = 0, mod = 0;
-
- rune_spell s_ptr;
-
-
- if (choice == 1)
- {
- gf = o_ptr->pval & 0xFFFF;
- mod = o_ptr->pval3 & 0xFFFF;
- mana = o_ptr->pval2 & 0xFF;
- }
- else if (choice == 2)
- {
- gf = o_ptr->pval >> 16;
- mod = o_ptr->pval3 >> 16;
- mana = o_ptr->pval2 >> 8;
- }
-
- s_ptr.type = gf;
- s_ptr.rune2 = 1 << mod;
- s_ptr.mana = mana;
-
- /* Execute */
- rune_exec(&s_ptr, 0);
-
- if (choice == 1) o_ptr->timeout = mana * 5;
- if (choice == 2) o_ptr->xtra2 = mana * 5;
-
- return (TRUE);
-}
diff --git a/src/cmd6.hpp b/src/cmd6.hpp
index ad6619f6..076a9abb 100644
--- a/src/cmd6.hpp
+++ b/src/cmd6.hpp
@@ -3,16 +3,16 @@
#include "h-basic.h"
#include "object_type_fwd.hpp"
-extern void set_stick_mode(object_type *o_ptr);
-extern void unset_stick_mode(void);
-extern void do_cmd_eat_food(void);
-extern void do_cmd_quaff_potion(void);
-extern void do_cmd_read_scroll(void);
-extern void do_cmd_aim_wand(void);
-extern void do_cmd_use_staff(void);
-extern void do_cmd_zap_rod(void);
-extern const char *activation_aux(object_type *o_ptr, bool_ desc, int item);
-extern void do_cmd_activate(void);
-extern void do_cmd_cut_corpse(void);
-extern void do_cmd_cure_meat(void);
-extern void do_cmd_drink_fountain(void);
+void set_stick_mode(object_type *o_ptr);
+void unset_stick_mode();
+void do_cmd_eat_food();
+void do_cmd_quaff_potion();
+void do_cmd_read_scroll();
+void do_cmd_aim_wand();
+void do_cmd_use_staff();
+void do_cmd_zap_rod();
+const char *activation_aux(object_type *o_ptr, bool_ desc, int item);
+void do_cmd_activate();
+void do_cmd_cut_corpse();
+void do_cmd_cure_meat();
+void do_cmd_drink_fountain();
diff --git a/src/cmd7.cc b/src/cmd7.cc
index 2317f8b9..ec13c908 100644
--- a/src/cmd7.cc
+++ b/src/cmd7.cc
@@ -13,19 +13,22 @@
#include "cmd1.hpp"
#include "cmd5.hpp"
#include "cmd6.hpp"
+#include "dungeon_flag.hpp"
#include "ego_item_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "mimic.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "skills.hpp"
#include "spells1.hpp"
#include "spells2.hpp"
@@ -39,6 +42,8 @@
#include "xtra2.hpp"
#include "z-rand.hpp"
+#include <fmt/format.h>
+
/*
* Describe class powers of Mindcrafters
*
@@ -107,6 +112,8 @@ void mindcraft_info(char *p, int power)
*/
void mimic_info(char *p, int power)
{
+ auto const &k_info = game->edit_data.k_info;
+
int plev = get_skill(SKILL_MIMICRY);
object_type *o_ptr = &p_ptr->inventory[INVEN_OUTER];
@@ -340,7 +347,7 @@ static bool_ get_magic_power(int *sn, magic_power *powers, int max_powers,
* do_cmd_cast calls this function if the player's class
* is 'mindcrafter'.
*/
-void do_cmd_mindcraft(void)
+void do_cmd_mindcraft()
{
int n = 0, b = 0;
@@ -417,12 +424,10 @@ void do_cmd_mindcraft(void)
/* Failed spell */
if (rand_int(100) < chance)
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_format("You failed to concentrate hard enough!");
- sound(SOUND_FAIL);
-
if (randint(100) < (chance / 2))
{
/* Backfire */
@@ -460,8 +465,6 @@ void do_cmd_mindcraft(void)
/* Successful spells */
else
{
- sound(SOUND_ZAP);
-
/* spell code */
switch (n)
{
@@ -483,7 +486,6 @@ void do_cmd_mindcraft(void)
{
b = detect_monsters_normal(DEFAULT_RADIUS);
if (plev > 14) b |= detect_monsters_invis(DEFAULT_RADIUS);
- if (plev > 4) b |= detect_traps(DEFAULT_RADIUS);
}
else
{
@@ -531,7 +533,7 @@ void do_cmd_mindcraft(void)
{
int ii, ij;
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("Not on special levels!");
break;
@@ -627,7 +629,7 @@ void do_cmd_mindcraft(void)
}
else
{
- (void)mindblast_monsters(plev * ((plev - 5) / 10 + 1));
+ mindblast_monsters(plev * ((plev - 5) / 10 + 1));
}
break;
@@ -654,11 +656,11 @@ void do_cmd_mindcraft(void)
if (!p_ptr->fast)
{
/* Haste */
- (void)set_fast(b, plev / 5);
+ set_fast(b, plev / 5);
}
else
{
- (void)set_fast(p_ptr->fast + b, plev / 5);
+ set_fast(p_ptr->fast + b, plev / 5);
}
break;
@@ -722,7 +724,7 @@ void do_cmd_mindcraft(void)
msg_print("You faint from the effort!");
/* Hack -- Bypass free action */
- (void)set_paralyzed(randint(5 * oops + 1));
+ set_paralyzed(randint(5 * oops + 1));
/* Damage WIS (possibly permanently) */
if (rand_int(100) < 50)
@@ -733,7 +735,7 @@ void do_cmd_mindcraft(void)
msg_print("You have damaged your mind!");
/* Reduce constitution */
- (void)dec_stat(A_WIS, 15 + randint(10), perm);
+ dec_stat(A_WIS, 15 + randint(10), perm);
}
}
@@ -762,6 +764,8 @@ static int get_mimic_chance(int mimic)
void do_cmd_mimic_lore()
{
+ auto const &k_info = game->edit_data.k_info;
+
int fail;
object_type *o_ptr;
@@ -840,7 +844,7 @@ void do_cmd_mimic_lore()
p_ptr->update |= (PU_BONUS);
}
-static bool_ mimic_forbid_travel(void *, void *, void *)
+static bool mimic_forbid_travel(void *, void *, void *)
{
u32b value = p_ptr->mimic_extra >> 16;
u32b att = p_ptr->mimic_extra & 0xFFFF;
@@ -848,17 +852,17 @@ static bool_ mimic_forbid_travel(void *, void *, void *)
if(value > 0 && (att & CLASS_ARMS || att & CLASS_LEGS))
{
msg_print("You had best not travel with your extra limbs.");
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
/*
* do_cmd_cast calls this function if the player's class
* is 'mimic'.
*/
-void do_cmd_mimic(void)
+void do_cmd_mimic()
{
int n = 0, b = 0;
@@ -946,12 +950,10 @@ void do_cmd_mimic(void)
/* Failed spell */
if (rand_int(100) < fail)
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_format("You failed to concentrate hard enough!");
- sound(SOUND_FAIL);
-
if (randint(100) < (fail / 2))
{
/* Backfire */
@@ -982,8 +984,6 @@ void do_cmd_mimic(void)
/* Successful spells */
else
{
- sound(SOUND_ZAP);
-
/* spell code */
switch (n)
{
@@ -1131,7 +1131,7 @@ void do_cmd_mimic(void)
msg_print("You faint from the effort!");
/* Hack -- Bypass free action */
- (void)set_paralyzed(randint(5 * oops + 1));
+ set_paralyzed(randint(5 * oops + 1));
/* Damage WIS (possibly permanently) */
if (rand_int(100) < 50)
@@ -1142,7 +1142,7 @@ void do_cmd_mimic(void)
msg_print("You have damaged your mind!");
/* Reduce constitution */
- (void)dec_stat(A_DEX, 15 + randint(10), perm);
+ dec_stat(A_DEX, 15 + randint(10), perm);
}
}
@@ -1158,7 +1158,7 @@ void do_cmd_mimic(void)
* do_cmd_cast calls this function if the player's class
* is 'beastmaster'.
*/
-void do_cmd_beastmaster(void)
+void do_cmd_beastmaster()
{
int plev = p_ptr->lev, i, num;
@@ -1200,7 +1200,7 @@ void do_cmd_beastmaster(void)
/*
* Command to ask favors from your god.
*/
-void do_cmd_pray(void)
+void do_cmd_pray()
{
if (p_ptr->pgod == GOD_NONE)
{
@@ -1228,7 +1228,7 @@ void do_cmd_pray(void)
/*
* Return percentage chance of spell failure.
*/
-int spell_chance_random(random_spell* rspell)
+int spell_chance_random(random_spell const *rspell)
{
int chance, minfail;
@@ -1263,29 +1263,28 @@ int spell_chance_random(random_spell* rspell)
*/
static void print_spell_batch(int batch, int max)
{
- char buff[80];
-
- random_spell* rspell;
-
- int i;
-
+ auto const &random_spells = p_ptr->random_spells;
prt(format(" %-30s Lev Fail Mana Damage ", "Name"), 1, 20);
+ int i;
for (i = 0; i < max; i++)
{
- rspell = &random_spells[batch * 10 + i];
+ auto rspell = &random_spells[batch * 10 + i];
+
+ std::string buff;
+ std::string name = name_spell(rspell);
if (rspell->untried)
{
- strnfmt(buff, 80, " %c) %-30s (Spell untried) ",
- I2A(i), rspell->name);
+ buff = fmt::format(" {:c}) {:<30} (Spell untried) ",
+ (char) I2A(i), name);
}
else
{
- strnfmt(buff, 80, " %c) %-30s %3d %4d%% %3d %3dd%d ",
- I2A(i), rspell->name,
+ buff = fmt::format(" {:c}) {:<30} {:>3d} {:>4d}% {:>3d} {:>3d}d{:d} ",
+ (char) I2A(i), name,
rspell->level, spell_chance_random(rspell), rspell->mana,
rspell->dam_dice, rspell->dam_sides);
}
@@ -1301,18 +1300,13 @@ static void print_spell_batch(int batch, int max)
/*
* List ten random spells and ask to pick one.
*/
-static random_spell* select_spell_from_batch(int batch)
+static random_spell* select_spell_from_batch(std::size_t batch)
{
- char tmp[160];
-
- char out_val[30];
+ auto &random_spells = p_ptr->random_spells;
+ char tmp[160];
char which;
-
- int mut_max = 10;
-
- random_spell* ret;
-
+ random_spell* ret = nullptr;
/* Enter "icky" mode */
character_icky = TRUE;
@@ -1320,13 +1314,12 @@ static random_spell* select_spell_from_batch(int batch)
/* Save the screen */
Term_save();
- if (spell_num < (batch + 1) * 10)
- {
- mut_max = spell_num - batch * 10;
- }
+ int const mut_max = (random_spells.size() < (batch + 1) * 10)
+ ? random_spells.size() - batch * 10
+ : 10;
- strnfmt(tmp, 160, "(a-%c, A-%c to browse, / to rename, - to comment) Select a power: ",
- I2A(mut_max - 1), I2A(mut_max - 1) - 'a' + 'A');
+ strnfmt(tmp, 160, "(a-%c) Select a power: ",
+ I2A(mut_max - 1));
prt(tmp, 0, 0);
@@ -1365,65 +1358,7 @@ static random_spell* select_spell_from_batch(int batch)
continue;
}
- /* Rename */
- if (which == '/')
- {
- prt("Rename which power: ", 0, 0);
- which = tolower(inkey());
-
- if (isalpha(which) && (A2I(which) <= mut_max))
- {
- strcpy(out_val, random_spells[batch*10 + A2I(which)].name);
- if (get_string("Name this power: ", out_val, 29))
- {
- strcpy(random_spells[batch*10 + A2I(which)].name, out_val);
- }
- prt(tmp, 0, 0);
- }
- else
- {
- bell();
- prt(tmp, 0, 0);
- }
-
- /* Wait for next command */
- continue;
- }
-
- /* Comment */
- if (which == '-')
- {
- prt("Comment which power: ", 0, 0);
- which = tolower(inkey());
-
- if (isalpha(which) && (A2I(which) <= mut_max))
- {
- strcpy(out_val, random_spells[batch*10 + A2I(which)].desc);
- if (get_string("Comment this power: ", out_val, 29))
- {
- strcpy(random_spells[batch*10 + A2I(which)].desc, out_val);
- }
- prt(tmp, 0, 0);
- }
- else
- {
- bell();
- prt(tmp, 0, 0);
- }
-
- /* Wait for next command */
- continue;
- }
-
- if (isalpha(which) && isupper(which))
- {
- which = tolower(which);
- c_prt(TERM_L_BLUE, format("%s : %s", random_spells[batch*10 + A2I(which)].name, random_spells[batch*10 + A2I(which)].desc), 0, 0);
- inkey();
- prt(tmp, 0, 0);
- continue;
- }
- else if (isalpha(which) && (A2I(which) < mut_max))
+ if (isalpha(which) && (A2I(which) < mut_max))
{
/* Pick the power */
ret = &random_spells[batch * 10 + A2I(which)];
@@ -1453,12 +1388,11 @@ static random_spell* select_spell_from_batch(int batch)
*/
static random_spell* select_spell()
{
- char tmp[160];
+ auto const &random_spells = p_ptr->random_spells;
+ char tmp[160];
char which;
- int batch_max = (spell_num - 1) / 10;
-
random_spell *ret;
@@ -1470,12 +1404,15 @@ static random_spell* select_spell()
}
/* No spells available */
- if (spell_num == 0)
+ if (random_spells.empty())
{
msg_print("There are no spells you can cast.");
return NULL;
}
+ /* How many spells in the last batch? */
+ int batch_max = (random_spells.size() - 1) / 10;
+
/* Enter "icky" mode */
character_icky = TRUE;
@@ -1535,7 +1472,7 @@ static random_spell* select_spell()
}
-void do_cmd_powermage(void)
+void do_cmd_powermage()
{
random_spell *s_ptr;
@@ -1581,7 +1518,7 @@ void do_cmd_powermage(void)
char sfail[80];
/* Flush input if told so */
- if (flush_failure) flush();
+ flush_on_failure();
/* Insane players can see something strange */
if (rand_int(100) < insanity)
@@ -1596,8 +1533,6 @@ void do_cmd_powermage(void)
msg_print("You failed to get the spell off!");
}
- sound(SOUND_FAIL);
-
/* Let time pass */
if (is_magestaff()) energy_use = 80;
else energy_use = 100;
@@ -1615,7 +1550,7 @@ void do_cmd_powermage(void)
p_ptr->csp -= s_ptr->mana;
- s_ptr->untried = FALSE;
+ s_ptr->untried = false;
proj_flags = s_ptr->proj_flags;
/* Hack -- Spell needs a target */
@@ -1761,7 +1696,7 @@ void brand_ammo(int brand_type, int bolts_only)
}
else
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("The enchantment failed.");
}
}
@@ -1792,6 +1727,8 @@ void summon_monster(int sumtype)
*/
void do_cmd_possessor()
{
+ auto const &r_info = game->edit_data.r_info;
+
char ch, ext;
@@ -1831,8 +1768,6 @@ void do_cmd_possessor()
if (ext == 1)
{
- bool_ use_great = FALSE;
-
if (p_ptr->disembodied)
{
msg_print("You don't currently own a body to use.");
@@ -1840,26 +1775,11 @@ void do_cmd_possessor()
}
/* Do we have access to all the powers ? */
- if (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level)
- use_great = TRUE;
+ bool use_great = (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level);
- use_symbiotic_power(p_ptr->body_monster, use_great, FALSE, FALSE);
-
- if (p_ptr->csp < 0)
- {
- msg_print("You lose control of your body!");
- if (!do_cmd_leave_body(FALSE))
- {
- cmsg_print(TERM_VIOLET,
- "You are forced back into your body by your cursed items, "
- "you suffer a system shock!");
-
- p_ptr->chp = 1;
-
- /* Display the hitpoints */
- p_ptr->redraw |= (PR_FRAME);
- }
- }
+ /* Select power */
+ use_monster_power(p_ptr->body_monster, use_great);
+ assert(p_ptr->csp >= 0); // Sanity check
}
else if (ext == 2)
{
@@ -1900,7 +1820,7 @@ static object_filter_t const &item_tester_hook_convertible()
* do_cmd_cast calls this function if the player's class
* is 'archer'.
*/
-void do_cmd_archer(void)
+void do_cmd_archer()
{
int ext = 0;
char ch;
@@ -1992,11 +1912,11 @@ void do_cmd_archer(void)
q_ptr->discount = 90;
q_ptr->found = OBJ_FOUND_SELFMADE;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
msg_print("You make some ammo.");
- (void)wall_to_mud(dir);
+ wall_to_mud(dir);
p_ptr->update |= (PU_VIEW | PU_FLOW | PU_MON_LITE);
p_ptr->window |= (PW_OVERHEAD);
}
@@ -2035,7 +1955,7 @@ void do_cmd_archer(void)
inc_stack_size(item, -1);
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
}
/**********Create bolts*********/
@@ -2071,14 +1991,14 @@ void do_cmd_archer(void)
inc_stack_size(item, -1);
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
}
}
/*
* Control whether shots are allowed to pierce
*/
-void do_cmd_set_piercing(void)
+void do_cmd_set_piercing()
{
char ch;
char com[80];
@@ -2148,7 +2068,7 @@ void necro_info(char *p, int power)
/*
* Cast a Necromancy spell
*/
-void do_cmd_necromancer(void)
+void do_cmd_necromancer()
{
int n = 0, b = 0;
int chance;
@@ -2223,9 +2143,8 @@ void do_cmd_necromancer(void)
/* Failed spell */
if (rand_int(100) < chance)
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_format("You failed to concentrate hard enough!");
- sound(SOUND_FAIL);
if (randint(100) < (chance / 2))
{
@@ -2269,8 +2188,6 @@ void do_cmd_necromancer(void)
}
else
{
- sound(SOUND_ZAP);
-
/* spell code */
switch (n)
{
@@ -2326,7 +2243,7 @@ void do_cmd_necromancer(void)
object_prep(o_ptr, k_idx);
apply_magic(o_ptr, plev * 2, TRUE, TRUE, TRUE);
- o_ptr->art_flags5 |= TR5_TEMPORARY;
+ o_ptr->art_flags |= TR_TEMPORARY;
o_ptr->timeout = dur;
/* These objects are "storebought" */
@@ -2335,7 +2252,7 @@ void do_cmd_necromancer(void)
object_aware(o_ptr);
object_known(o_ptr);
- (void)inven_carry(o_ptr, FALSE);
+ inven_carry(o_ptr, FALSE);
k_allow_special[k_idx] = FALSE;
@@ -2425,7 +2342,7 @@ void do_cmd_necromancer(void)
msg_print("You faint from the effort!");
/* Hack -- Bypass free action */
- (void)set_paralyzed(randint(5 * oops + 1));
+ set_paralyzed(randint(5 * oops + 1));
/* Damage CON (possibly permanently) */
if (rand_int(100) < 50)
@@ -2436,7 +2353,7 @@ void do_cmd_necromancer(void)
msg_print("You have damaged your body!");
/* Reduce constitution */
- (void)dec_stat(A_CON, 15 + randint(10), perm);
+ dec_stat(A_CON, 15 + randint(10), perm);
}
}
@@ -2448,23 +2365,6 @@ void do_cmd_necromancer(void)
}
/*
- * Hook to determine if an object is "runestone"
- */
-static bool item_tester_hook_runestone(object_type const *o_ptr)
-{
- return ((o_ptr->tval == TV_RUNE2) &&
- (o_ptr->sval == RUNE_STONE) &&
- (o_ptr->pval == 0));
-}
-
-static bool item_tester_hook_runestone_full(object_type const *o_ptr)
-{
- return ((o_ptr->tval == TV_RUNE2) &&
- (o_ptr->sval == RUNE_STONE) &&
- (o_ptr->pval != 0));
-}
-
-/*
* math.h(sqrt) is banned of angband so ... :)
*/
s32b sroot(s32b n)
@@ -2486,1054 +2386,6 @@ s32b sroot(s32b n)
}
-/*
- * Damage formula, for runes
- */
-void rune_calc_power(s32b *power, s32b *powerdiv)
-{
- /* Not too weak power(paranoia) */
- *power = (*power < 1) ? 1 : *power;
- *power += 3;
-
- *power = 37 * sroot(*power) / 10;
-
- /* To reduce the high level power, while increasing the low levels */
- *powerdiv = *power / 3;
- if (*powerdiv < 1) *powerdiv = 1;
-
- /* Use the spell multiplicator */
- *power *= (p_ptr->to_s / 2) ? (p_ptr->to_s / 2) : 1;
-}
-
-
-/*
- * Return percentage chance of runespell failure.
- */
-int spell_chance_rune(rune_spell* spell)
-{
- int chance, minfail;
-
- s32b power = spell->mana, power_rune = 0, powerdiv = 0;
-
-
- if (spell->rune2 & RUNE_POWER_SURGE)
- {
- power_rune += 4;
- }
- if (spell->rune2 & RUNE_ARMAGEDDON)
- {
- power_rune += 3;
- }
- if (spell->rune2 & RUNE_SPHERE)
- {
- power_rune += 2;
- }
- if (spell->rune2 & RUNE_RAY)
- {
- power_rune += 1;
- }
-
- rune_calc_power(&power, &powerdiv);
-
- chance = (5 * power_rune) + (power);
-
- /* Reduce failure rate by INT/WIS adjustment */
- chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_DEX]] - 1);
-
- /* Extract the minimum failure rate */
- minfail = adj_mag_fail[p_ptr->stat_ind[A_DEX]];
-
- /* Return the chance */
- return clamp_failure_chance(chance, minfail);
-}
-
-
-/*
- * Combine the Runes
- */
-int rune_exec(rune_spell *spell, int cost)
-{
- int dir, power_rune = 0, mana_used, plev = get_skill(SKILL_RUNECRAFT);
-
- int chance;
-
- s32b power, powerdiv;
-
- int rad = 0, ty = -1, tx = -1, dam = 0, flg = 0;
-
-
- if (spell->rune2 & RUNE_POWER_SURGE)
- {
- power_rune += 4;
- }
- if (spell->rune2 & RUNE_ARMAGEDDON)
- {
- power_rune += 3;
- }
- if (spell->rune2 & RUNE_SPHERE)
- {
- power_rune += 2;
- }
- if (spell->rune2 & RUNE_RAY)
- {
- power_rune += 1;
- }
-
-
- power = spell->mana;
-
- if (cost && ((power * cost / 100) > p_ptr->csp - (power_rune * (plev / 5))))
- {
- power = p_ptr->csp - (power_rune * (plev / 5));
- mana_used = power + (power_rune * (plev / 5));
- }
- else
- {
- mana_used = (power * cost / 100) + (power_rune * (plev / 5));
- }
-
- rune_calc_power(&power, &powerdiv);
-
- dam = damroll(powerdiv, power);
-
- if (wizard) msg_format("Rune %dd%d = dam %d", powerdiv, power, dam);
-
- /* Extract the base spell failure rate */
- chance = spell_chance_rune(spell);
-
- /* Failure ? */
- if (rand_int(100) < chance)
- {
- int insanity = (p_ptr->msane - p_ptr->csane) * 100 / p_ptr->msane;
- char sfail[80];
-
- /* Flush input if told so */
- if (flush_failure) flush();
-
- /* Insane players can see something strange */
- if (rand_int(100) < insanity)
- {
- get_rnd_line("sfail.txt", sfail);
- msg_format("A cloud of %s appears above you.", sfail);
- }
-
- /* Normal failure messages */
- else
- {
- msg_print("You failed to get the spell off!");
- }
-
- sound(SOUND_FAIL);
-
- if (is_magestaff()) energy_use = 80;
- else energy_use = 100;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
- return (mana_used);
- }
-
- if (spell->rune2 & RUNE_POWER_SURGE)
- {
- flg |= (PROJECT_VIEWABLE);
- ty = p_ptr->py;
- tx = p_ptr->px;
- }
-
- if (spell->rune2 & RUNE_ARMAGEDDON)
- {
- flg |= (PROJECT_THRU);
- flg |= (PROJECT_KILL);
- flg |= (PROJECT_ITEM);
- flg |= (PROJECT_GRID);
- flg |= (PROJECT_METEOR_SHOWER);
- rad = (power / 8 == 0) ? 1 : power / 8;
- rad = (rad > 10) ? 10 : rad;
- ty = p_ptr->py;
- tx = p_ptr->px;
- }
-
- if (spell->rune2 & RUNE_SPHERE)
- {
- flg |= (PROJECT_THRU);
- flg |= (PROJECT_KILL);
- flg |= (PROJECT_ITEM);
- flg |= (PROJECT_GRID);
- rad = (power / 8 == 0) ? 1 : power / 8;
- rad = (rad > 10) ? 10 : rad;
- ty = p_ptr->py;
- tx = p_ptr->px;
- }
-
- if (spell->rune2 & RUNE_RAY)
- {
- flg |= (PROJECT_THRU);
- flg |= (PROJECT_KILL);
- flg |= (PROJECT_BEAM);
- ty = -1;
- tx = -1;
- }
- if (spell->rune2 & RUNE_ARROW)
- {
- flg |= (PROJECT_THRU);
- flg |= (PROJECT_STOP);
- flg |= (PROJECT_KILL);
- ty = -1;
- tx = -1;
- }
- if (spell->rune2 & RUNE_SELF)
- {
- flg |= (PROJECT_THRU);
- flg |= (PROJECT_STOP);
- flg |= (PROJECT_KILL);
- ty = p_ptr->py;
- tx = p_ptr->px;
- unsafe = TRUE;
- }
-
- if ((ty == -1) && (tx == -1))
- {
- if (!get_aim_dir(&dir)) return (mana_used);
-
- /* Use the given direction */
- tx = p_ptr->px + ddx[dir];
- ty = p_ptr->py + ddy[dir];
-
- /* Hack -- Use an actual "target" */
- if ((dir == 5) && target_okay())
- {
- tx = target_col;
- ty = target_row;
- }
- }
-
- if (flg & PROJECT_VIEWABLE)
- {
- project_hack(spell->type, dam);
- }
- else if (flg & PROJECT_METEOR_SHOWER)
- {
- project_meteor(rad, spell->type, dam, flg);
- }
- else project(0, rad, ty, tx, dam, spell->type, flg);
-
- if (unsafe) unsafe = FALSE;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
-
- return (mana_used);
-}
-
-
-/*
- * Test if all runes needed at in the player p_ptr->inventory
- */
-bool_ test_runespell(rune_spell *spell)
-{
- int i;
-
- object_type *o_ptr;
-
- bool_ typeok = FALSE;
-
- int rune2 = 0;
-
-
- for (i = 0; i < INVEN_WIELD; i++)
- {
- o_ptr = &p_ptr->inventory[i];
-
- if (!o_ptr->k_idx) continue;
-
- /* Does the rune1(type) match ? */
- if ((o_ptr->tval == TV_RUNE1) && (o_ptr->sval == spell->type))
- {
- typeok = TRUE;
- }
-
- if ((o_ptr->tval == TV_RUNE2) && (o_ptr->sval != RUNE_STONE))
- {
- /* Add it to the list */
- rune2 |= 1 << o_ptr->sval;
- }
- }
-
- /* Need all runes to be present */
- return (typeok && ((rune2 & spell->rune2) == spell->rune2));
-}
-
-
-/*
- * Ask for rune, rune2 and mana
- */
-bool_ get_runespell(rune_spell *spell)
-{
- s32b rune_combine = 0;
-
- /* Lambda to use for selecting the secondary rune(s) */
- auto rune2_filter = [&](object_type const *o_ptr) -> bool {
- return ((o_ptr->tval == TV_RUNE2) &&
- (o_ptr->sval != RUNE_STONE) &&
- (!(rune_combine & BIT(o_ptr->sval))));
- };
-
- /* Prompt */
- const char *const q = "Use which rune? ";
- const char *const s = "You have no rune to use.";
-
- /* Extract first rune for the base effect */
- int type = 0;
- {
- int item;
- if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR), object_filter::TVal(TV_RUNE1)))
- {
- return FALSE;
- }
-
- object_type *o_ptr = get_object(item);
- type = o_ptr->sval;
- }
-
- /* Choose secondary rune(s) */
- int rune2 = 0;
- while (1)
- {
- int item;
- if (!get_item(&item, q, nullptr, (USE_INVEN | USE_FLOOR), rune2_filter))
- {
- break;
- }
-
- object_type *o_ptr = get_object(item);
-
- rune_combine |= 1 << o_ptr->sval;
- rune2 |= 1 << o_ptr->sval;
- }
-
- if (!rune2)
- {
- msg_print("You have not selected a second rune!");
- return (FALSE);
- }
-
- int power_rune = 0;
- int plev = get_skill(SKILL_RUNECRAFT);
- s32b power = get_quantity("Which amount of Mana? ",
- p_ptr->csp - (power_rune * (plev / 5)));
- if (power < 1)
- {
- power = 1;
- }
-
- spell->mana = power;
- spell->type = type;
- spell->rune2 = rune2;
-
- return (TRUE);
-}
-
-
-void do_cmd_rune(void)
-{
- rune_spell spell;
-
-
- /* Require some mana */
- if (p_ptr->csp <= 0)
- {
- msg_print("You have no mana!");
- return;
- }
-
- /* Require lite */
- if (p_ptr->blind || no_lite())
- {
- msg_print("You cannot see!");
- return;
- }
-
- /* Not when confused */
- if (p_ptr->confused)
- {
- msg_print("You are too confused!");
- return;
- }
-
- if (!get_runespell(&spell)) return;
-
- /* Execute at normal mana cost */
- p_ptr->csp -= rune_exec(&spell, 100);
-
- /* Safety :) */
- if (p_ptr->csp < 0) p_ptr->csp = 0;
-
- /* Take a turn */
- if (is_magestaff()) energy_use = 80;
- else energy_use = 100;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
-}
-
-
-/*
- * Print a batch of runespells.
- */
-static void print_runespell_batch(int batch, int max)
-{
- char buff[80];
-
- rune_spell* spell;
-
- int i;
-
- s32b power, powerdiv;
-
- int p, dp;
-
-
- prt(format(" %-30s Fail Mana Power", "Name"), 1, 20);
-
- for (i = 0; i < max; i++)
- {
- spell = &rune_spells[batch * 10 + i];
-
- power = spell->mana;
- rune_calc_power(&power, &powerdiv);
- p = power;
- dp = powerdiv;
-
- strnfmt(buff, 80, " %c) %-30s %4d%% %4d %dd%d ", I2A(i), spell->name,
- spell_chance_rune(spell), spell->mana, dp, p);
-
- prt(buff, 2 + i, 20);
- }
- prt("", 2 + i, 20);
-}
-
-
-
-/*
- * List ten random spells and ask to pick one.
- */
-
-static rune_spell* select_runespell_from_batch(int batch, int *s_idx)
-{
- char tmp[160];
-
- char out_val[30];
-
- char which;
-
- int mut_max = 10;
-
- rune_spell* ret;
-
-
- character_icky = TRUE;
-
- if (rune_num < (batch + 1) * 10)
- {
- mut_max = rune_num - batch * 10;
- }
-
- strnfmt(tmp, 160, "(a-%c, * to list, / to rename, - to comment) Select a power: ",
- I2A(mut_max - 1));
-
- prt(tmp, 0, 0);
-
- while (1)
- {
- Term_save();
-
- print_runespell_batch(batch, mut_max);
-
- which = inkey();
-
- Term_load();
-
- if (which == ESCAPE)
- {
- *s_idx = -1;
- ret = NULL;
- break;
- }
- else if ((which == '*') || (which == '?') || (which == ' '))
- {
- print_runespell_batch(batch, mut_max);
- }
- else if ((which == '\r') && (mut_max == 1))
- {
- *s_idx = batch * 10;
- ret = &rune_spells[batch * 10];
- break;
- }
- else if (which == '/')
- {
- prt("Rename which power: ", 0, 0);
- which = tolower(inkey());
-
- if (isalpha(which) && (A2I(which) <= mut_max))
- {
- strcpy(out_val, rune_spells[batch*10 + A2I(which)].name);
- if (get_string("Name this power: ", out_val, 29))
- {
- strcpy(rune_spells[batch*10 + A2I(which)].name, out_val);
- }
- prt(tmp, 0, 0);
- }
- else
- {
- bell();
- prt(tmp, 0, 0);
- }
- }
- else
- {
- which = tolower(which);
- if (isalpha(which) && (A2I(which) < mut_max))
- {
- *s_idx = batch * 10 + A2I(which);
- ret = &rune_spells[batch * 10 + A2I(which)];
- break;
- }
- else
- {
- bell();
- }
- }
- }
-
- character_icky = FALSE;
-
- return (ret);
-}
-
-
-/*
- * Pick a random spell from a menu
- */
-
-rune_spell* select_runespell(int *s_idx)
-{
- char tmp[160];
-
- char which;
-
- int batch_max = (rune_num - 1) / 10;
-
- if (rune_num == 0)
- {
- msg_print("There are no runespells you can cast.");
- return (NULL);
- }
-
- character_icky = TRUE;
- Term_save();
-
- strnfmt(tmp, 160, "(a-%c) Select batch of powers: ", I2A(batch_max));
-
- prt(tmp, 0, 0);
-
- while (1)
- {
- which = inkey();
-
- if (which == ESCAPE)
- {
- Term_load();
- character_icky = FALSE;
- return (NULL);
- }
- else if ((which == '\r') && (batch_max == 0))
- {
- Term_load();
- character_icky = FALSE;
- return (select_runespell_from_batch(0, s_idx));
-
- }
- else
- {
- which = tolower(which);
- if (isalpha(which) && (A2I(which) <= batch_max))
- {
- Term_load();
- character_icky = FALSE;
- return (select_runespell_from_batch(A2I(which), s_idx));
- }
- else
- {
- bell();
- }
- }
- }
-}
-
-
-/*
- * Cast a memorized runespell
- * Note that the only limits are antimagic & conf, NOT blind
- */
-void do_cmd_rune_cast()
-{
- rune_spell *s_ptr;
-
- int s_idx;
-
-
- /* Require some mana */
- if (p_ptr->csp <= 0)
- {
- msg_print("You have no mana!");
- return;
- }
-
- /* No magic */
- if (p_ptr->antimagic)
- {
- msg_print("Your anti-magic field disrupts any magic attempts.");
- return;
- }
-
- /* No magic */
- if (p_ptr->anti_magic)
- {
- msg_print("Your anti-magic shell disrupts any magic attempts.");
- return;
- }
-
- /* Not when confused */
- if (p_ptr->confused)
- {
- msg_print("You are too confused!");
- return;
- }
-
- s_ptr = select_runespell(&s_idx);
-
- if (s_ptr == NULL) return;
-
- /* Need the runes */
- if (!test_runespell(s_ptr))
- {
- msg_print("You lack some essential rune(s) for this runespell!");
- return;
- }
-
- /* Execute at normal mana cost */
- p_ptr->csp -= rune_exec(s_ptr, 100);
-
- /* Safety :) */
- if (p_ptr->csp < 0) p_ptr->csp = 0;
-
- /* Take a turn */
- if (is_magestaff()) energy_use = 80;
- else energy_use = 100;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
-}
-
-
-/*
- * Cast a runespell from a carved runestone
- */
-void do_cmd_runestone()
-{
- rune_spell s_ptr;
-
- int item;
-
-
- /* Require some mana */
- if (p_ptr->csp <= 0)
- {
- msg_print("You have no mana!");
- return;
- }
-
- /* Require lite */
- if (p_ptr->blind || no_lite())
- {
- msg_print("You cannot see!");
- return;
- }
-
- /* Not when confused */
- if (p_ptr->confused)
- {
- msg_print("You are too confused!");
- return;
- }
-
- /* No magic */
- if (p_ptr->antimagic)
- {
- msg_print("Your anti-magic field disrupts any magic attempts.");
- return;
- }
-
- /* No magic */
- if (p_ptr->anti_magic)
- {
- msg_print("Your anti-magic shell disrupts any magic attempts.");
- return;
- }
-
- /* Get an item */
- if (!get_item(&item,
- "Cast from which runestone? ",
- "You have no runestone to cast from.",
- (USE_INVEN | USE_FLOOR),
- item_tester_hook_runestone_full))
- {
- return;
- }
-
- /* Get the item */
- object_type *o_ptr = get_object(item);
-
- s_ptr.type = o_ptr->pval;
- s_ptr.rune2 = o_ptr->pval2;
- s_ptr.mana = o_ptr->pval3;
-
- /* Execute less mana */
- p_ptr->csp -= rune_exec(&s_ptr, 75);
-
- /* Safety :) */
- if (p_ptr->csp < 0) p_ptr->csp = 0;
-
- /* Take a turn */
- energy_use = 100;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
-}
-
-
-/*
- * Add a runespell to the list
- */
-void do_cmd_rune_add_mem()
-{
- rune_spell s_ptr;
-
- rune_spell *ds_ptr = &rune_spells[rune_num];
-
-
- /* Not when confused */
- if (p_ptr->confused)
- {
- msg_print("You are too confused!");
- return;
- }
-
-
- if (rune_num >= MAX_RUNES)
- {
- msg_print("You have already learned the maximum number of runespells!");
- return;
- }
-
- if (!get_runespell(&s_ptr)) return;
-
- ds_ptr->type = s_ptr.type;
- ds_ptr->rune2 = s_ptr.rune2;
- ds_ptr->mana = s_ptr.mana;
- strcpy(ds_ptr->name, "Unnamed Runespell");
-
- get_string("Name this runespell: ", ds_ptr->name, 29);
-
- rune_num++;
-
- /* Take a turn */
- energy_use = 100;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
-}
-
-
-/*
- * Carve a runespell onto a Runestone
- */
-void do_cmd_rune_carve()
-{
- rune_spell s_ptr;
-
- int item, i;
-
- char out_val[80];
-
-
- /* Not when confused */
- if (p_ptr->confused)
- {
- msg_print("You are too confused!");
- return;
- }
-
- /* Require lite */
- if (p_ptr->blind || no_lite())
- {
- msg_print("You cannot see!");
- return;
- }
-
- if (!get_check("Beware, this will destroy the involved runes, continue?"))
- {
- return;
- }
-
- if (!get_runespell(&s_ptr)) return;
-
- /* Get an item */
- if (!get_item(&item,
- "Use which runestone? ",
- "You have no runestone to use.",
- (USE_INVEN | USE_FLOOR),
- item_tester_hook_runestone))
- {
- return;
- }
-
- /* Get the item */
- object_type *o_ptr = get_object(item);
-
- o_ptr->pval = s_ptr.type;
- o_ptr->pval2 = s_ptr.rune2;
- o_ptr->pval3 = s_ptr.mana;
-
- /* Start with nothing */
- strcpy(out_val, "");
-
- /* Use old inscription */
- if (o_ptr->note)
- {
- /* Start with the old inscription */
- strcpy(out_val, quark_str(o_ptr->note));
- }
-
- /* Get a new inscription (possibly empty) */
- if (get_string("Name this runestone: ", out_val, 80))
- {
- /* Save the inscription */
- o_ptr->note = quark_add(out_val);
-
- /* Combine the pack */
- p_ptr->notice |= (PN_COMBINE);
-
- /* Window stuff */
- p_ptr->window |= (PW_INVEN | PW_EQUIP);
- }
-
- /* Delete the runes */
- for (i = 0; i < INVEN_WIELD; i++)
- {
- o_ptr = &p_ptr->inventory[i];
-
- if (o_ptr->k_idx)
- {
- bool_ do_del = FALSE;
-
- if ((o_ptr->tval == TV_RUNE1) && (o_ptr->sval == s_ptr.type)) do_del = TRUE;
- if ((o_ptr->tval == TV_RUNE2) && (BIT(o_ptr->sval) & s_ptr.rune2)) do_del = TRUE;
-
- if (do_del)
- {
- inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
- }
- }
- }
-
- /* Take a turn -- Carving takes a LONG time */
- energy_use = 400;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
-}
-
-
-/*
- * Remove a runespell
- */
-void do_cmd_rune_del()
-{
- rune_spell *s_ptr;
-
- int s_idx;
-
- int i;
-
-
- /* Not when confused */
- if (p_ptr->confused)
- {
- msg_print("You are too confused!");
- return;
- }
-
- s_ptr = select_runespell(&s_idx);
-
- if (s_ptr == NULL) return;
-
- /* Delete and move */
- for (i = s_idx + 1; i < rune_num; i++)
- {
- rune_spells[i - 1].type = rune_spells[i].type;
- rune_spells[i - 1].rune2 = rune_spells[i].rune2;
- rune_spells[i - 1].mana = rune_spells[i].mana;
- strcpy(rune_spells[i - 1].name, rune_spells[i].name);
- }
- rune_num--;
-
- /* Take a turn */
- energy_use = 100;
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- p_ptr->redraw |= (PR_FRAME);
-}
-
-
-void do_cmd_rune_add()
-{
- int ext = 0;
-
- char ch;
-
-
- /* Select what to do */
- while (TRUE)
- {
- if (!get_com("Add to [M]emory(need runes to cast) or "
- "Carve a [R]unestone(less mana to cast)", &ch))
- {
- ext = 0;
- break;
- }
- if ((ch == 'M') || (ch == 'm'))
- {
- ext = 1;
- break;
- }
- if ((ch == 'R') || (ch == 'r'))
- {
- ext = 2;
- break;
- }
- }
-
- switch (ext)
- {
- /* Create a Spell in memory */
- case 1:
- {
- do_cmd_rune_add_mem();
- break;
- }
-
- /* Carve a Runestone */
- case 2:
- {
- do_cmd_rune_carve();
- break;
- }
- }
-}
-
-
-void do_cmd_runecrafter()
-{
- int ext = 0;
-
- char ch;
-
-
- /* Select what to do */
- while (TRUE)
- {
- if (!get_com("Rune Spell:[C]reate, [D]elete, C[a]st, D[i]rectly Cast "
- "or Use [R]unestone", &ch))
- {
- ext = 0;
- break;
- }
- if ((ch == 'C') || (ch == 'c'))
- {
- ext = 1;
- break;
- }
- if ((ch == 'D') || (ch == 'd'))
- {
- ext = 2;
- break;
- }
- if ((ch == 'A') || (ch == 'a'))
- {
- ext = 3;
- break;
- }
- if ((ch == 'I') || (ch == 'i'))
- {
- ext = 4;
- break;
- }
- if ((ch == 'R') || (ch == 'r'))
- {
- ext = 5;
- break;
- }
- }
-
- switch (ext)
- {
- /* Create a Spell */
- case 1:
- {
- do_cmd_rune_add();
- break;
- }
-
- /* Delete a Spell */
- case 2:
- {
- do_cmd_rune_del();
- break;
- }
-
- /* Cast a Spell */
- case 3:
- {
- do_cmd_rune_cast();
- break;
- }
-
- /* Directly Cast a Spell */
- case 4:
- {
- do_cmd_rune();
- break;
- }
-
- /* Cast a Runestone */
- case 5:
- {
- do_cmd_runestone();
- break;
- }
- }
-}
-
-
void do_cmd_unbeliever_antimagic()
{
if (get_skill(SKILL_ANTIMAGIC) < 20)
@@ -3572,7 +2424,7 @@ void do_cmd_unbeliever()
/* Select what to do */
while (TRUE)
{
- if (!get_com("Disrupt [C]ontinuum or [D]etect Traps", &ch))
+ if (!get_com("Disrupt [C]ontinuum or [D]estroy Doors", &ch))
{
ext = 0;
break;
@@ -3598,20 +2450,18 @@ void do_cmd_unbeliever()
break;
}
- /* Detect Traps */
+ /* Destroy Doors */
case 2:
{
s16b skill = get_skill(SKILL_ANTIMAGIC);
if (skill < 25)
{
- msg_print("You cannot use your detection abilities yet.");
+ msg_print("You cannot use your door destruction abilities yet.");
break;
}
- detect_traps(DEFAULT_RADIUS);
-
- if (skill >= 35) destroy_doors_touch();
+ destroy_doors_touch();
break;
}
@@ -3638,6 +2488,8 @@ static object_filter_t const &item_tester_hook_totemable()
*/
void do_cmd_summoner_extract()
{
+ auto const &r_info = game->edit_data.r_info;
+
object_type forge, *q_ptr;
/* Not when confused */
@@ -3669,7 +2521,7 @@ void do_cmd_summoner_extract()
object_type *o_ptr = get_object(item);
bool_ partial;
- if (r_info[o_ptr->pval2].flags1 & RF1_UNIQUE)
+ if (r_info[o_ptr->pval2].flags & RF_UNIQUE)
{
partial = FALSE;
}
@@ -3701,7 +2553,7 @@ void do_cmd_summoner_extract()
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_MENTAL;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
msg_print("You extract a totem from the dead corpse.");
energy_use += 100;
@@ -3710,15 +2562,17 @@ void do_cmd_summoner_extract()
void summon_true(int r_idx, int item)
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, status, x = 1, y = 1, rx, ry = 0, chance;
bool_ used;
- monster_race *r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
/* Uniques are less likely to be nice */
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
/* Because it's unique, it will always be destroyed */
used = TRUE;
@@ -3877,7 +2731,7 @@ void do_cmd_summoner_summon()
}
-void do_cmd_summoner(void)
+void do_cmd_summoner()
{
int ext = 0;
@@ -3951,7 +2805,7 @@ void do_cmd_summoner(void)
/*
* Dodge Chance Feedback.
*/
-void use_ability_blade(void)
+void use_ability_blade()
{
int chance = p_ptr->dodge_chance - ((dun_level * 5) / 6);
@@ -4017,7 +2871,7 @@ void symbiotic_info(char *p, int power)
/*
* Cast a symbiotic spell
*/
-void do_cmd_symbiotic(void)
+void do_cmd_symbiotic()
{
int n = 0;
int chance;
@@ -4089,14 +2943,11 @@ void do_cmd_symbiotic(void)
/* Failed spell */
if (rand_int(100) < chance)
{
- if (flush_failure) flush();
+ flush_on_failure();
msg_format("You failed to concentrate hard enough!");
- sound(SOUND_FAIL);
}
else
{
- sound(SOUND_ZAP);
-
/* spell code */
switch (n)
{
@@ -4118,7 +2969,7 @@ void do_cmd_symbiotic(void)
m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if (!(r_ptr->flags1 & RF1_NEVER_MOVE))
+ if (!(r_ptr->flags & RF_NEVER_MOVE))
{
msg_print("You can only hypnotise monsters that cannot move.");
}
@@ -4126,7 +2977,7 @@ void do_cmd_symbiotic(void)
{
msg_print("You can only hypnotise pets and companions.");
}
- else if (r_ptr->flags9 & RF9_SPECIAL_GENE)
+ else if (r_ptr->flags & RF_SPECIAL_GENE)
{
msg_print("You cannot hypnotise this monster.");
}
@@ -4270,7 +3121,7 @@ void do_cmd_symbiotic(void)
break;
}
- if (0 > use_symbiotic_power(o_ptr->pval, FALSE, FALSE, TRUE))
+ if (0 > use_symbiotic_power(o_ptr->pval, false))
return;
break;
@@ -4291,7 +3142,7 @@ void do_cmd_symbiotic(void)
o_ptr->pval2 += hp;
if (o_ptr->pval2 > o_ptr->pval3) o_ptr->pval2 = o_ptr->pval3;
- msg_format("%s is healed.", symbiote_name(TRUE));
+ msg_format("%s is healed.", symbiote_name(true).c_str());
/* Display the monster hitpoints */
p_ptr->redraw |= (PR_FRAME);
@@ -4309,7 +3160,7 @@ void do_cmd_symbiotic(void)
break;
}
- if(0 > use_symbiotic_power(o_ptr->pval, TRUE, FALSE, TRUE))
+ if(0 > use_symbiotic_power(o_ptr->pval, true))
return;
break;
@@ -4327,17 +3178,14 @@ void do_cmd_symbiotic(void)
case 8:
{
int y, x;
- cave_type *c_ptr;
- monster_type *m_ptr;
-
if (!tgt_pt(&x, &y)) return;
- c_ptr = &cave[y][x];
+ cave_type *c_ptr = &cave[y][x];
if (!c_ptr->m_idx) break;
- m_ptr = &m_list[c_ptr->m_idx];
- use_symbiotic_power(m_ptr->r_idx, TRUE, FALSE, TRUE);
+ monster_type *m_ptr = &m_list[c_ptr->m_idx];
+ use_symbiotic_power(m_ptr->r_idx, true);
break;
}
@@ -4375,7 +3223,7 @@ void do_cmd_symbiotic(void)
msg_print("You faint from the effort!");
/* Hack -- Bypass free action */
- (void)set_paralyzed(randint(5 * oops + 1));
+ set_paralyzed(randint(5 * oops + 1));
/* Damage CON (possibly permanently) */
if (rand_int(100) < 50)
@@ -4386,7 +3234,7 @@ void do_cmd_symbiotic(void)
msg_print("You have damaged your body!");
/* Reduce constitution */
- (void)dec_stat(A_CHR, 15 + randint(10), perm);
+ dec_stat(A_CHR, 15 + randint(10), perm);
}
}
@@ -4419,7 +3267,7 @@ void do_cmd_create_boulder()
object_type forge;
object_type *q_ptr;
- (void)wall_to_mud(dir);
+ wall_to_mud(dir);
/* Get local object */
q_ptr = &forge;
@@ -4433,7 +3281,7 @@ void do_cmd_create_boulder()
q_ptr->discount = 90;
q_ptr->found = OBJ_FOUND_SELFMADE;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
msg_print("You make some boulders.");
@@ -4448,7 +3296,7 @@ void do_cmd_create_boulder()
/*
* Clamp failure chance
*/
-extern int clamp_failure_chance(int chance, int minfail)
+int clamp_failure_chance(int chance, int minfail)
{
if (minfail < 0) minfail = 0;
diff --git a/src/cmd7.hpp b/src/cmd7.hpp
index 162e5461..b9d518b2 100644
--- a/src/cmd7.hpp
+++ b/src/cmd7.hpp
@@ -1,28 +1,25 @@
#pragma once
#include "h-basic.h"
-#include "rune_spell_fwd.hpp"
#include "object_type_fwd.hpp"
-extern void do_cmd_pray(void);
-extern void do_cmd_create_boulder(void);
-extern int rune_exec(rune_spell *spell, int cost);
-extern void necro_info(char *p, int power);
-extern void mindcraft_info(char *p, int power);
-extern void symbiotic_info(char *p, int power);
-extern void mimic_info(char *p, int power);
-extern void do_cmd_summoner(void);
-extern void do_cmd_mindcraft(void);
-extern void do_cmd_mimic(void);
-extern void use_ability_blade(void);
-extern void do_cmd_beastmaster(void);
-extern void do_cmd_powermage(void);
-extern void do_cmd_possessor(void);
-extern void do_cmd_archer(void);
-extern void do_cmd_set_piercing(void);
-extern void do_cmd_necromancer(void);
-extern void do_cmd_unbeliever(void);
-extern void do_cmd_runecrafter(void);
-extern void do_cmd_symbiotic(void);
-extern s32b sroot(s32b n);
-extern int clamp_failure_chance(int chance, int minfail);
+void do_cmd_pray();
+void do_cmd_create_boulder();
+void necro_info(char *p, int power);
+void mindcraft_info(char *p, int power);
+void symbiotic_info(char *p, int power);
+void mimic_info(char *p, int power);
+void do_cmd_summoner();
+void do_cmd_mindcraft();
+void do_cmd_mimic();
+void use_ability_blade();
+void do_cmd_beastmaster();
+void do_cmd_powermage();
+void do_cmd_possessor();
+void do_cmd_archer();
+void do_cmd_set_piercing();
+void do_cmd_necromancer();
+void do_cmd_unbeliever();
+void do_cmd_symbiotic();
+s32b sroot(s32b n);
+int clamp_failure_chance(int chance, int minfail);
diff --git a/src/corrupt.cc b/src/corrupt.cc
index f182a9e2..bd3ae5f0 100644
--- a/src/corrupt.cc
+++ b/src/corrupt.cc
@@ -1,7 +1,10 @@
#include "corrupt.hpp"
+#include "game.hpp"
#include "init1.hpp"
+#include "object_flag.hpp"
#include "player_race.hpp"
+#include "player_race_flag.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
#include "stats.hpp"
@@ -12,6 +15,7 @@
#include "z-rand.hpp"
#include <cassert>
+#include <fmt/format.h>
/**
* Corruptions
@@ -38,45 +42,40 @@ struct corruption_type
static void subrace_add_power(player_race_mod *rmp_ptr, int power)
{
- int i;
-
- for (i=0; i<4; i++)
- {
- if (rmp_ptr->powers[i] == -1)
- {
- rmp_ptr->powers[i] = power;
- return;
- }
- }
+ rmp_ptr->ps.powers.push_back(power);
}
static void player_gain_vampire_teeth()
{
+ auto &race_mod_info = game->edit_data.race_mod_info;
+
player_race_mod *rmp_ptr = NULL;
switch_subrace(SUBRACE_SAVE, TRUE);
rmp_ptr = &race_mod_info[SUBRACE_SAVE];
subrace_add_power(rmp_ptr, PWR_VAMPIRISM);
- rmp_ptr->flags1 = rmp_ptr->flags1
- | PR1_VAMPIRE
- | PR1_UNDEAD
- | PR1_NO_SUBRACE_CHANGE;
+ rmp_ptr->flags = rmp_ptr->flags
+ | PR_VAMPIRE
+ | PR_UNDEAD
+ | PR_NO_SUBRACE_CHANGE;
}
static void player_gain_vampire_strength()
{
+ auto &race_mod_info = game->edit_data.race_mod_info;
+
player_race_mod *rmp_ptr = &race_mod_info[SUBRACE_SAVE];
- /* Apply the bonuses/penalities */
- rmp_ptr->r_mhp = rmp_ptr->r_mhp + 1;
- rmp_ptr->r_exp = rmp_ptr->r_exp + 100;
- rmp_ptr->r_adj[A_STR] = rmp_ptr->r_adj[A_STR] + 3;
- rmp_ptr->r_adj[A_INT] = rmp_ptr->r_adj[A_INT] + 2;
- rmp_ptr->r_adj[A_WIS] = rmp_ptr->r_adj[A_WIS] - 3;
- rmp_ptr->r_adj[A_DEX] = rmp_ptr->r_adj[A_DEX] - 2;
- rmp_ptr->r_adj[A_CON] = rmp_ptr->r_adj[A_CON] + 1;
- rmp_ptr->r_adj[A_CHR] = rmp_ptr->r_adj[A_CHR] - 4;
+ rmp_ptr->ps.mhp += +1;
+ rmp_ptr->ps.exp += +100;
+
+ rmp_ptr->ps.adj[A_STR] += +3;
+ rmp_ptr->ps.adj[A_INT] += +2;
+ rmp_ptr->ps.adj[A_WIS] += -3;
+ rmp_ptr->ps.adj[A_DEX] += -2;
+ rmp_ptr->ps.adj[A_CON] += +1;
+ rmp_ptr->ps.adj[A_CHR] += -4;
/* be reborn! */
do_rebirth();
@@ -85,33 +84,29 @@ static void player_gain_vampire_strength()
static void player_gain_vampire()
{
+ auto &race_mod_info = game->edit_data.race_mod_info;
+
player_race_mod *rmp_ptr = &race_mod_info[SUBRACE_SAVE];
- /* Be a Vampire and be proud of it */
- cptr title = rmp_ptr->title;
- if (streq(title, "Vampire"))
+ if (rmp_ptr->title == "Vampire")
{
- title = "Vampire";
rmp_ptr->place = FALSE;
- set_subrace_title(rmp_ptr, title);
}
else
{
- char buf[512];
- sprintf(buf, "Vampire %s", title);
- set_subrace_title(rmp_ptr, buf);
+ rmp_ptr->title = fmt::format("Vampire {}", rmp_ptr->title);
}
/* Bonus/and .. not bonus :) */
- rmp_ptr->flags1 = rmp_ptr->flags1 | PR1_HURT_LITE;
- rmp_ptr->oflags2[2] = rmp_ptr->oflags2[2]
- | TR2_RES_POIS
- | TR2_RES_NETHER
- | TR2_RES_COLD
- | TR2_RES_DARK
- | TR2_HOLD_LIFE;
- rmp_ptr->oflags3[2] = rmp_ptr->oflags3[2]
- | TR3_LITE1;
+ rmp_ptr->flags |= PR_HURT_LITE;
+ rmp_ptr->lflags[1].oflags |=
+ ( TR_RES_POIS
+ | TR_RES_NETHER
+ | TR_RES_COLD
+ | TR_RES_DARK
+ | TR_HOLD_LIFE
+ | TR_LITE1
+ );
}
/**
@@ -706,7 +701,7 @@ static bool_ player_can_gain_corruption(int corruption_idx)
if (corruption_idx == CORRUPT_TROLL_BLOOD)
{
/* Ok trolls should not get this one. never. */
- if (streq(rp_ptr->title, "Troll"))
+ if (rp_ptr->title == "Troll")
{
allowed = FALSE;
}
@@ -716,7 +711,7 @@ static bool_ player_can_gain_corruption(int corruption_idx)
if (game_module_idx == MODULE_THEME)
{
- if (streq(rp_ptr->title, "Maia"))
+ if (rp_ptr->title == "Maia")
{
/* We use a whitelist of corruptions for Maiar */
bool_ allow = FALSE;
@@ -764,7 +759,7 @@ static bool_ player_allow_corruption(int corruption_idx)
/* Vampire teeth is special */
if (corruption_idx == CORRUPT_VAMPIRE_TEETH)
{
- if (race_flags1_p(PR1_NO_SUBRACE_CHANGE))
+ if (race_flags_p(PR_NO_SUBRACE_CHANGE))
{
return TRUE;
}
@@ -944,20 +939,18 @@ void lose_corruption()
/*
* Dump the corruption list
*/
-void dump_corruptions(FILE *fff, bool_ color, bool_ header)
+std::string dump_corruptions(bool color, bool header)
{
- int i;
+ fmt::MemoryWriter w;
- assert(fff != NULL);
-
- for (i = 0; i < CORRUPTIONS_MAX; i++)
+ for (int i = 0; i < CORRUPTIONS_MAX; i++)
{
- corruption_type *c_ptr = &corruptions[i];
+ corruption_type const *c_ptr = &corruptions[i];
if (header)
{
- fprintf(fff, "\n Corruption list:\n");
- header = FALSE;
+ w.write("\nCorruption list:\n\n");
+ header = false;
}
if (p_ptr->corruptions[i])
@@ -966,16 +959,18 @@ void dump_corruptions(FILE *fff, bool_ color, bool_ header)
if (color)
{
- fprintf(fff, "#####%c%s:\n", conv_color[c], c_ptr->name);
+ w.write("#####{}{}:\n", static_cast<char>(conv_color[c]), c_ptr->name);
}
else
{
- fprintf(fff, "%s:\n", c_ptr->name);
+ w.write("{}:\n", c_ptr->name);
}
- fprintf(fff, "%s\n", c_ptr->desc);
+ w.write("{}\n\n", c_ptr->desc);
}
}
+
+ return w.str();
}
/*
diff --git a/src/corrupt.hpp b/src/corrupt.hpp
index c200762e..77a7496e 100644
--- a/src/corrupt.hpp
+++ b/src/corrupt.hpp
@@ -1,11 +1,13 @@
#include "h-basic.h"
-extern void gain_random_corruption();
-extern void dump_corruptions(FILE *OutFile, bool_ color, bool_ header);
-extern void lose_corruption();
-extern bool_ player_has_corruption(int corruption_idx);
-extern void player_gain_corruption(int corruption_idx);
-extern s16b get_corruption_power(int corruption_idx);
+#include <string>
+
+void gain_random_corruption();
+std::string dump_corruptions(bool color, bool header);
+void lose_corruption();
+bool_ player_has_corruption(int corruption_idx);
+void player_gain_corruption(int corruption_idx);
+s16b get_corruption_power(int corruption_idx);
/*
* Corruptions
diff --git a/src/defines.h b/src/defines.h
index fc1f61f5..4a2ad0e0 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -37,8 +37,8 @@
*/
#ifndef IS_CVS
-/* #define IS_CVS " (ah)" */
-#define IS_CVS " (ah, git)"
+#define IS_CVS " (ah)"
+/* #define IS_CVS " (ah, git)" */
#endif
#define USER_PATH_VERSION "/2.4"
@@ -114,26 +114,19 @@
*/
#define DEFAULT_RADIUS 25
-
-#define CHANCE_TRAP_JAMMED_DOOR 2500
-#define CHANCE_TRAP_SECRET_DOOR 1500
-#define CHANCE_TRAP_LOCKED_DOOR 1000
-#define CHANCE_TRAP_DOOR 500 /* in 10000 */
-#define CHANCE_TRAP_FLOOR 4 /* in 10000 chance of placing a trap */
-
#define MAX_SPELLS 100
#define MAX_RUNES 100
/*
- * Total number of stores (see "store.c", etc)
+ * Total number of monster powers
*/
-#define STORE_GENERAL 0
-#define STORE_HOME 7
+#define MONSTER_POWERS_MAX 96
/*
- * Maximum number of player "sex" types (see "table.c", etc)
+ * Total number of stores (see "store.c", etc)
*/
-#define MAX_SEXES 3
+#define STORE_GENERAL 0
+#define STORE_HOME 7
/* Number of Random Artifacts */
#define MAX_RANDARTS 84
@@ -383,63 +376,14 @@
#define MAX_STACK_SIZE 100
-/*
- * Player sex constants (hard-coded by save-files, arrays, etc)
- */
-#define SEX_FEMALE 0
-#define SEX_MALE 1
-#define SEX_NEUTER 2
-
-
-/* Race flags */
-#define PR1_EXPERIMENTAL 0x00000001L /* Is still under developemnt */
-/* XXX */
-#define PR1_RESIST_BLACK_BREATH 0x00000004L /* Resist black breath */
-#define PR1_NO_STUN 0x00000008L /* Never stunned */
-#define PR1_XTRA_MIGHT_BOW 0x00000010L /* Xtra might with bows */
-#define PR1_XTRA_MIGHT_XBOW 0x00000020L /* Xtra might with xbows */
-#define PR1_XTRA_MIGHT_SLING 0x00000040L /* Xtra might with slings */
-#define PR1_AC_LEVEL 0x00000080L /* More AC with levels */
-#define PR1_HURT_LITE 0x00000100L /* Hurt by light */
-#define PR1_VAMPIRE 0x00000200L /* Vampire */
-#define PR1_UNDEAD 0x00000400L /* Undead */
-#define PR1_NO_CUT 0x00000800L /* no cuts */
-#define PR1_CORRUPT 0x00001000L /* hack-- corrupted */
-#define PR1_NO_FOOD 0x00002000L /* little gain from food */
-#define PR1_NO_GOD 0x00004000L /* cannot worship */
-/* XXX */
-#define PR1_ELF 0x00010000L /* Is an elf */
-#define PR1_SEMI_WRAITH 0x00020000L /* Takes damage when going in walls */
-#define PR1_NO_SUBRACE_CHANGE 0x00040000L /* Impossible to change subrace */
-/* XXX */
-#define PR1_ANTIMAGIC 0x00100000L /* antimagic ... hack */
-#define PR1_MOLD_FRIEND 0x00200000L /* Not attacked by molds wielded */
-#define PR1_GOD_FRIEND 0x00400000L /* Better grace */
-/* XXX */
-#define PR1_INNATE_SPELLS 0x01000000L /* KNown all spells, only need books */
-/* XXX */
-/* XXX */
-#define PR1_EASE_STEAL 0x08000000L /* Gain xp by stealing */
-/* XXX */
-/* XXX */
-/* XXX */
-/* XXX */
-
-/* XXX */
-#define PR2_ASTRAL 0x00000002L /* Is it an astral being coming from th halls of mandos ? */
-/* XXX */
-
-/* XXX */
#define MKEY_MINDCRAFT 2
#define MKEY_ANTIMAGIC 3
#define MKEY_MIMIC 6
#define MKEY_NECRO 7
#define MKEY_POWER_MAGE 8
-#define MKEY_RUNE 9
#define MKEY_FORGING 10
#define MKEY_INCARNATION 11
#define MKEY_SUMMON 13
-#define MKEY_TRAP 14
#define MKEY_STEAL 15
#define MKEY_DODGE 16
#define MKEY_SCHOOL 17
@@ -535,9 +479,6 @@
/* Feature 0x10 -- web */
-/* Traps */
-#define FEAT_TRAP 0x11
-
/* Features 0x12 - 0x1F -- unused */
/* Doors */
@@ -621,7 +562,6 @@
#define FEAT_MARKER 0xAC /* 172 */
/* Feature 0xAD -- Underground Tunnel */
#define FEAT_TAINTED_WATER 0xAE /* 174 */
-#define FEAT_MON_TRAP 0xAF /* 175 */
#define FEAT_BETWEEN2 0xB0 /* 176 */
#define FEAT_LAVA_WALL 0xB1 /* 177 */
#define FEAT_GREAT_FIRE 0xB2 /* 178 */
@@ -686,208 +626,13 @@
/*** Artifact indexes (see "lib/edit/a_info.txt") ***/
-
-/* Lites */
-#define ART_GALADRIEL 1
-#define ART_ELENDIL 2
-#define ART_THRAIN 3
-#define ART_PALANTIR 202
-#define ART_UNDEATH 200
-#define ART_STONE_LORE 15
-#define ART_PALANTIR_ITHIL 208
-
-/* Amulets */
-#define ART_CARLAMMAS 4
-#define ART_INGWE 5
-#define ART_DWARVES 6
#define ART_ANCHOR 14
-#define ART_ELESSAR 206
-#define ART_EVENSTAR 207
-
-/* Rings */
-#define ART_FLAR 7
-#define ART_BARAHIR 8
-#define ART_TULKAS 9
-#define ART_NARYA 10
-#define ART_NENYA 11
-#define ART_VILYA 12
#define ART_POWER 13
-/* 14 used by the anchor of space-time */
-/* 15 used by the stone of lore */
-
-/* Dragon Scale */
-#define ART_RAZORBACK 16
-#define ART_BLADETURNER 17
-#define ART_MEDIATOR 166
-
-/* Hard Armour */
-#define ART_HIMRING 167
-#define ART_SOULKEEPER 19
-#define ART_ISILDUR 20
-#define ART_ROHIRRIM 21
-#define ART_BELEGENNON 22
-#define ART_CELEBORN 23
-#define ART_ARVEDUI 24
-#define ART_CASPANION 25
-
-/* Thunderlord flying suit */
-#define ART_MARDA 26
-#define ART_TRON 27
-
-/* Soft Armour */
-#define ART_THALKETTOTH 28
-
-/* Shields */
-#define ART_THORIN 30
-#define ART_CELEGORM 31
-#define ART_ANARION 32
-#define ART_GILGALAD 169
-#define ART_HARADRIM 176
-
-/* Helms and Crowns */
#define ART_MORGOTH 34
-#define ART_BERUTHIEL 35
-#define ART_THRANDUIL 36
-#define ART_THENGEL 37
-#define ART_HAMMERHAND 38
-#define ART_DOR 39
-#define ART_HOLHENNETH 40
-#define ART_GORLIM 41
-#define ART_GONDOR 42
-#define ART_KNOWLEDGE 160
-#define ART_NUMENOR 43
-#define ART_CELEBRIMBOR 170
-
-/* Cloaks */
-#define ART_COLLUIN 44
-#define ART_HOLCOLLETH 45
-#define ART_THINGOL 46
-#define ART_THORONGIL 47
-#define ART_COLANNON 48
-#define ART_LUTHIEN 49
-#define ART_TUOR 50
-
-/* Gloves */
-#define ART_CAMBELEG 52
-#define ART_CAMMITHRIM 53
-#define ART_PAURHACH 54
-#define ART_PAURNIMMEN 55
-#define ART_PAURAEGEN 56
-#define ART_PAURNEN 57
-#define ART_CAMLOST 58
-#define ART_FINGOLFIN 59
-#define ART_EOL 178
-
-/* Boots */
-#define ART_FEANOR 60
-#define ART_DAL 61
-#define ART_THROR 62
-
-/* Swords */
#define ART_NARSIL 164
-#define ART_MAEDHROS 64
-#define ART_ANGRIST 65
-#define ART_NARTHANC 66
-#define ART_NIMTHANC 67
-#define ART_DETHANC 68
-#define ART_RILIA 69
-#define ART_BELANGIL 70
-#define ART_CALRIS 71
-#define ART_ARUNRUTH 72
#define ART_GLAMDRING 73
-#define ART_AEGLIN 74
-#define ART_ORCRIST 75
-#define ART_GURTHANG 76
-#define ART_ZARCUTHRA 77
-#define ART_MORMEGIL 78
-#define ART_GONDRICAM 79
-#define ART_CRISDURIAN 80
-#define ART_AGLARANG 81
-#define ART_RINGIL 82
#define ART_ANDURIL 83
-#define ART_ANGUIREL 84
-#define ART_ELVAGIL 85
-#define ART_FORASGIL 86
-#define ART_CARETH 87
-#define ART_STING 88
-#define ART_HARADEKKET 89
-#define ART_GILETTAR 90
-#define ART_DOOMCALLER 91
-#define ART_VORPAL_BLADE 92
-#define ART_ERU 147
-
-/* Polearms */
-#define ART_THEODEN 93
-#define ART_PAIN 94
-#define ART_OSONDIR 95
-#define ART_TIL 96
-#define ART_AEGLOS 97
-#define ART_OROME 98
-#define ART_NIMLOTH 99
-#define ART_EORLINGAS 100
-#define ART_DURIN 101
-#define ART_EONWE 102
-#define ART_BALLI 103
-#define ART_LOTHARANG 104
-#define ART_MUNDWINE 105
-#define ART_BARUKKHELED 106
-#define ART_WRATH 107
-#define ART_ULMO 108
-#define ART_AVAVIR 109
-#define ART_FUNDIN 175
-
-/* The sword of the Dawn */
-#define ART_DAWN 110
-
-/* Hafted */
-#define ART_MELKOR 18
-#define ART_HURIN 33
#define ART_GROND 111
-#define ART_TOTILA 112
-#define ART_THUNDERFIST 113
-#define ART_BLOODSPIKE 114
-#define ART_FIRESTAR 115
-#define ART_TARATOL 116
-#define ART_AULE 117
-#define ART_NAR 118
-#define ART_ERIRIL 119
-#define ART_OLORIN 120
-#define ART_DEATHWREAKER 121
-#define ART_TURMIL 122
-#define ART_GOTHMOG 123
-#define ART_AXE_GOTHMOG 145
-#define ART_SKULLCLEAVER 177
-
-#define ART_NAIN 174
-
-/* Bows */
-#define ART_BELTHRONDING 124
-#define ART_BARD 125
-#define ART_CUBRAGOL 126
-#define ART_UMBAR 171
-
-/* Mage Staffs */
-#define ART_GANDALF 127
-
-/* Boomerangs */
-#define ART_BEOR 128
-#define ART_GLIMDRIR 129
-
-/* Musical Instrument */
-#define ART_MAGLOR 137
-#define ART_SKY 138
-#define ART_DAERON 139
-#define ART_DRUEDAIN 141
-#define ART_ROHAN 142
-#define ART_HELM 143
-#define ART_BOROMIR 144
-
-/* Diggers */
-#define ART_EREBOR 140
-
-#define ART_ORCHAST 156
-#define ART_NIGHT 157
-#define ART_NATUREBANE 158
/* Spell for various object */
#define SPELL_ID_PLAIN 1
@@ -908,7 +653,6 @@
#define EGO_MANA 1
#define EGO_POWER 2
#define EGO_MANA_POWER 3
-#define EGO_MSTAFF_SPELL 4
#define EGO_BRAND_POIS 77
#define EGO_BRAND_ELEC 74
#define EGO_BRAND_FIRE 75
@@ -991,7 +735,6 @@
#define ACT_FUNDIN 30
#define ACT_EOL 31
#define ACT_UMBAR 32
-#define ACT_NUMENOR 33
#define ACT_KNOWLEDGE 34
#define ACT_UNDEATH 35
#define ACT_THRAIN 36
@@ -1037,10 +780,6 @@
#define ACT_GANDALF 76
#define ACT_MARDA 77
#define ACT_PALANTIR 78
-/*
- 79
- 80
-*/
#define ACT_CURE_LW 81
#define ACT_CURE_MW 82
#define ACT_CURE_POISON 83
@@ -1048,9 +787,6 @@
#define ACT_REST_ALL 85
#define ACT_CURE_700 86
#define ACT_CURE_1000 87
-/*
- 88
-*/
#define ACT_EREBOR 89
#define ACT_DRUEDAIN 90
#define ACT_ESP 91
@@ -1221,7 +957,6 @@
#define TV_LITE 39 /* Lites (including Specials) */
#define TV_AMULET 40 /* Amulets (including Specials) */
#define TV_RING 45 /* Rings (including Specials) */
-#define TV_TRAPKIT 46 /* Trapkits */
#define TV_TOTEM 54 /* Summoner totems */
#define TV_STAFF 55
#define TV_WAND 65
@@ -1235,8 +970,6 @@
#define TV_HYPNOS 99 /* To wield monsters !:) */
#define TV_GOLD 100 /* Gold can only be picked up by players */
#define TV_RANDART 102 /* Random Artifacts */
-#define TV_RUNE1 104 /* Base runes */
-#define TV_RUNE2 105 /* Modifier runes */
#define TV_BOOK 111
#define TV_SYMBIOTIC_BOOK 112
@@ -1265,14 +998,6 @@
#define SV_HARP 59
#define SV_HORN 60
-/* The "sval" codes for TV_TRAPKIT */
-#define SV_TRAPKIT_SLING 1
-#define SV_TRAPKIT_BOW 2
-#define SV_TRAPKIT_XBOW 3
-#define SV_TRAPKIT_POTION 4
-#define SV_TRAPKIT_SCROLL 5
-#define SV_TRAPKIT_DEVICE 6
-
/* The "sval" codes for TV_BOOMERANG */
#define SV_BOOM_S_WOOD 1 /* 1d4 */
#define SV_BOOM_WOOD 2 /* 1d8 */
@@ -1475,10 +1200,8 @@
/* The "sval" codes for TV_AMULET */
#define SV_AMULET_DOOM 0
#define SV_AMULET_TELEPORT 1
-#define SV_AMULET_ADORNMENT 2
#define SV_AMULET_SLOW_DIGEST 3
#define SV_AMULET_RESIST_ACID 4
-#define SV_AMULET_SEARCHING 5
#define SV_AMULET_BRILLANCE 6
#define SV_AMULET_CHARISMA 7
#define SV_AMULET_THE_MAGI 8
@@ -1529,7 +1252,6 @@
#define SV_RING_RESIST_POIS 20
#define SV_RING_FREE_ACTION 21
#define SV_RING_SEE_INVIS 22
-#define SV_RING_SEARCHING 23
#define SV_RING_STR 24
#define SV_RING_INT 25
#define SV_RING_DEX 26
@@ -1631,14 +1353,11 @@
#define SV_ROD_ILLUMINATION 4
#define SV_ROD_MAPPING 5
#define SV_ROD_DETECTION 6
-#define SV_ROD_PROBING 7
#define SV_ROD_CURING 8
#define SV_ROD_HEALING 9
#define SV_ROD_RESTORATION 10
#define SV_ROD_SPEED 11
-/* xxx (aimed) */
#define SV_ROD_TELEPORT_AWAY 13
-#define SV_ROD_DISARMING 14
#define SV_ROD_LITE 15
#define SV_ROD_SLEEP_MONSTER 16
#define SV_ROD_SLOW_MONSTER 17
@@ -1653,7 +1372,6 @@
#define SV_ROD_FIRE_BALL 26
#define SV_ROD_COLD_BALL 27
#define SV_ROD_HAVOC 28
-#define SV_ROD_DETECT_TRAP 29
#define SV_ROD_HOME 30
@@ -1679,7 +1397,6 @@
#define SV_SCROLL_SUMMON_MONSTER 4
#define SV_SCROLL_SUMMON_UNDEAD 5
#define SV_SCROLL_SUMMON_MINE 6
-#define SV_SCROLL_TRAP_CREATION 7
#define SV_SCROLL_PHASE_DOOR 8
#define SV_SCROLL_TELEPORT 9
#define SV_SCROLL_TELEPORT_LEVEL 10
@@ -1700,7 +1417,6 @@
#define SV_SCROLL_MAPPING 25
#define SV_SCROLL_DETECT_GOLD 26
#define SV_SCROLL_DETECT_ITEM 27
-#define SV_SCROLL_DETECT_TRAP 28
#define SV_SCROLL_DETECT_DOOR 29
#define SV_SCROLL_DETECT_INVIS 30
#define SV_SCROLL_DIVINATION 31
@@ -1711,7 +1427,6 @@
#define SV_SCROLL_MONSTER_CONFUSION 36
#define SV_SCROLL_PROTECTION_FROM_EVIL 37
#define SV_SCROLL_RUNE_OF_PROTECTION 38
-#define SV_SCROLL_TRAP_DOOR_DESTRUCTION 39
#define SV_SCROLL_DEINCARNATION 40
#define SV_SCROLL_STAR_DESTRUCTION 41
#define SV_SCROLL_DISPEL_UNDEAD 42
@@ -1743,7 +1458,6 @@
#define SV_POTION_SLEEP 11
#define SV_POTION_LEARNING 12
#define SV_POTION_LOSE_MEMORIES 13
-/* xxx */
#define SV_POTION_RUINATION 15
#define SV_POTION_DEC_STR 16
#define SV_POTION_DEC_INT 17
@@ -1783,11 +1497,9 @@
#define SV_POTION_INC_DEX 51
#define SV_POTION_INC_CON 52
#define SV_POTION_INC_CHR 53
-/* xxx */
#define SV_POTION_AUGMENTATION 55
#define SV_POTION_ENLIGHTENMENT 56
#define SV_POTION_STAR_ENLIGHTENMENT 57
-#define SV_POTION_SELF_KNOWLEDGE 58
#define SV_POTION_EXPERIENCE 59
#define SV_POTION_RESISTANCE 60
#define SV_POTION_CURING 61
@@ -1871,13 +1583,6 @@
*/
#define SV_BOOK_MAX_GOOD 49
-/* flags for operation in get_random_trap in object3.c */
-
-#define TRAP_EXISTS 0x00000001L
-#define TRAP_FOUND 0x00000002L
-#define TRAP_NOTFOUND 0x00000004L
-#define TRAP_IDENTIFIED 0x00000008L
-
/*** General flag values ***/
@@ -1892,11 +1597,9 @@
#define CAVE_VIEW 0x0020 /* view flag */
#define CAVE_TEMP 0x0040 /* temp flag */
#define CAVE_WALL 0x0080 /* wall flag */
-#define CAVE_TRDT 0x0100 /* trap detected */
#define CAVE_IDNT 0x0200 /* grid identified (fountains) */
#define CAVE_SPEC 0x0400 /* special mark(quests) */
#define CAVE_FREE 0x0800 /* no random generation on it */
-#define CAVE_DETECT 0x1000 /* Traps detected here */
#define CAVE_PLIT 0x2000 /* Player lit grid */
#define CAVE_MLIT 0x4000 /* Monster lit grid */
@@ -1979,7 +1682,6 @@
#define SM_OPP_POIS 0x00100000
#define SM_OPP_XXX1 0x00200000
#define SM_CLONED 0x00400000
-#define SM_NOTE_TRAP 0x00800000
#define SM_IMM_ACID 0x01000000
#define SM_IMM_ELEC 0x02000000
#define SM_IMM_FIRE 0x04000000
@@ -2026,17 +1728,12 @@
#define PU_MANA 0x00000020L /* Calculate csp and msp */
#define PU_SPELLS 0x00000040L /* Calculate spells */
#define PU_POWERS 0x00000080L /* Calculate powers */
-/* xxx (many) */
#define PU_UN_VIEW 0x00010000L /* Forget view */
-/* xxx (many) */
#define PU_VIEW 0x00100000L /* Update view */
#define PU_MON_LITE 0x00200000L /* Update monster light */
-/* xxx */
#define PU_MONSTERS 0x01000000L /* Update monsters */
#define PU_DISTANCE 0x02000000L /* Update distances */
-/* xxx */
#define PU_FLOW 0x10000000L /* Update flow */
-/* xxx (many) */
/*
@@ -2051,225 +1748,19 @@
*/
#define PW_INVEN 0x00000001L /* Display inven/equip */
#define PW_EQUIP 0x00000002L /* Display equip/inven */
-/* xxx */
#define PW_PLAYER 0x00000008L /* Display character */
#define PW_M_LIST 0x00000010L /* Show monster list */
-/* xxx */
#define PW_MESSAGE 0x00000040L /* Display messages */
#define PW_OVERHEAD 0x00000080L /* Display overhead view */
#define PW_MONSTER 0x00000100L /* Display monster recall */
#define PW_OBJECT 0x00000200L /* Display object recall */
-/* xxx */
-#define PW_SNAPSHOT 0x00000800L /* Display snap-shot */
-/* xxx */
-/* xxx */
-#define PW_BORG_1 0x00004000L /* Display borg messages */
-#define PW_BORG_2 0x00008000L /* Display borg status */
/* jk */
-#define FTRAP_CHEST 0x000000001 /* may appear on chests */
-#define FTRAP_DOOR 0x000000002 /* may appear on doors/floors */
-#define FTRAP_FLOOR 0x000000004 /* may appear on floor */
-#define FTRAP_CHANGE 0x000000008 /* Color changing */
-#define FTRAP_XXX5 0x000000010
-#define FTRAP_XXX6 0x000000020
-#define FTRAP_XXX7 0x000000040
-#define FTRAP_XXX8 0x000000080
-#define FTRAP_XXX9 0x000000100
-#define FTRAP_XXX10 0x000000200
-#define FTRAP_XXX11 0x000000400
-#define FTRAP_XXX12 0x000000800
-#define FTRAP_XXX13 0x000001000
-#define FTRAP_XXX14 0x000002000
-#define FTRAP_XXX15 0x000004000
-#define FTRAP_XXX16 0x000008000
-#define FTRAP_LEVEL1 0x000010000 /* low level ball/bolt trap */
-#define FTRAP_LEVEL2 0x000020000 /* medium level ball/bolt trap */
-#define FTRAP_LEVEL3 0x000040000 /* high level ball/bolt trap */
-#define FTRAP_LEVEL4 0x000080000 /* oops level ball/bolt trap */
-#define FTRAP_XXX21 0x000100000
-#define FTRAP_XXX22 0x000200000
-#define FTRAP_XXX23 0x000400000
-#define FTRAP_XXX24 0x000800000
-#define FTRAP_XXX25 0x001000000
-#define FTRAP_XXX26 0x002000000
-#define FTRAP_XXX27 0x004000000
-#define FTRAP_XXX28 0x008000000
-#define FTRAP_XXX29 0x010000000
-#define FTRAP_XXX30 0x020000000
-#define FTRAP_XXX31 0x040000000
-#define FTRAP_XXX32 0x080000000
-
-/* jk */
#define STAT_DEC_TEMPORARY 1
#define STAT_DEC_NORMAL 2
#define STAT_DEC_PERMANENT 3
-/* jk - which trap is which number */
-#define TRAP_OF_WEAKNESS_I 1
-#define TRAP_OF_WEAKNESS_II 2
-#define TRAP_OF_WEAKNESS_III 3
-#define TRAP_OF_INTELLIGENCE_I 4
-#define TRAP_OF_INTELLIGENCE_II 5
-#define TRAP_OF_INTELLIGENCE_III 6
-#define TRAP_OF_WISDOM_I 7
-#define TRAP_OF_WISDOM_II 8
-#define TRAP_OF_WISDOM_III 9
-#define TRAP_OF_FUMBLING_I 10
-#define TRAP_OF_FUMBLING_II 11
-#define TRAP_OF_FUMBLING_III 12
-#define TRAP_OF_WASTING_I 13
-#define TRAP_OF_WASTING_II 14
-#define TRAP_OF_WASTING_III 15
-#define TRAP_OF_BEAUTY_I 16
-#define TRAP_OF_BEAUTY_II 17
-#define TRAP_OF_BEAUTY_III 18
-
-#define TRAP_OF_CURSE_WEAPON 20
-#define TRAP_OF_CURSE_ARMOR 21
-#define TRAP_OF_EARTHQUAKE 22
-#define TRAP_OF_POISON_NEEDLE 23
-#define TRAP_OF_SUMMON_MONSTER 24
-#define TRAP_OF_SUMMON_UNDEAD 25
-#define TRAP_OF_SUMMON_GREATER_UNDEAD 26
-#define TRAP_OF_TELEPORT 27
-#define TRAP_OF_PARALYZING 28
-#define TRAP_OF_EXPLOSIVE_DEVICE 29
-#define TRAP_OF_TELEPORT_AWAY 30
-#define TRAP_OF_LOSE_MEMORY 31
-#define TRAP_OF_BITTER_REGRET 32
-#define TRAP_OF_BOWEL_CRAMPS 33
-#define TRAP_OF_BLINDNESS_CONFUSION 34
-#define TRAP_OF_AGGRAVATION 35
-#define TRAP_OF_MULTIPLICATION 36
-#define TRAP_OF_STEAL_ITEM 37
-#define TRAP_OF_SUMMON_FAST_QUYLTHULGS 38
-#define TRAP_OF_SINKING 39
-#define TRAP_OF_MANA_DRAIN 40
-#define TRAP_OF_MISSING_MONEY 41
-#define TRAP_OF_NO_RETURN 42
-#define TRAP_OF_SILENT_SWITCHING 43
-#define TRAP_OF_WALLS 44
-#define TRAP_OF_CALLING_OUT 45
-#define TRAP_OF_SLIDING 46
-#define TRAP_OF_CHARGES_DRAIN 47
-#define TRAP_OF_STAIR_MOVEMENT 48
-#define TRAP_OF_NEW 49
-#define TRAP_OF_SCATTER_ITEMS 50
-#define TRAP_OF_DECAY 51
-#define TRAP_OF_WASTING_WANDS 52
-#define TRAP_OF_FILLING 53
-#define TRAP_OF_DRAIN_SPEED 54
-
-#define TRAP_OF_ELEC_BOLT 60
-#define TRAP_OF_POIS_BOLT 61
-#define TRAP_OF_ACID_BOLT 62
-#define TRAP_OF_COLD_BOLT 63
-#define TRAP_OF_FIRE_BOLT 64
-#define TRAP_OF_PLASMA_BOLT 65
-#define TRAP_OF_WATER_BOLT 66
-#define TRAP_OF_LITE_BOLT 67
-#define TRAP_OF_DARK_BOLT 68
-#define TRAP_OF_SHARDS_BOLT 69
-#define TRAP_OF_SOUND_BOLT 70
-#define TRAP_OF_CONFUSION_BOLT 71
-#define TRAP_OF_FORCE_BOLT 72
-#define TRAP_OF_INERTIA_BOLT 73
-#define TRAP_OF_MANA_BOLT 74
-#define TRAP_OF_ICE_BOLT 75
-#define TRAP_OF_CHAOS_BOLT 76
-#define TRAP_OF_NETHER_BOLT 77
-#define TRAP_OF_DISENCHANT_BOLT 78
-#define TRAP_OF_NEXUS_BOLT 79
-#define TRAP_OF_TIME_BOLT 80
-#define TRAP_OF_GRAVITY_BOLT 81
-
-#define TRAP_OF_ELEC_BALL 82
-#define TRAP_OF_POIS_BALL 83
-#define TRAP_OF_ACID_BALL 84
-#define TRAP_OF_COLD_BALL 85
-#define TRAP_OF_FIRE_BALL 86
-#define TRAP_OF_PLASMA_BALL 87
-#define TRAP_OF_WATER_BALL 88
-#define TRAP_OF_LITE_BALL 89
-#define TRAP_OF_DARK_BALL 90
-#define TRAP_OF_SHARDS_BALL 91
-#define TRAP_OF_SOUND_BALL 92
-#define TRAP_OF_CONFUSION_BALL 93
-#define TRAP_OF_FORCE_BALL 94
-#define TRAP_OF_INERTIA_BALL 95
-#define TRAP_OF_MANA_BALL 96
-#define TRAP_OF_ICE_BALL 97
-#define TRAP_OF_CHAOS_BALL 98
-#define TRAP_OF_NETHER_BALL 99
-#define TRAP_OF_DISENCHANT_BALL 100
-#define TRAP_OF_NEXUS_BALL 101
-#define TRAP_OF_TIME_BALL 102
-#define TRAP_OF_GRAVITY_BALL 103
-
-#define TRAP_OF_ARROW_I 110
-#define TRAP_OF_ARROW_II 111
-#define TRAP_OF_ARROW_III 112
-#define TRAP_OF_ARROW_IV 113
-#define TRAP_OF_POISON_ARROW_I 114
-#define TRAP_OF_POISON_ARROW_II 115
-#define TRAP_OF_POISON_ARROW_III 116
-#define TRAP_OF_POISON_ARROW_IV 117
-#define TRAP_OF_DAGGER_I 118
-#define TRAP_OF_DAGGER_II 119
-#define TRAP_OF_POISON_DAGGER_I 120
-#define TRAP_OF_POISON_DAGGER_II 121
-#define TRAP_OF_ARROWS_I 122
-#define TRAP_OF_ARROWS_II 123
-#define TRAP_OF_ARROWS_III 124
-#define TRAP_OF_ARROWS_IV 125
-#define TRAP_OF_POISON_ARROWS_I 126
-#define TRAP_OF_POISON_ARROWS_II 127
-#define TRAP_OF_POISON_ARROWS_III 128
-#define TRAP_OF_POISON_ARROWS_IV 129
-#define TRAP_OF_DAGGERS_I 130
-#define TRAP_OF_DAGGERS_II 131
-#define TRAP_OF_POISON_DAGGERS_I 132
-#define TRAP_OF_POISON_DAGGERS_II 133
-
-#define TRAP_OF_DROP_ITEMS 140
-#define TRAP_OF_DROP_ALL_ITEMS 141
-#define TRAP_OF_DROP_EVERYTHING 142
-
-/* -SC- */
-#define TRAP_OF_FEMINITY 150
-#define TRAP_OF_MASCULINITY 151
-#define TRAP_OF_NEUTRALITY 152
-#define TRAP_OF_AGING 153
-#define TRAP_OF_GROWING 154
-#define TRAP_OF_SHRINKING 155
-#define TRAP_OF_ELDRITCH_HORROR 156
-/* XXX */
-#define TRAP_OF_DIVINE_ANGER 158
-#define TRAP_OF_DIVINE_WRATH 159
-#define TRAP_OF_HALLUCINATION 160
-
-#define TRAP_OF_ROCKET 161
-#define TRAP_OF_NUKE_BOLT 162
-#define TRAP_OF_DEATH_RAY 163
-#define TRAP_OF_HOLY_FIRE 164
-#define TRAP_OF_HELL_FIRE 165
-#define TRAP_OF_PSI_BOLT 166
-#define TRAP_OF_PSI_DRAIN 167
-#define TRAP_OF_NUKE_BALL 168
-#define TRAP_OF_PSI_BALL 169
-
-/* DG */
-#define TRAP_OF_ACQUIREMENT 170
-
-/* Runescrye */
-#define TRAP_G_ELEC_BOLT 171
-#define TRAP_G_POIS_BOLT 172
-#define TRAP_G_ACID_BOLT 173
-#define TRAP_G_COLD_BOLT 174
-#define TRAP_G_FIRE_BOLT 175
-
/*** General index values ***/
@@ -2350,10 +1841,8 @@
#define GF_GRAVITY 35
#define GF_KILL_WALL 40
#define GF_KILL_DOOR 41
-#define GF_KILL_TRAP 42
#define GF_MAKE_WALL 45
#define GF_MAKE_DOOR 46
-#define GF_MAKE_TRAP 47
#define GF_OLD_CLONE 51
#define GF_OLD_POLY 52
#define GF_OLD_HEAL 53
@@ -2392,7 +1881,6 @@
#define GF_JAM_DOOR 88
#define GF_DOMINATION 89
#define GF_DISP_GOOD 90
-#define GF_IDENTIFY 91
#define GF_RAISE 92
#define GF_STAR_IDENTIFY 93
#define GF_DESTRUCTION 94
@@ -2419,6 +1907,7 @@
/*
* Some things which induce learning
*/
+#define DRS_NONE 0
#define DRS_ACID 1
#define DRS_ELEC 2
#define DRS_FIRE 3
@@ -2460,9 +1949,6 @@
/* High resist */
#define EGO_XTRA_POWER 2
-/* Special ability */
-#define EGO_XTRA_ABILITY 3
-
/*** Object flag values ***/
@@ -2496,333 +1982,8 @@
MFLAG_PARTIAL | MFLAG_CONTROL | MFLAG_NO_DROP \
)
-
-/*
- * As of 2.7.8, the "object flags" are valid for all objects, and as
- * of 2.7.9, these flags are not actually stored with the object.
- *
- * Note that "flags1" contains all flags dependant on "pval" (including
- * stat bonuses, but NOT stat sustainers), plus all "extra attack damage"
- * flags (SLAY_XXX and BRAND_XXX).
- *
- * Note that "flags2" contains all "resistances" (including "Stat Sustainers",
- * actual immunities, and resistances). Note that "Hold Life" is really an
- * "immunity" to ExpLoss, and "Free Action" is "immunity to paralysis".
- *
- * Note that "flags3" contains everything else -- including the three "CURSED"
- * flags, and the "BLESSED" flag, several "item display" parameters, some new
- * flags for powerful Bows, and flags which affect the player in a "general"
- * way (LITE, TELEPATHY, SEE_INVIS, SLOW_DIGEST, REGEN, FEATHER), including
- * all the "general" curses (TELEPORT, AGGRAVATE, EXP_DRAIN). It also has
- * four new flags called "ITEM_IGNORE_XXX" which lets an item specify that
- * it can not be affected by various forms of destruction. This is NOT as
- * powerful as actually granting resistance/immunity to the wearer.
- */
-
-#define TR1_STR 0x00000001L /* STR += "pval" */
-#define TR1_INT 0x00000002L /* INT += "pval" */
-#define TR1_WIS 0x00000004L /* WIS += "pval" */
-#define TR1_DEX 0x00000008L /* DEX += "pval" */
-#define TR1_CON 0x00000010L /* CON += "pval" */
-#define TR1_CHR 0x00000020L /* CHR += "pval" */
-#define TR1_MANA 0x00000040L /* Mana multipler */
-#define TR1_SPELL 0x00000080L /* Spell power increase */
-#define TR1_STEALTH 0x00000100L /* Stealth += "pval" */
-#define TR1_SEARCH 0x00000200L /* Search += "pval" */
-#define TR1_INFRA 0x00000400L /* Infra += "pval" */
-#define TR1_TUNNEL 0x00000800L /* Tunnel += "pval" */
-#define TR1_SPEED 0x00001000L /* Speed += "pval" */
-#define TR1_BLOWS 0x00002000L /* Blows += "pval" */
-#define TR1_CHAOTIC 0x00004000L
-#define TR1_VAMPIRIC 0x00008000L
-#define TR1_SLAY_ANIMAL 0x00010000L
-#define TR1_SLAY_EVIL 0x00020000L
-#define TR1_SLAY_UNDEAD 0x00040000L
-#define TR1_SLAY_DEMON 0x00080000L
-#define TR1_SLAY_ORC 0x00100000L
-#define TR1_SLAY_TROLL 0x00200000L
-#define TR1_SLAY_GIANT 0x00400000L
-#define TR1_SLAY_DRAGON 0x00800000L
-#define TR1_KILL_DRAGON 0x01000000L /* Execute Dragon */
-#define TR1_VORPAL 0x02000000L /* Later */
-#define TR1_IMPACT 0x04000000L /* Cause Earthquakes */
-#define TR1_BRAND_POIS 0x08000000L
-#define TR1_BRAND_ACID 0x10000000L
-#define TR1_BRAND_ELEC 0x20000000L
-#define TR1_BRAND_FIRE 0x40000000L
-#define TR1_BRAND_COLD 0x80000000L
-#define TR1_NULL_MASK 0x00000000L
-
-#define TRAP2_AUTOMATIC_5 0x00000001L /* Trap automatically rearms itself, 1 in 5 failure */
-#define TRAP2_AUTOMATIC_99 0x00000002L /* Trap automatically rearms itself */
-#define TRAP2_KILL_GHOST 0x00000004L /* Trap also affects PASS_WALL creatures */
-#define TRAP2_TELEPORT_TO 0x00000008L /* After everything else, teleport to player */
-#define TRAP2_ONLY_DRAGON 0x00000010L /* Affect only dragons & other AFFECTed creatures */
-#define TRAP2_ONLY_DEMON 0x00000020L /* Affect only demons & other AFFECTed creatures */
-#define TRAP2_ONLY_ANIMAL 0x00000100L /* Affect only animals & other AFFECTed creatures */
-#define TRAP2_ONLY_UNDEAD 0x00000200L /* Affect only undead & others */
-#define TRAP2_ONLY_EVIL 0x00000400L /* Affect only evil creatures &c. */
-
-#define TRAP2_ONLY_MASK (TRAP2_ONLY_DRAGON | TRAP2_ONLY_DEMON | TRAP2_ONLY_ANIMAL | \
- TRAP2_ONLY_UNDEAD | TRAP2_ONLY_EVIL )
-
-#define TR2_SUST_STR 0x00000001L
-#define TR2_SUST_INT 0x00000002L
-#define TR2_SUST_WIS 0x00000004L
-#define TR2_SUST_DEX 0x00000008L
-#define TR2_SUST_CON 0x00000010L
-#define TR2_SUST_CHR 0x00000020L
-#define TR2_INVIS 0x00000040L /* Invisibility */
-#define TR2_LIFE 0x00000080L /* Life multiplier */
-#define TR2_IM_ACID 0x00000100L
-#define TR2_IM_ELEC 0x00000200L
-#define TR2_IM_FIRE 0x00000400L
-#define TR2_IM_COLD 0x00000800L
-#define TR2_SENS_FIRE 0x00001000L /* Sensibility to fire */
-#define TR2_REFLECT 0x00002000L /* Reflect 'bolts' */
-#define TR2_FREE_ACT 0x00004000L /* Free Action */
-#define TR2_HOLD_LIFE 0x00008000L /* Hold Life */
-#define TR2_RES_ACID 0x00010000L
-#define TR2_RES_ELEC 0x00020000L
-#define TR2_RES_FIRE 0x00040000L
-#define TR2_RES_COLD 0x00080000L
-#define TR2_RES_POIS 0x00100000L
-#define TR2_RES_FEAR 0x00200000L
-#define TR2_RES_LITE 0x00400000L
-#define TR2_RES_DARK 0x00800000L
-#define TR2_RES_BLIND 0x01000000L
-#define TR2_RES_CONF 0x02000000L
-#define TR2_RES_SOUND 0x04000000L
-#define TR2_RES_SHARDS 0x08000000L
-#define TR2_RES_NETHER 0x10000000L
-#define TR2_RES_NEXUS 0x20000000L
-#define TR2_RES_CHAOS 0x40000000L
-#define TR2_RES_DISEN 0x80000000L
-#define TR2_NULL_MASK 0x00000000L
-
-#define TR3_SH_FIRE 0x00000001L /* Immolation (Fire) */
-#define TR3_SH_ELEC 0x00000002L /* Electric Sheath */
-#define TR3_AUTO_CURSE 0x00000004L /* The obj will recurse itself */
-#define TR3_DECAY 0x00000008L /* Decay */
-#define TR3_NO_TELE 0x00000010L /* Anti-teleportation */
-#define TR3_NO_MAGIC 0x00000020L /* Anti-magic */
-#define TR3_WRAITH 0x00000040L /* Wraithform */
-#define TR3_TY_CURSE 0x00000080L /* The Ancient Curse */
-#define TR3_EASY_KNOW 0x00000100L /* Aware -> Known */
-#define TR3_HIDE_TYPE 0x00000200L /* Hide "pval" description */
-#define TR3_SHOW_MODS 0x00000400L /* Always show Tohit/Todam */
-#define TR3_INSTA_ART 0x00000800L /* Item must be an artifact */
-#define TR3_FEATHER 0x00001000L /* Feather Falling */
-#define TR3_LITE1 0x00002000L /* lite radius 1 */
-#define TR3_SEE_INVIS 0x00004000L /* See Invisible */
-#define TR3_NORM_ART 0x00008000L /* Artifact in k_info */
-#define TR3_SLOW_DIGEST 0x00010000L /* Item slows down digestion */
-#define TR3_REGEN 0x00020000L /* Item induces regeneration */
-#define TR3_XTRA_MIGHT 0x00040000L /* Bows get extra multiplier */
-#define TR3_XTRA_SHOTS 0x00080000L /* Bows get extra shots */
-#define TR3_IGNORE_ACID 0x00100000L /* Item ignores Acid Damage */
-#define TR3_IGNORE_ELEC 0x00200000L /* Item ignores Elec Damage */
-#define TR3_IGNORE_FIRE 0x00400000L /* Item ignores Fire Damage */
-#define TR3_IGNORE_COLD 0x00800000L /* Item ignores Cold Damage */
-#define TR3_ACTIVATE 0x01000000L /* Item can be activated */
-#define TR3_DRAIN_EXP 0x02000000L /* Item drains Experience */
-#define TR3_TELEPORT 0x04000000L /* Item teleports player */
-#define TR3_AGGRAVATE 0x08000000L /* Item aggravates monsters */
-#define TR3_BLESSED 0x10000000L /* Item is Blessed */
-#define TR3_CURSED 0x20000000L /* Item is Cursed */
-#define TR3_HEAVY_CURSE 0x40000000L /* Item is Heavily Cursed */
-#define TR3_PERMA_CURSE 0x80000000L /* Item is Perma Cursed */
-#define TR3_NULL_MASK 0x00000000L
-
-
-#define TR4_NEVER_BLOW 0x00000001L /* Weapon can't attack */
-#define TR4_PRECOGNITION 0x00000002L /* Like activating the cheat mode */
-#define TR4_BLACK_BREATH 0x00000004L /* Tolkien's Black Breath */
-#define TR4_RECHARGE 0x00000008L /* For artifact Wands and Staffs */
-#define TR4_FLY 0x00000010L /* This one and ONLY this one allow you to fly over trees */
-#define TR4_DG_CURSE 0x00000020L /* The Ancient Morgothian Curse */
-#define TR4_COULD2H 0x00000040L /* Can wield it 2 Handed */
-#define TR4_MUST2H 0x00000080L /* Must wield it 2 Handed */
-#define TR4_LEVELS 0x00000100L /* Can gain exp/exp levels !! */
-#define TR4_CLONE 0x00000200L /* Can clone monsters */
-#define TR4_SPECIAL_GENE 0x00000400L /* The object can only be generated in special conditions like quests, special dungeons, ... */
-#define TR4_CLIMB 0x00000800L /* Allow climbing mountains */
-#define TR4_FAST_CAST 0x00001000L /* Rod is x2 time faster to use */
-#define TR4_CAPACITY 0x00002000L /* Rod can take x2 mana */
-#define TR4_CHARGING 0x00004000L /* Rod recharge faster */
-#define TR4_CHEAPNESS 0x00008000L /* Rod spells are cheaper(in mana cost) to cast */
-#define TR4_FOUNTAIN 0x00010000L /* Available as fountain (for potions) */
-#define TR4_ANTIMAGIC_50 0x00020000L /* Forbid magic */
-#define TR4_EASY_USE 0x00200000L /* Easily activable */
-#define TR4_IM_NETHER 0x00400000L /* Immunity to nether */
-#define TR4_RECHARGED 0x00800000L /* Object has been recharged once */
-#define TR4_ULTIMATE 0x01000000L /* ULTIMATE artifact */
-#define TR4_AUTO_ID 0x02000000L /* Id stuff on floor */
-#define TR4_LITE2 0x04000000L /* lite radius 2 */
-#define TR4_LITE3 0x08000000L /* lite radius 3 */
-#define TR4_FUEL_LITE 0x10000000L /* fuelable lite */
-#define TR4_CURSE_NO_DROP 0x40000000L /* The obj wont be dropped */
-#define TR4_NO_RECHARGE 0x80000000L /* Object Cannot be recharged */
-#define TR4_NULL_MASK 0xFFFFFFFCL
-
-#define TR5_TEMPORARY 0x00000001L /* In timeout turns it is destroyed */
-#define TR5_DRAIN_MANA 0x00000002L /* Drains mana */
-#define TR5_DRAIN_HP 0x00000004L /* Drains hp */
-#define TR5_KILL_DEMON 0x00000008L /* Execute Demon */
-#define TR5_KILL_UNDEAD 0x00000010L /* Execute Undead */
-#define TR5_CRIT 0x00000020L /* More critical hits */
-#define TR5_ATTR_MULTI 0x00000040L /* Object shimmer -- only allowed in k_info */
-#define TR5_WOUNDING 0x00000080L /* Wounds monsters */
-#define TR5_FULL_NAME 0x00000100L /* Uses direct name from k_info */
-#define TR5_LUCK 0x00000200L /* Luck += pval */
-#define TR5_IMMOVABLE 0x00000400L /* Cannot move */
-#define TR5_SPELL_CONTAIN 0x00000800L /* Can contain a spell */
-#define TR5_RES_MORGUL 0x00001000L /* Is not shattered by morgul fiends(nazguls) */
-#define TR5_ACTIVATE_NO_WIELD 0x00002000L /* Can be 'A'ctivated without being wielded */
-#define TR5_MAGIC_BREATH 0x00004000L /* Can breath anywere */
-#define TR5_WATER_BREATH 0x00008000L /* Can breath underwater */
-#define TR5_WIELD_CAST 0x00010000L /* Need to be wielded to cast spelsl fomr it(if it can be wiekded) */
-
-/* ESP defines */
-#define ESP_ORC 0x00000001L
-#define ESP_TROLL 0x00000002L
-#define ESP_DRAGON 0x00000004L
-#define ESP_GIANT 0x00000008L
-#define ESP_DEMON 0x00000010L
-#define ESP_UNDEAD 0x00000020L
-#define ESP_EVIL 0x00000040L
-#define ESP_ANIMAL 0x00000080L
-#define ESP_THUNDERLORD 0x00000100L
-#define ESP_GOOD 0x00000200L
-#define ESP_NONLIVING 0x00000400L
-#define ESP_UNIQUE 0x00000800L
-#define ESP_SPIDER 0x00001000L
-#define ESP_ALL 0x80000000L
-
-/* Number of group of flags to choose from */
-#define MAX_FLAG_GROUP 12
#define NEW_GROUP_CHANCE 40 /* Chance to get a new group */
-/*
- * Hack masks for "pval-dependant" flags.
- */
-#define TR1_PVAL_MASK \
- (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | \
- TR1_CON | TR1_CHR | \
- TR1_STEALTH | TR1_SEARCH | TR1_INFRA | TR1_TUNNEL | \
- TR1_SPEED | TR1_BLOWS | TR1_SPELL)
-
-#define TR5_PVAL_MASK \
- (TR5_CRIT | TR5_LUCK)
-
-
-/*** Ego flags ***/
-#define ETR4_SUSTAIN 0x00000001L /* Ego-Item gives a Random Sustain */
-#define ETR4_OLD_RESIST 0x00000002L /* The old "extra power" random high resist */
-#define ETR4_ABILITY 0x00000004L /* Ego-Item has a random Sustain */
-#define ETR4_R_ELEM 0x00000008L /* Item resists Acid/Fire/Cold/Elec or Poison */
-#define ETR4_R_LOW 0x00000010L /* Item has a random low resist */
-#define ETR4_R_HIGH 0x00000020L /* Item has a random high resist */
-#define ETR4_R_ANY 0x00000040L /* Item has one additional resist */
-#define ETR4_R_DRAGON 0x00000080L /* Item gets "Dragon" Resist */
-#define ETR4_SLAY_WEAP 0x00000100L /* Special 'Slaying' bonus */
-#define ETR4_DAM_DIE 0x00000200L /* Item has an additional dam die */
-#define ETR4_DAM_SIZE 0x00000400L /* Item has greater damage dice */
-#define ETR4_PVAL_M1 0x00000800L /* Item has +1 to pval */
-#define ETR4_PVAL_M2 0x00001000L /* Item has +(up to 2) to pval */
-#define ETR4_PVAL_M3 0x00002000L /* Item has +(up to 3) to pval */
-#define ETR4_PVAL_M5 0x00004000L /* Item has +(up to 5) to pval */
-#define ETR4_AC_M1 0x00008000L /* Item has +1 to AC */
-#define ETR4_AC_M2 0x00010000L /* Item has +(up to 2) to AC */
-#define ETR4_AC_M3 0x00020000L /* Item has +(up to 3) to AC */
-#define ETR4_AC_M5 0x00040000L /* Item has +(up to 5) to AC */
-#define ETR4_TH_M1 0x00080000L /* Item has +1 to hit */
-#define ETR4_TH_M2 0x00100000L /* Item has +(up to 2) to hit */
-#define ETR4_TH_M3 0x00200000L /* Item has +(up to 3) to hit */
-#define ETR4_TH_M5 0x00400000L /* Item has +(up to 5) to hit */
-#define ETR4_TD_M1 0x00800000L /* Item has +1 to dam */
-#define ETR4_TD_M2 0x01000000L /* Item has +(up to 2) to dam */
-#define ETR4_TD_M3 0x02000000L /* Item has +(up to 3) to dam */
-#define ETR4_TD_M5 0x04000000L /* Item has +(up to 5) to dam */
-#define ETR4_R_P_ABILITY 0x08000000L /* Item has a random pval-affected ability */
-#define ETR4_R_STAT 0x10000000L /* Item affects a random stat */
-#define ETR4_R_STAT_SUST 0x20000000L /* Item affects a random stat & sustains it */
-#define ETR4_R_IMMUNITY 0x40000000L /* Item gives a random immunity */
-#define ETR4_LIMIT_BLOWS 0x80000000L /* switch the "limit blows" feature */
-
-/*** Features flags -- DG ***/
-#define FF1_NO_WALK 0x00000001L
-#define FF1_NO_VISION 0x00000002L
-#define FF1_CAN_LEVITATE 0x00000004L
-#define FF1_CAN_PASS 0x00000008L
-#define FF1_FLOOR 0x00000010L
-#define FF1_WALL 0x00000020L
-#define FF1_PERMANENT 0x00000040L
-#define FF1_CAN_FLY 0x00000080L
-#define FF1_REMEMBER 0x00000100L
-#define FF1_NOTICE 0x00000200L
-#define FF1_DONT_NOTICE_RUNNING 0x00000400L
-#define FF1_CAN_RUN 0x00000800L
-#define FF1_DOOR 0x00001000L
-#define FF1_SUPPORT_LIGHT 0x00002000L
-#define FF1_CAN_CLIMB 0x00004000L
-#define FF1_TUNNELABLE 0x00008000L
-#define FF1_WEB 0x00010000L
-#define FF1_ATTR_MULTI 0x00020000L
-#define FF1_SUPPORT_GROWTH 0x00040000L
-
-/*** Dungeon type flags -- DG ***/
-#define DF1_PRINCIPAL 0x00000001L /* Is a principal dungeon */
-#define DF1_MAZE 0x00000002L /* Is a maze-type dungeon */
-#define DF1_SMALLEST 0x00000004L /* Creates VERY small levels like The Maze */
-#define DF1_SMALL 0x00000008L /* Creates small levels like Dol Goldor */
-#define DF1_BIG 0x00000010L /* Creates big levels like Moria, and Angband dungeons */
-#define DF1_NO_DOORS 0x00000020L /* No doors on rooms, like Barrowdowns, Old Forest etc) */
-#define DF1_WATER_RIVER 0x00000040L /* Allow a single water streamer on a level */
-#define DF1_LAVA_RIVER 0x00000080L /* Allow a single lava streamer on a level */
-#define DF1_WATER_RIVERS 0x00000100L /* Allow multiple water streamers on a level */
-#define DF1_LAVA_RIVERS 0x00000200L /* Allow multiple lava streamers on a level */
-#define DF1_CAVE 0x00000400L /* Allow rooms */
-#define DF1_CAVERN 0x00000800L /* Allow cavern rooms */
-#define DF1_NO_UP 0x00001000L /* Disallow up stairs */
-#define DF1_HOT 0x00002000L /* Corpses on ground and in pack decay quicker through heat */
-#define DF1_COLD 0x00004000L /* Corpses on ground and in pack decay quicker through cold */
-#define DF1_FORCE_DOWN 0x00008000L /* No up stairs generated */
-#define DF1_FORGET 0x00010000L /* Features are forgotten, like the Maze and Illusory Castle */
-#define DF1_NO_DESTROY 0x00020000L /* No destroyed levels in dungeon */
-#define DF1_SAND_VEIN 0x00040000L /* Like in the sandworm lair */
-#define DF1_CIRCULAR_ROOMS 0x00080000L /* Allow circular rooms */
-#define DF1_EMPTY 0x00100000L /* Allow arena levels */
-#define DF1_DAMAGE_FEAT 0x00200000L
-#define DF1_FLAT 0x00400000L /* Creates paths to next areas at edge of level, like Barrowdowns */
-#define DF1_TOWER 0x00800000L /* You start at bottom and go up rather than the reverse */
-#define DF1_RANDOM_TOWNS 0x01000000L /* Allow random towns */
-#define DF1_DOUBLE 0x02000000L /* Creates double-walled dungeon like Helcaraxe and Erebor */
-#define DF1_LIFE_LEVEL 0x04000000L /* Creates dungeon level on modified 'game of life' algorithm */
-#define DF1_EVOLVE 0x08000000L /* Evolving, pulsing levels like Heart of the Earth */
-#define DF1_ADJUST_LEVEL_1 0x10000000L /* Minimum monster level will be equal to dungeon level */
-#define DF1_ADJUST_LEVEL_2 0x20000000L /* Minimum monster level will be double the dungeon level */
-#define DF1_NO_RECALL 0x40000000L /* No recall allowed */
-#define DF1_NO_STREAMERS 0x80000000L /* No streamers */
-
-#define DF2_ADJUST_LEVEL_1_2 0x00000001L /* Minimum monster level will be half the dungeon level */
-#define DF2_NO_SHAFT 0x00000002L /* No shafts */
-#define DF2_ADJUST_LEVEL_PLAYER 0x00000004L /* Uses player level*2 instead of dungeon level for other ADJUST_LEVEL flags */
-#define DF2_NO_TELEPORT 0x00000008L
-#define DF2_ASK_LEAVE 0x00000010L
-#define DF2_NO_STAIR 0x00000020L
-#define DF2_SPECIAL 0x00000040L
-#define DF2_NO_NEW_MONSTER 0x00000080L
-#define DF2_DESC 0x00000100L
-#define DF2_NO_GENO 0x00000200L
-#define DF2_NO_BREATH 0x00000400L /* Oups, cannot breath here */
-#define DF2_WATER_BREATH 0x00000800L /* Oups, cannot breath here, need water breathing */
-#define DF2_ELVEN 0x00001000L /* Try to create elven monster ego */
-#define DF2_DWARVEN 0x00002000L /* Try to create dwarven monster ego */
-#define DF2_NO_EASY_MOVE 0x00004000L /* Forbid stuff like teleport level, probability travel, ... */
-#define DF2_NO_RECALL_OUT 0x00008000L /* Cannot recall out of the place */
-#define DF2_DESC_ALWAYS 0x00010000L /* Always shows the desc */
-
/*** Town flags ***/
#define TOWN_REAL 0x01 /* Town is really present */
#define TOWN_KNOWN 0x02 /* Town is found by the player */
@@ -2903,341 +2064,6 @@
#define MONSTER_LEVEL_MAX 150
-/*
- * New monster race bit flags
- */
-#define RF1_UNIQUE 0x00000001 /* Unique Monster */
-#define RF1_QUESTOR 0x00000002 /* Quest Monster */
-#define RF1_MALE 0x00000004 /* Male gender */
-#define RF1_FEMALE 0x00000008 /* Female gender */
-#define RF1_CHAR_CLEAR 0x00000010 /* Absorbs symbol */
-#define RF1_CHAR_MULTI 0x00000020 /* Changes symbol */
-#define RF1_ATTR_CLEAR 0x00000040 /* Absorbs color */
-#define RF1_ATTR_MULTI 0x00000080 /* Changes color */
-#define RF1_FORCE_DEPTH 0x00000100 /* Start at "correct" depth */
-#define RF1_FORCE_MAXHP 0x00000200 /* Start with max hitpoints */
-#define RF1_FORCE_SLEEP 0x00000400 /* Start out sleeping */
-#define RF1_FORCE_EXTRA 0x00000800 /* Start out something */
-#define RF1_FRIEND 0x00001000 /* Arrive with a friend */
-#define RF1_FRIENDS 0x00002000 /* Arrive with some friends */
-#define RF1_ESCORT 0x00004000 /* Arrive with an escort */
-#define RF1_ESCORTS 0x00008000 /* Arrive with some escorts */
-#define RF1_NEVER_BLOW 0x00010000 /* Never make physical blow */
-#define RF1_NEVER_MOVE 0x00020000 /* Never make physical move */
-#define RF1_RAND_25 0x00040000 /* Moves randomly (25%) */
-#define RF1_RAND_50 0x00080000 /* Moves randomly (50%) */
-#define RF1_ONLY_GOLD 0x00100000 /* Drop only gold */
-#define RF1_ONLY_ITEM 0x00200000 /* Drop only items */
-#define RF1_DROP_60 0x00400000 /* Drop an item/gold (60%) */
-#define RF1_DROP_90 0x00800000 /* Drop an item/gold (90%) */
-#define RF1_DROP_1D2 0x01000000 /* Drop 1d2 items/gold */
-#define RF1_DROP_2D2 0x02000000 /* Drop 2d2 items/gold */
-#define RF1_DROP_3D2 0x04000000 /* Drop 3d2 items/gold */
-#define RF1_DROP_4D2 0x08000000 /* Drop 4d2 items/gold */
-#define RF1_DROP_GOOD 0x10000000 /* Drop good items */
-#define RF1_DROP_GREAT 0x20000000 /* Drop great items */
-#define RF1_DROP_USEFUL 0x40000000 /* Drop "useful" items */
-#define RF1_DROP_CHOSEN 0x80000000 /* Drop "chosen" items */
-
-/*
- * New monster race bit flags
- */
-#define RF2_STUPID 0x00000001 /* Monster is stupid */
-#define RF2_SMART 0x00000002 /* Monster is smart */
-#define RF2_CAN_SPEAK 0x00000004 /* TY: can speak */
-#define RF2_REFLECTING 0x00000008 /* Reflects bolts */
-#define RF2_INVISIBLE 0x00000010 /* Monster avoids vision */
-#define RF2_COLD_BLOOD 0x00000020 /* Monster avoids infra */
-#define RF2_EMPTY_MIND 0x00000040 /* Monster avoids telepathy */
-#define RF2_WEIRD_MIND 0x00000080 /* Monster avoids telepathy? */
-#define RF2_DEATH_ORB 0x00000100 /* Death Orb */
-#define RF2_REGENERATE 0x00000200 /* Monster regenerates */
-#define RF2_SHAPECHANGER 0x00000400 /* TY: shapechanger */
-#define RF2_ATTR_ANY 0x00000800 /* TY: Attr_any */
-#define RF2_POWERFUL 0x00001000 /* Monster has strong breath */
-#define RF2_ELDRITCH_HORROR 0x00002000 /* Sanity-blasting horror */
-#define RF2_AURA_FIRE 0x00004000 /* Burns in melee */
-#define RF2_AURA_ELEC 0x00008000 /* Shocks in melee */
-#define RF2_OPEN_DOOR 0x00010000 /* Monster can open doors */
-#define RF2_BASH_DOOR 0x00020000 /* Monster can bash doors */
-#define RF2_PASS_WALL 0x00040000 /* Monster can pass walls */
-#define RF2_KILL_WALL 0x00080000 /* Monster can destroy walls */
-#define RF2_MOVE_BODY 0x00100000 /* Monster can move monsters */
-#define RF2_KILL_BODY 0x00200000 /* Monster can kill monsters */
-#define RF2_TAKE_ITEM 0x00400000 /* Monster can pick up items */
-#define RF2_KILL_ITEM 0x00800000 /* Monster can crush items */
-#define RF2_BRAIN_1 0x01000000
-#define RF2_BRAIN_2 0x02000000
-#define RF2_BRAIN_3 0x04000000
-#define RF2_BRAIN_4 0x08000000
-#define RF2_BRAIN_5 0x10000000
-#define RF2_BRAIN_6 0x20000000
-#define RF2_BRAIN_7 0x40000000
-#define RF2_BRAIN_8 0x80000000
-
-/*
- * New monster race bit flags
- */
-#define RF3_ORC 0x00000001 /* Orc */
-#define RF3_TROLL 0x00000002 /* Troll */
-#define RF3_GIANT 0x00000004 /* Giant */
-#define RF3_DRAGON 0x00000008 /* Dragon */
-#define RF3_DEMON 0x00000010 /* Demon */
-#define RF3_UNDEAD 0x00000020 /* Undead */
-#define RF3_EVIL 0x00000040 /* Evil */
-#define RF3_ANIMAL 0x00000080 /* Animal */
-#define RF3_THUNDERLORD 0x00000100 /* DG: Thunderlord */
-#define RF3_GOOD 0x00000200 /* Good */
-#define RF3_AURA_COLD 0x00000400 /* Freezes in melee */
-#define RF3_NONLIVING 0x00000800 /* TY: Non-Living (?) */
-#define RF3_HURT_LITE 0x00001000 /* Hurt by lite */
-#define RF3_HURT_ROCK 0x00002000 /* Hurt by rock remover */
-#define RF3_SUSCEP_FIRE 0x00004000 /* Hurt badly by fire */
-#define RF3_SUSCEP_COLD 0x00008000 /* Hurt badly by cold */
-#define RF3_IM_ACID 0x00010000 /* Resist acid a lot */
-#define RF3_IM_ELEC 0x00020000 /* Resist elec a lot */
-#define RF3_IM_FIRE 0x00040000 /* Resist fire a lot */
-#define RF3_IM_COLD 0x00080000 /* Resist cold a lot */
-#define RF3_IM_POIS 0x00100000 /* Resist poison a lot */
-#define RF3_RES_TELE 0x00200000 /* Resist teleportation */
-#define RF3_RES_NETH 0x00400000 /* Resist nether a lot */
-#define RF3_RES_WATE 0x00800000 /* Resist water */
-#define RF3_RES_PLAS 0x01000000 /* Resist plasma */
-#define RF3_RES_NEXU 0x02000000 /* Resist nexus */
-#define RF3_RES_DISE 0x04000000 /* Resist disenchantment */
-#define RF3_UNIQUE_4 0x08000000 /* Is a "Nazgul" unique */
-#define RF3_NO_FEAR 0x10000000 /* Cannot be scared */
-#define RF3_NO_STUN 0x20000000 /* Cannot be stunned */
-#define RF3_NO_CONF 0x40000000 /* Cannot be confused */
-#define RF3_NO_SLEEP 0x80000000 /* Cannot be slept */
-
-/*
- * New monster race bit flags
- */
-#define RF4_SHRIEK 0x00000001 /* Shriek for help */
-#define RF4_MULTIPLY 0x00000002 /* Monster reproduces */
-#define RF4_S_ANIMAL 0x00000004 /* Summon animals */
-#define RF4_ROCKET 0x00000008 /* TY: Rocket */
-#define RF4_ARROW_1 0x00000010 /* Fire an arrow (light) */
-#define RF4_ARROW_2 0x00000020 /* Fire an arrow (heavy) */
-#define RF4_ARROW_3 0x00000040 /* Fire missiles (light) */
-#define RF4_ARROW_4 0x00000080 /* Fire missiles (heavy) */
-#define RF4_BR_ACID 0x00000100 /* Breathe Acid */
-#define RF4_BR_ELEC 0x00000200 /* Breathe Elec */
-#define RF4_BR_FIRE 0x00000400 /* Breathe Fire */
-#define RF4_BR_COLD 0x00000800 /* Breathe Cold */
-#define RF4_BR_POIS 0x00001000 /* Breathe Poison */
-#define RF4_BR_NETH 0x00002000 /* Breathe Nether */
-#define RF4_BR_LITE 0x00004000 /* Breathe Lite */
-#define RF4_BR_DARK 0x00008000 /* Breathe Dark */
-#define RF4_BR_CONF 0x00010000 /* Breathe Confusion */
-#define RF4_BR_SOUN 0x00020000 /* Breathe Sound */
-#define RF4_BR_CHAO 0x00040000 /* Breathe Chaos */
-#define RF4_BR_DISE 0x00080000 /* Breathe Disenchant */
-#define RF4_BR_NEXU 0x00100000 /* Breathe Nexus */
-#define RF4_BR_TIME 0x00200000 /* Breathe Time */
-#define RF4_BR_INER 0x00400000 /* Breathe Inertia */
-#define RF4_BR_GRAV 0x00800000 /* Breathe Gravity */
-#define RF4_BR_SHAR 0x01000000 /* Breathe Shards */
-#define RF4_BR_PLAS 0x02000000 /* Breathe Plasma */
-#define RF4_BR_WALL 0x04000000 /* Breathe Force */
-#define RF4_BR_MANA 0x08000000 /* Breathe Mana */
-#define RF4_BA_NUKE 0x10000000 /* TY: Nuke Ball */
-#define RF4_BR_NUKE 0x20000000 /* TY: Toxic Breath */
-#define RF4_BA_CHAO 0x40000000 /* Chaos Ball */
-#define RF4_BR_DISI 0x80000000 /* Breathe Disintegration */
-
-/*
- * New monster race bit flags
- */
-#define RF5_BA_ACID 0x00000001 /* Acid Ball */
-#define RF5_BA_ELEC 0x00000002 /* Elec Ball */
-#define RF5_BA_FIRE 0x00000004 /* Fire Ball */
-#define RF5_BA_COLD 0x00000008 /* Cold Ball */
-#define RF5_BA_POIS 0x00000010 /* Poison Ball */
-#define RF5_BA_NETH 0x00000020 /* Nether Ball */
-#define RF5_BA_WATE 0x00000040 /* Water Ball */
-#define RF5_BA_MANA 0x00000080 /* Mana Storm */
-#define RF5_BA_DARK 0x00000100 /* Darkness Storm */
-#define RF5_DRAIN_MANA 0x00000200 /* Drain Mana */
-#define RF5_MIND_BLAST 0x00000400 /* Blast Mind */
-#define RF5_BRAIN_SMASH 0x00000800 /* Smash Brain */
-#define RF5_CAUSE_1 0x00001000 /* Cause Light Wound */
-#define RF5_CAUSE_2 0x00002000 /* Cause Serious Wound */
-#define RF5_CAUSE_3 0x00004000 /* Cause Critical Wound */
-#define RF5_CAUSE_4 0x00008000 /* Cause Mortal Wound */
-#define RF5_BO_ACID 0x00010000 /* Acid Bolt */
-#define RF5_BO_ELEC 0x00020000 /* Elec Bolt (unused) */
-#define RF5_BO_FIRE 0x00040000 /* Fire Bolt */
-#define RF5_BO_COLD 0x00080000 /* Cold Bolt */
-#define RF5_BO_POIS 0x00100000 /* Poison Bolt (unused) */
-#define RF5_BO_NETH 0x00200000 /* Nether Bolt */
-#define RF5_BO_WATE 0x00400000 /* Water Bolt */
-#define RF5_BO_MANA 0x00800000 /* Mana Bolt */
-#define RF5_BO_PLAS 0x01000000 /* Plasma Bolt */
-#define RF5_BO_ICEE 0x02000000 /* Ice Bolt */
-#define RF5_MISSILE 0x04000000 /* Magic Missile */
-#define RF5_SCARE 0x08000000 /* Frighten Player */
-#define RF5_BLIND 0x10000000 /* Blind Player */
-#define RF5_CONF 0x20000000 /* Confuse Player */
-#define RF5_SLOW 0x40000000 /* Slow Player */
-#define RF5_HOLD 0x80000000 /* Paralyze Player */
-
-/*
- * New monster race bit flags
- */
-#define RF6_HASTE 0x00000001 /* Speed self */
-#define RF6_HAND_DOOM 0x00000002 /* Hand of Doom */
-#define RF6_HEAL 0x00000004 /* Heal self */
-#define RF6_S_ANIMALS 0x00000008 /* Summon animals */
-#define RF6_BLINK 0x00000010 /* Teleport Short */
-#define RF6_TPORT 0x00000020 /* Teleport Long */
-#define RF6_TELE_TO 0x00000040 /* Move player to monster */
-#define RF6_TELE_AWAY 0x00000080 /* Move player far away */
-#define RF6_TELE_LEVEL 0x00000100 /* Move player vertically */
-#define RF6_DARKNESS 0x00000200 /* Create Darkness */
-#define RF6_TRAPS 0x00000400 /* Create Traps */
-#define RF6_FORGET 0x00000800 /* Cause amnesia */
-#define RF6_RAISE_DEAD 0x00001000 /* Raise Dead */
-#define RF6_S_BUG 0x00002000 /* Summon Software bug */
-#define RF6_S_RNG 0x00004000 /* Summon RNG */
-#define RF6_S_THUNDERLORD 0x00008000 /* Summon Thunderlords */
-#define RF6_S_KIN 0x00010000 /* Summon "kin" */
-#define RF6_S_HI_DEMON 0x00020000 /* Summon greater demons! */
-#define RF6_S_MONSTER 0x00040000 /* Summon Monster */
-#define RF6_S_MONSTERS 0x00080000 /* Summon Monsters */
-#define RF6_S_ANT 0x00100000 /* Summon Ants */
-#define RF6_S_SPIDER 0x00200000 /* Summon Spiders */
-#define RF6_S_HOUND 0x00400000 /* Summon Hounds */
-#define RF6_S_HYDRA 0x00800000 /* Summon Hydras */
-#define RF6_S_ANGEL 0x01000000 /* Summon Angel */
-#define RF6_S_DEMON 0x02000000 /* Summon Demon */
-#define RF6_S_UNDEAD 0x04000000 /* Summon Undead */
-#define RF6_S_DRAGON 0x08000000 /* Summon Dragon */
-#define RF6_S_HI_UNDEAD 0x10000000 /* Summon Greater Undead */
-#define RF6_S_HI_DRAGON 0x20000000 /* Summon Ancient Dragon */
-#define RF6_S_WRAITH 0x40000000 /* Summon Unique Wraith */
-#define RF6_S_UNIQUE 0x80000000 /* Summon Unique Monster */
-
-/*
- * New monster race bit flags
- */
-#define RF7_AQUATIC 0x00000001 /* Aquatic monster */
-#define RF7_CAN_SWIM 0x00000002 /* Monster can swim */
-#define RF7_CAN_FLY 0x00000004 /* Monster can fly */
-#define RF7_FRIENDLY 0x00000008 /* Monster is friendly */
-#define RF7_PET 0x00000010 /* Monster is a pet */
-#define RF7_MORTAL 0x00000020 /* Monster is a mortal being */
-#define RF7_SPIDER 0x00000040 /* Monster is a spider (can pass webs) */
-#define RF7_NAZGUL 0x00000080 /* Monster is a Nazgul */
-#define RF7_DG_CURSE 0x00000100 /* If killed the monster grant a DG Curse to the player */
-#define RF7_POSSESSOR 0x00000200 /* Is it a dreaded possessor monster ? */
-#define RF7_NO_DEATH 0x00000400 /* Cannot be killed */
-#define RF7_NO_TARGET 0x00000800 /* Cannot be targeted */
-#define RF7_AI_ANNOY 0x00001000 /* Try to tease the player */
-#define RF7_AI_SPECIAL 0x00002000 /* For quests */
-#define RF7_NEUTRAL 0x00004000 /* Monster is neutral */
-#define RF7_DROP_ART 0x00008000 /* Monster drop one art */
-#define RF7_DROP_RANDART 0x00010000 /* Monster drop one randart */
-#define RF7_AI_PLAYER 0x00020000 /* Controlled by the player */
-#define RF7_NO_THEFT 0x00040000 /* Monster is immune to theft */
-#define RF7_SPIRIT 0x00080000 /* This is a Spirit, coming from the Void */
-
-
-/*
- * Monster race flags
- */
-#define RF8_DUNGEON 0x00000001
-#define RF8_WILD_TOWN 0x00000002
-#define RF8_XXX8X02 0x00000004
-#define RF8_WILD_SHORE 0x00000008
-#define RF8_WILD_OCEAN 0x00000010
-#define RF8_WILD_WASTE 0x00000020
-#define RF8_WILD_WOOD 0x00000040
-#define RF8_WILD_VOLCANO 0x00000080
-#define RF8_XXX8X08 0x00000100
-#define RF8_WILD_MOUNTAIN 0x00000200
-#define RF8_WILD_GRASS 0x00000400
-#define RF8_NO_CUT 0x00000800
-#define RF8_CTHANGBAND 0x00001000 /* Not used in ToME */
-/* XXX */
-#define RF8_ZANGBAND 0x00004000 /* Not used in ToME */
-#define RF8_JOKEANGBAND 0x00008000
-#define RF8_ANGBAND 0x00010000
-
-#define RF8_WILD_TOO 0x80000000
-
-
-/*
- * Monster race flags
- */
-#define RF9_DROP_CORPSE 0x00000001
-#define RF9_DROP_SKELETON 0x00000002
-#define RF9_HAS_LITE 0x00000004 /* Carries a lite */
-#define RF9_MIMIC 0x00000008 /* *REALLY* looks like an object ... only nastier */
-#define RF9_HAS_EGG 0x00000010 /* Can be monster's eggs */
-#define RF9_IMPRESED 0x00000020 /* The monster can follow you on each level until he dies */
-#define RF9_SUSCEP_ACID 0x00000040 /* Susceptible to acid */
-#define RF9_SUSCEP_ELEC 0x00000080 /* Susceptible to lightning */
-#define RF9_SUSCEP_POIS 0x00000100 /* Susceptible to poison */
-#define RF9_KILL_TREES 0x00000200 /* Monster can eat trees */
-#define RF9_WYRM_PROTECT 0x00000400 /* The monster is protected by great wyrms of power: They'll be summoned if it's killed */
-#define RF9_DOPPLEGANGER 0x00000800 /* The monster looks like you */
-#define RF9_ONLY_DEPTH 0x00001000 /* The monster can only be generated at the GIVEN depth */
-#define RF9_SPECIAL_GENE 0x00002000 /* The monster can only be generated in special conditions like quests, special dungeons, ... */
-#define RF9_NEVER_GENE 0x00004000 /* The monster cannot be normaly generated */
-
-
-/*
- * Hack -- choose "intelligent" spells when desperate
- */
-
-#define RF4_INT_MASK \
- (RF4_S_ANIMAL)
-
-#define RF5_INT_MASK \
- (RF5_HOLD | RF5_SLOW | RF5_CONF | RF5_BLIND | RF5_SCARE)
-
-#define RF6_INT_MASK \
- (RF6_BLINK | RF6_TPORT | RF6_TELE_LEVEL | RF6_TELE_AWAY | \
- RF6_HEAL | RF6_HASTE | RF6_TRAPS | \
- RF6_S_KIN | RF6_S_HI_DEMON | RF6_S_MONSTER | RF6_S_MONSTERS | \
- RF6_S_ANT | RF6_S_SPIDER | RF6_S_HOUND | RF6_S_HYDRA | \
- RF6_S_ANGEL | RF6_S_DRAGON | RF6_S_UNDEAD | RF6_S_DEMON | \
- RF6_S_HI_DRAGON | RF6_S_HI_UNDEAD | RF6_S_WRAITH | RF6_S_UNIQUE | \
- RF6_S_THUNDERLORD | RF6_S_BUG | RF6_S_RNG | RF6_S_ANIMALS)
-
-
-/*
- * Hack -- "bolt" spells that may hurt fellow monsters
- */
-#define RF4_BOLT_MASK \
- (RF4_ARROW_1 | RF4_ARROW_2 | RF4_ARROW_3 | RF4_ARROW_4)
-
-#define RF5_BOLT_MASK \
- (RF5_BO_ACID | RF5_BO_ELEC | RF5_BO_FIRE | RF5_BO_COLD | \
- RF5_BO_POIS | RF5_BO_NETH | RF5_BO_WATE | RF5_BO_MANA | \
- RF5_BO_PLAS | RF5_BO_ICEE | RF5_MISSILE)
-
-#define RF6_BOLT_MASK \
- 0L
-
-
-/* Hack -- summon spells */
-
-#define RF4_SUMMON_MASK \
- (RF4_S_ANIMAL)
-
-#define RF5_SUMMON_MASK \
- 0L
-
-#define RF6_SUMMON_MASK \
- (RF6_S_KIN | RF6_S_HI_DEMON | RF6_S_MONSTER | RF6_S_MONSTERS | RF6_S_ANT | \
- RF6_S_SPIDER | RF6_S_HOUND | RF6_S_HYDRA | RF6_S_ANGEL | RF6_S_DEMON | \
- RF6_S_UNDEAD | RF6_S_DRAGON | RF6_S_HI_UNDEAD | RF6_S_HI_DRAGON | \
- RF6_S_WRAITH | RF6_S_UNIQUE | RF6_S_THUNDERLORD | RF6_S_BUG | RF6_S_RNG | \
- RF6_S_ANIMALS)
-
/*** Macro Definitions ***/
@@ -3249,83 +2075,6 @@
-/*** Sound constants ***/
-
-
-#define SOUND_HIT 1
-#define SOUND_MISS 2
-#define SOUND_FLEE 3
-#define SOUND_DROP 4
-#define SOUND_KILL 5
-#define SOUND_LEVEL 6
-#define SOUND_DEATH 7
-#define SOUND_STUDY 8
-#define SOUND_TELEPORT 9
-#define SOUND_SHOOT 10
-#define SOUND_QUAFF 11
-#define SOUND_ZAP 12
-#define SOUND_WALK 13
-#define SOUND_TPOTHER 14
-#define SOUND_HITWALL 15
-#define SOUND_EAT 16
-#define SOUND_STORE1 17
-#define SOUND_STORE2 18
-#define SOUND_STORE3 19
-#define SOUND_STORE4 20
-#define SOUND_DIG 21
-#define SOUND_OPENDOOR 22
-#define SOUND_SHUTDOOR 23
-#define SOUND_TPLEVEL 24
-#define SOUND_SCROLL 25
-#define SOUND_BUY 26
-#define SOUND_SELL 27
-#define SOUND_WARN 28
-#define SOUND_ROCKET 29 /* Somebody's shooting rockets */
-#define SOUND_N_KILL 30 /* The player kills a non-living/undead monster */
-#define SOUND_U_KILL 31 /* The player kills a unique */
-#define SOUND_QUEST 32 /* The player has just completed a quest */
-#define SOUND_HEAL 33 /* The player was healed a little bit */
-#define SOUND_X_HEAL 34 /* The player was healed full health */
-#define SOUND_BITE 35 /* A monster bites you */
-#define SOUND_CLAW 36 /* A monster claws you */
-#define SOUND_M_SPELL 37 /* A monster casts a miscellaneous spell */
-#define SOUND_SUMMON 38 /* A monster casts a summoning spell */
-#define SOUND_BREATH 39 /* A monster breathes */
-#define SOUND_BALL 40 /* A monster casts a ball / bolt spell */
-#define SOUND_M_HEAL 41 /* A monster heals itself somehow */
-#define SOUND_ATK_SPELL 42 /* A monster casts a misc. offensive spell */
-#define SOUND_EVIL 43 /* Something nasty has just happened! */
-#define SOUND_TOUCH 44 /* A monster touches you */
-#define SOUND_STING 45 /* A monster stings you */
-#define SOUND_CRUSH 46 /* A monster crushes / envelopes you */
-#define SOUND_SLIME 47 /* A monster drools/spits/etc on you */
-#define SOUND_WAIL 48 /* A monster wails */
-#define SOUND_WINNER 49 /* Just won the game! */
-#define SOUND_FIRE 50 /* An item was burned */
-#define SOUND_ACID 51 /* An item was destroyed by acid */
-#define SOUND_ELEC 52 /* An item was destroyed by electricity */
-#define SOUND_COLD 53 /* An item was shattered */
-#define SOUND_ILLEGAL 54 /* Illegal command attempted */
-#define SOUND_FAIL 55 /* Fail to get a spell off / activate an item */
-#define SOUND_WAKEUP 56 /* A monster wakes up */
-#define SOUND_INVULN 57 /* Invulnerability! */
-#define SOUND_FALL 58 /* Falling through a trapdoor... */
-#define SOUND_PAIN 59 /* A monster is in pain! */
-#define SOUND_DESTITEM 60 /* An item was destroyed by misc. means */
-#define SOUND_MOAN 61 /* A monster makes a moan/beg/insult attack */
-#define SOUND_SHOW 62 /* A monster makes a "show" attack */
-#define SOUND_UNUSED 63 /* (no sound for gaze attacks) */
-#define SOUND_EXPLODE 64 /* Something (or somebody) explodes */
-
-/*
- * Mega-Hack -- maximum known sounds
- */
-#define SOUND_MAX 65
-
-
-
-/*** Hack ***/
-
/*
* Road flags
@@ -3351,7 +2100,6 @@
#define BACT_REST 17
#define BACT_FOOD 18
#define BACT_RUMORS 19
-#define BACT_RESEARCH_MONSTER 20
#define BACT_COMPARE_WEAPONS 21
#define BACT_ENCHANT_WEAPON 23
#define BACT_ENCHANT_ARMOR 24
@@ -3420,19 +2168,6 @@
#define FATE_DIE 6
/*
- * Runes definition
- */
-#define RUNE_SELF 0x00000001
-#define RUNE_ARROW 0x00000002
-#define RUNE_RAY 0x00000004
-#define RUNE_SPHERE 0x00000008
-#define RUNE_POWER_SURGE 0x00000010
-#define RUNE_ARMAGEDDON 0x00000020
-#define RUNE_MOD_MAX 6
-#define RUNE_STONE 0x000000FF
-
-
-/*
* Defines of the different dungeon types
*/
#define DUNGEON_WILDERNESS 0
@@ -3464,7 +2199,7 @@
*/
#define level_or_feat(DTYPE, DLEVEL) \
((DTYPE) == DUNGEON_WILDERNESS ? \
- wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat : \
+ (game->wilderness)(p_ptr->wilderness_x, p_ptr->wilderness_y).feat : \
(DLEVEL) )
@@ -3541,12 +2276,6 @@
#define MEGO_CHANCE 18 /* % chances of getting ego monsters */
-/* Object generation */
-#define OBJ_GENE_TREASURE 20
-#define OBJ_GENE_COMBAT 20
-#define OBJ_GENE_MAGIC 20
-#define OBJ_GENE_TOOL 20
-
/*
* Used (or should be) by various functions and tables needing access to
* single bits
@@ -3559,21 +2288,6 @@
/*
- * Store flags
- */
-#define SF1_DEPEND_LEVEL 0x00000001L
-#define SF1_SHALLOW_LEVEL 0x00000002L
-#define SF1_MEDIUM_LEVEL 0x00000004L
-#define SF1_DEEP_LEVEL 0x00000008L
-#define SF1_RARE 0x00000010L
-#define SF1_VERY_RARE 0x00000020L
-#define SF1_COMMON 0x00000040L
-#define SF1_ALL_ITEM 0x00000080L /* Works as the BM */
-#define SF1_RANDOM 0x00000100L
-#define SF1_FORCE_LEVEL 0x00000200L
-#define SF1_MUSEUM 0x00000400L
-
-/*
* Shield effect options
*/
#define SHIELD_NONE 0x0000
@@ -3747,11 +2461,6 @@
/* Number of skill choices for Lost Sword quests. */
#define LOST_SWORD_NSKILLS 4
-/* SKill flags */
-#define SKF1_HIDDEN 0x00000001 /* Starts hidden */
-#define SKF1_AUTO_HIDE 0x00000002 /* Tries to rehide at calc_bonus */
-#define SKF1_RANDOM_GAIN 0x00000004 /* Can be randomly gained by certain quests & such */
-
#define MAX_MELEE 3
@@ -3795,7 +2504,6 @@
#define CMD_DUMP_HTML -8186
#define CMD_MACRO -8185
#define CMD_QUEST -8184
-#define CMD_BLUNDER -8183
#define CMD_SHOW_ABILITY -8182
#define CLI_MAX 128
@@ -3818,7 +2526,6 @@
#define AB_AMMO_CREATION 5
#define AB_DEATH_TOUCH 6
#define AB_FAR_REACHING 8
-#define AB_TRAPPING 9
#define AB_UNDEAD_FORM 10
/**
diff --git a/src/dungeon.cc b/src/dungeon.cc
index 3ec79068..f8671387 100644
--- a/src/dungeon.cc
+++ b/src/dungeon.cc
@@ -10,7 +10,6 @@
#include "dungeon.h"
#include "birth.hpp"
-#include "birth.h"
#include "cave.hpp"
#include "cave_type.hpp"
#include "cmd1.hpp"
@@ -21,10 +20,13 @@
#include "cmd6.hpp"
#include "cmd7.hpp"
#include "corrupt.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.h"
#include "files.hpp"
+#include "game.hpp"
#include "generate.hpp"
#include "gen_evol.hpp"
#include "gods.hpp"
@@ -40,21 +42,23 @@
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "modules.hpp"
#include "notes.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "options.hpp"
#include "player_race.hpp"
+#include "player_race_flag.hpp"
#include "player_race_mod.hpp"
#include "player_spec.hpp"
#include "player_type.hpp"
#include "powers.hpp"
#include "quest.hpp"
-#include "quark.hpp"
#include "skills.hpp"
#include "spell_type.hpp"
#include "spells1.hpp"
@@ -130,7 +134,9 @@ static byte value_check_aux1(object_type const *o_ptr)
static byte value_check_aux1_magic(object_type const *o_ptr)
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto const &k_info = game->edit_data.k_info;
+
+ auto k_ptr = &k_info[o_ptr->k_idx];
switch (o_ptr->tval)
@@ -219,7 +225,9 @@ static byte value_check_aux2(object_type const *o_ptr)
static byte value_check_aux2_magic(object_type const *o_ptr)
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto const &k_info = game->edit_data.k_info;
+
+ auto k_ptr = &k_info[o_ptr->k_idx];
switch (o_ptr->tval)
@@ -284,7 +292,7 @@ static byte value_check_aux2_magic(object_type const *o_ptr)
/*
* Can a player be resurrected?
*/
-static bool_ granted_resurrection(void)
+static bool_ granted_resurrection()
{
if (praying_to(GOD_ERU))
{
@@ -321,7 +329,6 @@ static sense_function_t select_sense(object_type *o_ptr, sense_function_t combat
case TV_HARD_ARMOR:
case TV_DRAG_ARMOR:
case TV_BOOMERANG:
- case TV_TRAPKIT:
{
return combat;
}
@@ -473,7 +480,7 @@ void sense_objects(std::vector<int> const &object_idxs)
squeltch_inventory();
}
-void sense_inventory(void)
+void sense_inventory()
{
static std::vector<int> idxs;
// Initialize static vector if necessary
@@ -491,7 +498,7 @@ void sense_inventory(void)
/*
* Go to any level (ripped off from wiz_jump)
*/
-static void pattern_teleport(void)
+static void pattern_teleport()
{
/* Ask for level */
if (get_check("Teleport level? "))
@@ -544,27 +551,27 @@ static void pattern_teleport(void)
/*
* Returns TRUE if we are on the Straight Road...
*/
-static bool_ pattern_effect(void)
+static bool_ pattern_effect()
{
if ((cave[p_ptr->py][p_ptr->px].feat < FEAT_PATTERN_START) ||
(cave[p_ptr->py][p_ptr->px].feat > FEAT_PATTERN_XTRA2)) return (FALSE);
if (cave[p_ptr->py][p_ptr->px].feat == FEAT_PATTERN_END)
{
- (void)set_poisoned(0);
- (void)set_image(0);
- (void)set_stun(0);
- (void)set_cut(0);
- (void)set_blind(0);
- (void)set_afraid(0);
- (void)do_res_stat(A_STR, TRUE);
- (void)do_res_stat(A_INT, TRUE);
- (void)do_res_stat(A_WIS, TRUE);
- (void)do_res_stat(A_DEX, TRUE);
- (void)do_res_stat(A_CON, TRUE);
- (void)do_res_stat(A_CHR, TRUE);
- (void)restore_level();
- (void)hp_player(1000);
+ set_poisoned(0);
+ set_image(0);
+ set_stun(0);
+ set_cut(0);
+ set_blind(0);
+ set_afraid(0);
+ do_res_stat(A_STR, TRUE);
+ do_res_stat(A_INT, TRUE);
+ do_res_stat(A_WIS, TRUE);
+ do_res_stat(A_DEX, TRUE);
+ do_res_stat(A_CON, TRUE);
+ do_res_stat(A_CHR, TRUE);
+ restore_level();
+ hp_player(1000);
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_PATTERN_OLD);
msg_print("This section of the Straight Road looks less powerful.");
}
@@ -606,16 +613,14 @@ static bool_ pattern_effect(void)
*/
static void recharged_notice(object_type *o_ptr)
{
- char o_name[80];
-
- cptr s;
-
-
/* No inscription */
- if (!o_ptr->note) return;
+ if (o_ptr->inscription.empty())
+ {
+ return;
+ }
/* Find a '!' */
- s = strchr(quark_str(o_ptr->note), '!');
+ auto s = strchr(o_ptr->inscription.c_str(), '!');
/* Process notification request. */
while (s)
@@ -624,6 +629,7 @@ static void recharged_notice(object_type *o_ptr)
if (s[1] == '!')
{
/* Describe (briefly) */
+ char o_name[80];
object_desc(o_name, o_ptr, FALSE, 0);
/* Notify the player */
@@ -770,8 +776,10 @@ static void regenmana(int percent)
*
* XXX XXX XXX Should probably be done during monster turns.
*/
-static void regen_monsters(void)
+static void regen_monsters()
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, frac;
object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY];
@@ -779,7 +787,7 @@ static void regen_monsters(void)
if (o_ptr->k_idx)
{
- monster_race *r_ptr = &r_info[o_ptr->pval];
+ auto r_ptr = &r_info[o_ptr->pval];
/* Allow regeneration (if needed) */
if (o_ptr->pval2 < o_ptr->pval3)
@@ -791,7 +799,7 @@ static void regen_monsters(void)
if (!frac) frac = 1;
/* Hack -- Some monsters regenerate quickly */
- if (r_ptr->flags2 & (RF2_REGENERATE)) frac *= 2;
+ if (r_ptr->flags & RF_REGENERATE) frac *= 2;
/* Hack -- Regenerate */
@@ -828,7 +836,7 @@ static void regen_monsters(void)
/* Hack -- Some monsters regenerate quickly */
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags2 & (RF2_REGENERATE)) frac *= 2;
+ if (r_ptr->flags & RF_REGENERATE) frac *= 2;
/* Hack -- Regenerate */
m_ptr->hp += frac;
@@ -848,17 +856,10 @@ static void regen_monsters(void)
*
* Should belong to object1.c, renamed to object_decays() -- pelpel
*/
-static bool_ decays(object_type *o_ptr)
+static bool decays(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
-
- /* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- if (f3 & TR3_DECAY) return (TRUE);
-
- return (FALSE);
+ auto const flags = object_flags(o_ptr);
+ return bool(flags & TR_DECAY);
}
@@ -900,9 +901,11 @@ static void check_music()
*/
static void apply_effect(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
cave_type *c_ptr = &cave[y][x];
- feature_type *f_ptr = &f_info[c_ptr->feat];
+ auto f_ptr = &f_info[c_ptr->feat];
if (f_ptr->d_frequency[0] != 0)
@@ -963,7 +966,7 @@ static void process_world_corruptions()
}
else
{
- disturb(0);
+ disturb();
msg_print("Your corruption takes over you, you teleport!");
teleport_player(50);
}
@@ -1018,8 +1021,8 @@ static bool_ grace_delay_trigger()
*/
static void process_world_gods()
{
- const char *race_name = rp_ptr->title;
- const char *subrace_name = rmp_ptr->title;
+ auto const &race_name = rp_ptr->title;
+ auto const &subrace_name = rmp_ptr->title;
if (p_ptr->pgod == GOD_VARDA)
{
@@ -1031,10 +1034,10 @@ static void process_world_gods()
inc_piety(GOD_ALL, 2);
}
- if (streq(race_name, "Orc") ||
- streq(race_name, "Troll") ||
- streq(race_name, "Dragon") ||
- streq(race_name, "Demon"))
+ if ((race_name == "Orc") ||
+ (race_name == "Troll") ||
+ (race_name == "Dragon") ||
+ (race_name == "Demon"))
{
/* Varda hates evil races */
inc_piety(GOD_ALL, -2);
@@ -1057,16 +1060,16 @@ static void process_world_gods()
{
int i;
/* Ulmo likes the Edain (except Easterlings) */
- if (streq(race_name, "Human") ||
- streq(race_name, "Dunadan") ||
- streq(race_name, "Druadan") ||
- streq(race_name, "RohanKnight"))
+ if ((race_name == "Human") ||
+ (race_name == "Dunadan") ||
+ (race_name == "Druadan") ||
+ (race_name == "RohanKnight"))
{
inc_piety(GOD_ALL, 2);
}
- else if (streq(race_name, "Easterling") ||
- streq(race_name, "Demon") ||
- streq(race_name, "Orc"))
+ else if ((race_name == "Easterling") ||
+ (race_name == "Demon") ||
+ (race_name == "Orc"))
{
/* hated races */
inc_piety(GOD_ALL, -2);
@@ -1101,10 +1104,10 @@ static void process_world_gods()
/* Aule likes Dwarves and Dark Elves (Eol's
* influence here) */
- if (!(streq(race_name, "Dwarf") ||
- streq(race_name, "Petty-dwarf") ||
- streq(race_name, "Gnome") ||
- streq(race_name, "Dark-Elf")))
+ if (!((race_name == "Dwarf") ||
+ (race_name == "Petty-dwarf") ||
+ (race_name == "Gnome") ||
+ (race_name == "Dark-Elf")))
{
inc_piety(GOD_ALL, -1);
}
@@ -1180,20 +1183,20 @@ static void process_world_gods()
if (grace_delay_trigger())
{
/* He loves astral beings */
- if (streq(subrace_name, "LostSoul"))
+ if (subrace_name == "LostSoul")
{
inc_piety(GOD_ALL, 1);
}
/* He likes High Elves only, though, as races */
- if (!streq(race_name, "High-Elf"))
+ if (!(race_name == "High-Elf"))
{
inc_piety(GOD_ALL, -1);
}
/* Really hates vampires and demons */
- if (streq(subrace_name, "Vampire") ||
- streq(race_name, "Demon"))
+ if ((subrace_name == "Vampire") ||
+ (race_name == "Demon"))
{
inc_piety(GOD_ALL, -10);
}
@@ -1217,9 +1220,12 @@ static void process_world_gods()
* Note that a single movement in the overhead wilderness mode
* consumes 132 times as much energy as a normal one...
*/
-static void process_world(void)
+static void process_world()
{
- timer_type *t_ptr;
+ auto const &d_info = game->edit_data.d_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &f_info = game->edit_data.f_info;
+ auto &timers = game->timers;
int x, y, i, j;
@@ -1227,13 +1233,11 @@ static void process_world(void)
bool_ cave_no_regen = FALSE;
int upkeep_factor = 0;
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto d_ptr = &d_info[dungeon_type];
cave_type *c_ptr;
object_type *o_ptr;
- u32b f1 = 0 , f2 = 0 , f3 = 0, f4 = 0, f5 = 0, esp = 0;
-
/*
* Every 10 game turns -- which means this section is invoked once
@@ -1264,22 +1268,14 @@ static void process_world(void)
check_music();
}
- /* Handle the timers */
- for (t_ptr = gl_timers; t_ptr != NULL; t_ptr = t_ptr->next)
+ /* Process timers */
+ for (auto &&timer: timers)
{
- if (!t_ptr->enabled) continue;
-
- t_ptr->countdown--;
- if (!t_ptr->countdown)
- {
- t_ptr->countdown = t_ptr->delay;
- assert(t_ptr->callback != NULL);
- t_ptr->callback();
- }
+ timer->count_down();
}
/* Check the fate */
- if (fate_option && (p_ptr->lev > 10))
+ if (options->fate_option && (p_ptr->lev > 10))
{
/*
* WAS: == 666 against randint(50000).
@@ -1295,20 +1291,20 @@ static void process_world(void)
if (o_ptr->k_idx)
{
- monster_race *r_ptr = &r_info[o_ptr->pval];
+ auto r_ptr = &r_info[o_ptr->pval];
if ((randint(1000) < r_ptr->level - ((p_ptr->lev * 2) + get_skill(SKILL_SYMBIOTIC))))
{
msg_format("%s breaks free from hypnosis!",
- symbiote_name(TRUE));
+ symbiote_name(true).c_str());
carried_make_attack_normal(o_ptr->pval);
}
}
/*** Attempt timed autosave ***/
- if (autosave_t && autosave_freq)
+ if (options->autosave_t && options->autosave_freq)
{
- if ((turn % ((s32b)autosave_freq * 10)) == 0)
+ if ((turn % (static_cast<s32b>(options->autosave_freq) * 10)) == 0)
{
is_autosave = TRUE;
msg_print("Autosaving the game...");
@@ -1346,10 +1342,13 @@ static void process_world(void)
c_ptr = &cave[y][x];
/* Assume lit */
- c_ptr->info |= (CAVE_GLOW);
+ c_ptr->info |= CAVE_GLOW;
/* Hack -- Memorize lit grids if allowed */
- if (view_perma_grids) c_ptr->info |= (CAVE_MARK);
+ if (options->view_perma_grids)
+ {
+ c_ptr->info |= CAVE_MARK;
+ }
/* Hack -- Notice spot */
note_spot(y, x);
@@ -1403,9 +1402,9 @@ static void process_world(void)
(rand_int(d_info[(dun_level) ? dungeon_type : DUNGEON_WILDERNESS].max_m_alloc_chance) == 0))
{
/* Make a new monster */
- if (!(dungeon_flags2 & DF2_NO_NEW_MONSTER))
+ if (!(dungeon_flags & DF_NO_NEW_MONSTER))
{
- (void)alloc_monster(MAX_SIGHT + 5, FALSE);
+ alloc_monster(MAX_SIGHT + 5, FALSE);
}
}
@@ -1491,16 +1490,16 @@ static void process_world(void)
int feature = cave[p_ptr->py][p_ptr->px].feat;
/* Player can walk through or fly over trees */
- if ((has_ability(AB_TREE_WALK) || p_ptr->fly) && (feature == FEAT_TREES))
+ if ((p_ptr->has_ability(AB_TREE_WALK) || p_ptr->fly) && (feature == FEAT_TREES))
{
/* Do nothing */
}
/* Player can climb over mountains */
- else if ((p_ptr->climb) && (f_info[feature].flags1 & FF1_CAN_CLIMB))
+ else if ((p_ptr->climb) && (f_info[feature].flags & FF_CAN_CLIMB))
{
/* Do nothing */
}
- else if (race_flags1_p(PR1_SEMI_WRAITH) && (!p_ptr->wraith_form) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_CAN_PASS))
+ else if (race_flags_p(PR_SEMI_WRAITH) && (!p_ptr->wraith_form) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_CAN_PASS))
{
int amt = 1 + ((p_ptr->lev) / 5);
@@ -1581,10 +1580,10 @@ static void process_world(void)
o_ptr = &p_ptr->inventory[INVEN_WIELD];
/* Examine the sword */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hitpoints multiplier consume a lot of food */
- if (o_ptr->k_idx && (f2 & (TR2_LIFE))) i += o_ptr->pval * 5;
+ if (o_ptr->k_idx && (flags & TR_LIFE)) i += o_ptr->pval * 5;
/* Slow digestion takes less food */
if (p_ptr->slow_digest) i -= 10;
@@ -1593,7 +1592,7 @@ static void process_world(void)
if (i < 1) i = 1;
/* Digest some food */
- (void)set_food(p_ptr->food - i);
+ set_food(p_ptr->food - i);
}
}
@@ -1601,7 +1600,7 @@ static void process_world(void)
else
{
/* Digest a lot of food */
- (void)set_food(p_ptr->food - 100);
+ set_food(p_ptr->food - 100);
}
/* Starve to death (slowly) */
@@ -1642,10 +1641,10 @@ static void process_world(void)
{
/* Message */
msg_print("You faint from the lack of food.");
- disturb(1);
+ disturb();
/* Hack -- faint (bypass free action) */
- (void)set_paralyzed(1 + rand_int(5));
+ set_paralyzed(1 + rand_int(5));
}
}
}
@@ -1665,8 +1664,8 @@ static void process_world(void)
}
- /* Searching or Resting */
- if (p_ptr->searching || resting)
+ /* Resting boosts regeneration */
+ if (resting)
{
regen_amount = regen_amount * 2;
}
@@ -1675,7 +1674,7 @@ static void process_world(void)
{
int upkeep_divider = 20;
- if (has_ability(AB_PERFECT_CASTING))
+ if (p_ptr->has_ability(AB_PERFECT_CASTING))
upkeep_divider = 15;
if (total_friends > 1 + (p_ptr->lev / (upkeep_divider)))
@@ -1725,7 +1724,7 @@ static void process_world(void)
dec++;
}
- if (race_flags1_p(PR1_ELF))
+ if (race_flags_p(PR_ELF))
{
dec -= wisdom_scale(2);
}
@@ -1744,7 +1743,7 @@ static void process_world(void)
dec++;
}
- if (race_flags1_p(PR1_ELF))
+ if (race_flags_p(PR_ELF))
{
dec += 5 - wisdom_scale(4);
}
@@ -1769,7 +1768,7 @@ static void process_world(void)
int dec = 5 - wisdom_scale(3);
/* Blech what an hideous hack */
- if (!strcmp(rp_ptr->title, "Ent"))
+ if (!(rp_ptr->title == "Ent"))
{
dec -= wisdom_scale(2);
}
@@ -1833,26 +1832,26 @@ static void process_world(void)
/* Hack -- Hallucinating */
if (p_ptr->image)
{
- (void)set_image(p_ptr->image - 1);
+ set_image(p_ptr->image - 1);
}
/* Holy Aura */
if (p_ptr->holy)
{
- (void)set_holy(p_ptr->holy - 1);
+ set_holy(p_ptr->holy - 1);
}
/* Soul absorbtion */
if (p_ptr->absorb_soul)
{
- (void)set_absorb_soul(p_ptr->absorb_soul - 1);
+ set_absorb_soul(p_ptr->absorb_soul - 1);
}
/* Undead loose Death Points */
if (p_ptr->necro_extra & CLASS_UNDEAD)
{
int old_chp = p_ptr->chp;
- int warning = (p_ptr->mhp * hitpoint_warn / 10);
+ int warning = (p_ptr->mhp * options->hitpoint_warn / 10);
/* Bypass invulnerability and wraithform */
p_ptr->chp--;
@@ -1866,13 +1865,10 @@ static void process_world(void)
/* Dead player */
if (p_ptr->chp < 0)
{
- bool_ old_quick = quick_messages;
-
- /* Sound */
- sound(SOUND_DEATH);
+ bool_ old_quick = options->quick_messages;
/* Hack -- Note death */
- if (!last_words)
+ if (!options->last_words)
{
msg_print("You die.");
msg_print(NULL);
@@ -1881,14 +1877,16 @@ static void process_world(void)
{
char death_message[80];
- (void)get_rnd_line("death.txt", death_message);
+ get_rnd_line("death.txt", death_message);
msg_print(death_message);
}
- /* Note cause of death */
- (void)strcpy(died_from, "being undead too long");
-
- if (p_ptr->image) strcat(died_from, "(?)");
+ /* Note cause of death; hallucinating characters don't get to know. */
+ game->died_from = "being undead too long";
+ if (p_ptr->image)
+ {
+ game->died_from = "(?)";
+ }
/* No longer a winner */
total_winner = FALSE;
@@ -1899,12 +1897,12 @@ static void process_world(void)
/* Note death */
death = TRUE;
- quick_messages = FALSE;
+ options->quick_messages = FALSE;
if (get_check("Make a last screenshot? "))
{
do_cmd_html_dump();
}
- quick_messages = old_quick;
+ options->quick_messages = old_quick;
/* Dead */
return;
@@ -1914,9 +1912,10 @@ static void process_world(void)
if (p_ptr->chp < warning)
{
/* Hack -- bell on first notice */
- if (alert_hitpoint && (old_chp > warning)) bell();
-
- sound(SOUND_WARN);
+ if (old_chp > warning)
+ {
+ bell();
+ }
/* Message */
msg_print("*** LOW DEATHPOINT WARNING! ***");
@@ -1927,29 +1926,29 @@ static void process_world(void)
/* True Strike */
if (p_ptr->strike)
{
- (void)set_strike(p_ptr->strike - 1);
+ set_strike(p_ptr->strike - 1);
}
/* Timed project */
if (p_ptr->tim_project)
{
- (void)set_project(p_ptr->tim_project - 1, p_ptr->tim_project_gf, p_ptr->tim_project_dam, p_ptr->tim_project_rad, p_ptr->tim_project_flag);
+ set_project(p_ptr->tim_project - 1, p_ptr->tim_project_gf, p_ptr->tim_project_dam, p_ptr->tim_project_rad, p_ptr->tim_project_flag);
}
/* Timed roots */
if (p_ptr->tim_roots)
{
- (void)set_roots(p_ptr->tim_roots - 1, p_ptr->tim_roots_ac, p_ptr->tim_roots_dam);
+ set_roots(p_ptr->tim_roots - 1, p_ptr->tim_roots_ac, p_ptr->tim_roots_dam);
}
/* Timed breath */
if (p_ptr->tim_water_breath)
{
- (void)set_tim_breath(p_ptr->tim_water_breath - 1, FALSE);
+ set_tim_breath(p_ptr->tim_water_breath - 1, FALSE);
}
if (p_ptr->tim_magic_breath)
{
- (void)set_tim_breath(p_ptr->tim_magic_breath - 1, TRUE);
+ set_tim_breath(p_ptr->tim_magic_breath - 1, TRUE);
}
/* Timed precognition */
@@ -1961,41 +1960,41 @@ static void process_world(void)
/* Timed regen */
if (p_ptr->tim_regen)
{
- (void)set_tim_regen(p_ptr->tim_regen - 1, p_ptr->tim_regen_pow);
+ set_tim_regen(p_ptr->tim_regen - 1, p_ptr->tim_regen_pow);
}
/* Timed Disrupt shield */
if (p_ptr->disrupt_shield)
{
- (void)set_disrupt_shield(p_ptr->disrupt_shield - 1);
+ set_disrupt_shield(p_ptr->disrupt_shield - 1);
}
/* Timed Parasite */
if (p_ptr->parasite)
{
- (void)set_parasite(p_ptr->parasite - 1, p_ptr->parasite_r_idx);
+ set_parasite(p_ptr->parasite - 1, p_ptr->parasite_r_idx);
}
/* Timed Reflection */
if (p_ptr->tim_reflect)
{
- (void)set_tim_reflect(p_ptr->tim_reflect - 1);
+ set_tim_reflect(p_ptr->tim_reflect - 1);
}
/* Timed Prob Travel */
if (p_ptr->prob_travel)
{
- (void)set_prob_travel(p_ptr->prob_travel - 1);
+ set_prob_travel(p_ptr->prob_travel - 1);
}
/* Timed Levitation */
if (p_ptr->tim_ffall)
{
- (void)set_tim_ffall(p_ptr->tim_ffall - 1);
+ set_tim_ffall(p_ptr->tim_ffall - 1);
}
if (p_ptr->tim_fly)
{
- (void)set_tim_fly(p_ptr->tim_fly - 1);
+ set_tim_fly(p_ptr->tim_fly - 1);
}
/* Thunderstorm */
@@ -2037,37 +2036,37 @@ static void process_world(void)
PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE);
}
- (void)set_tim_thunder(p_ptr->tim_thunder - 1, p_ptr->tim_thunder_p1, p_ptr->tim_thunder_p2);
+ set_tim_thunder(p_ptr->tim_thunder - 1, p_ptr->tim_thunder_p1, p_ptr->tim_thunder_p2);
}
/* Poisonned hands */
if (p_ptr->tim_poison)
{
- (void)set_poison(p_ptr->tim_poison - 1);
+ set_poison(p_ptr->tim_poison - 1);
}
/* Brightness */
if (p_ptr->tim_lite)
{
- (void)set_lite(p_ptr->tim_lite - 1);
+ set_lite(p_ptr->tim_lite - 1);
}
/* Blindness */
if (p_ptr->blind)
{
- (void)set_blind(p_ptr->blind - 1);
+ set_blind(p_ptr->blind - 1);
}
/* Timed no_breeds */
if (no_breeds)
{
- (void)set_no_breeders(no_breeds - 1);
+ set_no_breeders(no_breeds - 1);
}
/* Timed mimic */
if (p_ptr->tim_mimic)
{
- (void)set_mimic(p_ptr->tim_mimic - 1, p_ptr->mimic_form, p_ptr->mimic_level);
+ set_mimic(p_ptr->tim_mimic - 1, p_ptr->mimic_form, p_ptr->mimic_level);
}
/* Timed special move commands */
@@ -2079,25 +2078,25 @@ static void process_world(void)
/* Timed invisibility */
if (p_ptr->tim_invisible)
{
- (void)set_invis(p_ptr->tim_invisible - 1, p_ptr->tim_inv_pow);
+ set_invis(p_ptr->tim_invisible - 1, p_ptr->tim_inv_pow);
}
/* Times see-invisible */
if (p_ptr->tim_invis)
{
- (void)set_tim_invis(p_ptr->tim_invis - 1);
+ set_tim_invis(p_ptr->tim_invis - 1);
}
/* Timed esp */
if (p_ptr->tim_esp)
{
- (void)set_tim_esp(p_ptr->tim_esp - 1);
+ set_tim_esp(p_ptr->tim_esp - 1);
}
/* Timed infra-vision */
if (p_ptr->tim_infra)
{
- (void)set_tim_infra(p_ptr->tim_infra - 1);
+ set_tim_infra(p_ptr->tim_infra - 1);
}
/* Paralysis */
@@ -2109,139 +2108,109 @@ static void process_world(void)
/* Confusion */
if (p_ptr->confused)
{
- (void)set_confused(p_ptr->confused - 1);
+ set_confused(p_ptr->confused - 1);
}
/* Afraid */
if (p_ptr->afraid)
{
- (void)set_afraid(p_ptr->afraid - 1);
+ set_afraid(p_ptr->afraid - 1);
}
/* Fast */
if (p_ptr->fast)
{
- (void)set_fast(p_ptr->fast - 1, p_ptr->speed_factor);
+ set_fast(p_ptr->fast - 1, p_ptr->speed_factor);
}
/* Light speed */
if (p_ptr->lightspeed)
{
- (void)set_light_speed(p_ptr->lightspeed - 1);
+ set_light_speed(p_ptr->lightspeed - 1);
}
/* Slow */
if (p_ptr->slow)
{
- (void)set_slow(p_ptr->slow - 1);
+ set_slow(p_ptr->slow - 1);
}
/* Protection from evil */
if (p_ptr->protevil)
{
- (void)set_protevil(p_ptr->protevil - 1);
- }
-
- /* Protection from good */
- if (p_ptr->protgood)
- {
- (void)set_protgood(p_ptr->protgood - 1);
- }
-
- /* Protection from undead */
- if (p_ptr->protundead)
- {
- (void)set_protundead(p_ptr->protundead - 1);
+ set_protevil(p_ptr->protevil - 1);
}
/* Invulnerability */
if (p_ptr->invuln)
{
- (void)set_invuln(p_ptr->invuln - 1);
+ set_invuln(p_ptr->invuln - 1);
}
/* Wraith form */
if (p_ptr->tim_wraith)
{
- (void)set_shadow(p_ptr->tim_wraith - 1);
+ set_shadow(p_ptr->tim_wraith - 1);
}
/* Heroism */
if (p_ptr->hero)
{
- (void)set_hero(p_ptr->hero - 1);
+ set_hero(p_ptr->hero - 1);
}
/* Super Heroism */
if (p_ptr->shero)
{
- (void)set_shero(p_ptr->shero - 1);
+ set_shero(p_ptr->shero - 1);
}
/* Blessed */
if (p_ptr->blessed)
{
- (void)set_blessed(p_ptr->blessed - 1);
+ set_blessed(p_ptr->blessed - 1);
}
/* Shield */
if (p_ptr->shield)
{
- (void)set_shield(p_ptr->shield - 1, p_ptr->shield_power, p_ptr->shield_opt, p_ptr->shield_power_opt, p_ptr->shield_power_opt2);
+ set_shield(p_ptr->shield - 1, p_ptr->shield_power, p_ptr->shield_opt, p_ptr->shield_power_opt, p_ptr->shield_power_opt2);
}
/* Oppose Acid */
if (p_ptr->oppose_acid)
{
- (void)set_oppose_acid(p_ptr->oppose_acid - 1);
+ set_oppose_acid(p_ptr->oppose_acid - 1);
}
/* Oppose Lightning */
if (p_ptr->oppose_elec)
{
- (void)set_oppose_elec(p_ptr->oppose_elec - 1);
+ set_oppose_elec(p_ptr->oppose_elec - 1);
}
/* Oppose Fire */
if (p_ptr->oppose_fire)
{
- (void)set_oppose_fire(p_ptr->oppose_fire - 1);
+ set_oppose_fire(p_ptr->oppose_fire - 1);
}
/* Oppose Cold */
if (p_ptr->oppose_cold)
{
- (void)set_oppose_cold(p_ptr->oppose_cold - 1);
+ set_oppose_cold(p_ptr->oppose_cold - 1);
}
/* Oppose Poison */
if (p_ptr->oppose_pois)
{
- (void)set_oppose_pois(p_ptr->oppose_pois - 1);
- }
-
- /* Oppose Light & Dark */
- if (p_ptr->oppose_ld)
- {
- (void)set_oppose_ld(p_ptr->oppose_ld - 1);
+ set_oppose_pois(p_ptr->oppose_pois - 1);
}
/* Oppose Chaos & Confusion */
if (p_ptr->oppose_cc)
{
- (void)set_oppose_cc(p_ptr->oppose_cc - 1);
- }
-
- /* Oppose Sound & Shards */
- if (p_ptr->oppose_ss)
- {
- (void)set_oppose_ss(p_ptr->oppose_ss - 1);
- }
-
- /* Oppose Nexus */
- if (p_ptr->oppose_nex)
- {
- (void)set_oppose_nex(p_ptr->oppose_nex - 1);
+ set_oppose_cc(p_ptr->oppose_cc - 1);
}
/* Timed mimicry */
@@ -2266,7 +2235,7 @@ static void process_world(void)
att &= ~(CLASS_LEGS);
att &= ~(CLASS_WALL);
- if (disturb_state) disturb(0);
+ disturb_on_state();
}
p_ptr->update |= (PU_BODY);
@@ -2283,7 +2252,7 @@ static void process_world(void)
int adjust = (adj_con_fix[p_ptr->stat_ind[A_CON]] + 1);
/* Apply some healing */
- (void)set_poisoned(p_ptr->poisoned - adjust);
+ set_poisoned(p_ptr->poisoned - adjust);
}
/* Stun */
@@ -2292,7 +2261,7 @@ static void process_world(void)
int adjust = (adj_con_fix[p_ptr->stat_ind[A_CON]] + 1);
/* Apply some healing */
- (void)set_stun(p_ptr->stun - adjust);
+ set_stun(p_ptr->stun - adjust);
}
/* Cut */
@@ -2304,7 +2273,7 @@ static void process_world(void)
if (p_ptr->cut > 1000) adjust = 0;
/* Apply some healing */
- (void)set_cut(p_ptr->cut - adjust);
+ set_cut(p_ptr->cut - adjust);
}
/* Hack - damage done by the dungeon -SC- */
@@ -2327,7 +2296,7 @@ static void process_world(void)
{
int l, dam = 0;
- if (!(dungeon_flags1 & DF1_DAMAGE_FEAT))
+ if (!(dungeon_flags & DF_DAMAGE_FEAT))
{
/* If the grid is empty, skip it */
if ((cave[j][k].o_idxs.empty()) &&
@@ -2560,14 +2529,14 @@ static void process_world(void)
}
/* Arg cannot breath? */
- if ((dungeon_flags2 & DF2_WATER_BREATH) && (!p_ptr->water_breath))
+ if ((dungeon_flags & DF_WATER_BREATH) && (!p_ptr->water_breath))
{
cmsg_print(TERM_L_RED, "You cannot breathe water! You suffocate!");
take_hit(damroll(3, p_ptr->lev), "suffocating");
}
- if ((dungeon_flags2 & DF2_NO_BREATH) && (!p_ptr->magical_breath))
+ if ((dungeon_flags & DF_NO_BREATH) && (!p_ptr->magical_breath))
{
- cmsg_print(TERM_L_RED, "There is no air there! You suffocate!");
+ cmsg_print(TERM_L_RED, "There is no air here! You suffocate!");
take_hit(damroll(3, p_ptr->lev), "suffocating");
}
@@ -2579,8 +2548,6 @@ static void process_world(void)
*/
if (((turn % 3000) == 0) && p_ptr->black_breath)
{
- u32b f1, f2, f3, f4, f5;
-
bool_ be_silent = FALSE;
/* check all equipment for the Black Breath flag. */
@@ -2592,10 +2559,10 @@ static void process_world(void)
if (!o_ptr->k_idx) continue;
/* Extract the item flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* No messages if object has the flag, to avoid annoyance. */
- if (f4 & (TR4_BLACK_BREATH)) be_silent = TRUE;
+ if (flags & TR_BLACK_BREATH) be_silent = TRUE;
}
/* If we are allowed to speak, warn and disturb. */
@@ -2603,7 +2570,7 @@ static void process_world(void)
if (!be_silent)
{
cmsg_print(TERM_L_DARK, "The Black Breath saps your soul!");
- disturb(0);
+ disturb();
}
}
@@ -2617,10 +2584,10 @@ static void process_world(void)
if (o_ptr->tval == TV_LITE)
{
/* Extract the item flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack -- Use some fuel */
- if ((f4 & TR4_FUEL_LITE) && (o_ptr->timeout > 0))
+ if ((flags & TR_FUEL_LITE) && (o_ptr->timeout > 0))
{
/* Decrease life-span */
o_ptr->timeout--;
@@ -2642,14 +2609,17 @@ static void process_world(void)
/* The light is now out */
else if (o_ptr->timeout < 1)
{
- disturb(0);
+ disturb();
cmsg_print(TERM_YELLOW, "Your light has gone out!");
}
/* The light is getting dim */
else if ((o_ptr->timeout < 100) && (o_ptr->timeout % 10 == 0))
{
- if (disturb_minor) disturb(0);
+ if (options->disturb_minor)
+ {
+ disturb();
+ }
cmsg_print(TERM_YELLOW, "Your light is growing faint.");
}
}
@@ -2671,14 +2641,14 @@ static void process_world(void)
byte chance = 0;
int plev = p_ptr->lev;
- if (race_flags1_p(PR1_RESIST_BLACK_BREATH)) chance = 2;
+ if (race_flags_p(PR_RESIST_BLACK_BREATH)) chance = 2;
else chance = 5;
if ((rand_int(100) < chance) && (p_ptr->exp > 0))
{
p_ptr->exp -= 1 + plev / 5;
p_ptr->max_exp -= 1 + plev / 5;
- (void)do_dec_stat(rand_int(6), STAT_DEC_NORMAL);
+ do_dec_stat(rand_int(6), STAT_DEC_NORMAL);
check_experience();
}
}
@@ -2692,7 +2662,7 @@ static void process_world(void)
if (p_ptr->csp < 0)
{
p_ptr->csp = 0;
- disturb(0);
+ disturb();
}
/* Redraw */
@@ -2711,7 +2681,7 @@ static void process_world(void)
if (p_ptr->csp < 0)
{
p_ptr->csp = 0;
- disturb(0);
+ disturb();
p_ptr->maintain_sum = 0;
}
@@ -2738,7 +2708,7 @@ static void process_world(void)
if (p_ptr->chp == 0)
{
- disturb(0);
+ disturb();
}
/* Redraw */
@@ -2766,17 +2736,17 @@ static void process_world(void)
/* Get the object */
o_ptr = &p_ptr->inventory[i];
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* TY Curse */
- if ((f3 & TR3_TY_CURSE) && (rand_int(TY_CURSE_CHANCE) == 0))
+ if ((flags & TR_TY_CURSE) && (rand_int(TY_CURSE_CHANCE) == 0))
{
activate_ty_curse();
}
/* DG Curse */
- if ((f4 & TR4_DG_CURSE) && (rand_int(DG_CURSE_CHANCE) == 0))
+ if ((flags & TR_DG_CURSE) && (rand_int(DG_CURSE_CHANCE) == 0))
{
activate_dg_curse();
@@ -2785,7 +2755,7 @@ static void process_world(void)
}
/* Auto Curse */
- if ((f3 & TR3_AUTO_CURSE) && (rand_int(AUTO_CURSE_CHANCE) == 0))
+ if ((flags & TR_AUTO_CURSE) && (rand_int(AUTO_CURSE_CHANCE) == 0))
{
/* The object recurse itself ! */
o_ptr->ident |= IDENT_CURSED;
@@ -2795,26 +2765,24 @@ static void process_world(void)
* Hack: Uncursed teleporting items (e.g. Dragon Weapons)
* can actually be useful!
*/
- if ((f3 & TR3_TELEPORT) && (rand_int(100) < 1))
+ if ((flags & TR_TELEPORT) && (rand_int(100) < 1))
{
if ((o_ptr->ident & IDENT_CURSED) && !p_ptr->anti_tele)
{
- disturb(0);
+ disturb();
/* Teleport player */
teleport_player(40);
}
else
{
- if (p_ptr->wild_mode ||
- (o_ptr->note && strchr(quark_str(o_ptr->note), '.')))
+ if (p_ptr->wild_mode || strchr(o_ptr->inscription.c_str(), '.'))
{
- /* Do nothing */
- /* msg_print("Teleport aborted.") */;
+ /* Suppress teleportation */
}
else if (get_check("Teleport? "))
{
- disturb(0);
+ disturb();
teleport_player(50);
}
}
@@ -2825,7 +2793,7 @@ static void process_world(void)
if (!o_ptr->k_idx) continue;
/* Hack: Skip wielded lights that need fuel (already handled above) */
- if ((i == INVEN_LITE) && (o_ptr->tval == TV_LITE) && (f4 & TR4_FUEL_LITE)) continue;
+ if ((i == INVEN_LITE) && (o_ptr->tval == TV_LITE) && (flags & TR_FUEL_LITE)) continue;
/* Recharge activatable objects */
if (o_ptr->timeout > 0)
@@ -2840,16 +2808,6 @@ static void process_world(void)
j++;
}
}
-
- /* Recharge second spell in Mage Staffs of Spells */
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL) && (o_ptr->xtra2 > 0))
- {
- /* Recharge */
- o_ptr->xtra2--;
-
- /* Notice changes */
- if (o_ptr->xtra2 == 0) j++;
- }
}
/* Notice changes */
@@ -2868,10 +2826,10 @@ static void process_world(void)
if (!o_ptr->k_idx) continue;
/* Examine the rod */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Temporary items are destroyed */
- if (f5 & TR5_TEMPORARY)
+ if (flags & TR_TEMPORARY)
{
o_ptr->timeout--;
@@ -2888,7 +2846,7 @@ static void process_world(void)
if ((o_ptr->tval == TV_ROD_MAIN) && (o_ptr->timeout < o_ptr->pval2))
{
/* Increase the rod's mana. */
- o_ptr->timeout += (f4 & TR4_CHARGING) ? 2 : 1;
+ o_ptr->timeout += (flags & TR_CHARGING) ? 2 : 1;
/* Always notice */
j++;
@@ -2902,7 +2860,7 @@ static void process_world(void)
}
/* Examine all charging random artifacts */
- if ((f5 & TR5_ACTIVATE_NO_WIELD) && (o_ptr->timeout > 0))
+ if ((flags & TR_ACTIVATE_NO_WIELD) && (o_ptr->timeout > 0))
{
/* Charge it */
o_ptr->timeout--;
@@ -2923,11 +2881,11 @@ static void process_world(void)
{
if (o_ptr->timeout > 0)
{
- if (dungeon_flags1 & DF1_HOT)
+ if (dungeon_flags & DF_HOT)
{
o_ptr->pval -= 2;
}
- else if ((dungeon_flags1 & DF1_COLD) && rand_int(2))
+ else if ((dungeon_flags & DF_COLD) && rand_int(2))
{
if (magik(50)) o_ptr->pval--;
}
@@ -2967,7 +2925,7 @@ static void process_world(void)
monster_type *m_ptr = &m_list[cave[my][mx].m_idx];
auto const r_ptr = m_ptr->race();
- if ((r_ptr->flags9 & RF9_IMPRESED) && can_create_companion())
+ if ((r_ptr->flags & RF_IMPRESED) && can_create_companion())
{
msg_format("And you have given the imprint to your %s!", r_ptr->name);
m_ptr->status = MSTATUS_COMPANION;
@@ -3003,10 +2961,10 @@ static void process_world(void)
if (!o_ptr->k_idx) continue;
/* Examine the rod */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Temporary items are destroyed */
- if (f5 & TR5_TEMPORARY)
+ if (flags & TR_TEMPORARY)
{
o_ptr->timeout--;
@@ -3024,7 +2982,7 @@ static void process_world(void)
if ((o_ptr->tval == TV_ROD_MAIN) && (o_ptr->timeout < o_ptr->pval2))
{
/* Increase the rod's mana. */
- o_ptr->timeout += (f4 & TR4_CHARGING) ? 2 : 1;
+ o_ptr->timeout += (flags & TR_CHARGING) ? 2 : 1;
/* Do not overflow */
if (o_ptr->timeout >= o_ptr->pval2)
@@ -3041,11 +2999,11 @@ static void process_world(void)
{
if (o_ptr->timeout > 0)
{
- if (dungeon_flags1 & DF1_HOT)
+ if (dungeon_flags & DF_HOT)
{
o_ptr->pval -= 2;
}
- else if ((dungeon_flags1 & DF1_COLD) && rand_int(2))
+ else if ((dungeon_flags & DF_COLD) && rand_int(2))
{
if (magik(50)) o_ptr->pval--;
}
@@ -3099,7 +3057,7 @@ static void process_world(void)
}
/* No recall. sorry */
- else if (dungeon_flags2 & DF2_NO_RECALL_OUT)
+ else if (dungeon_flags & DF_NO_RECALL_OUT)
{
cmsg_print(TERM_L_DARK, "You cannot recall from here.");
p_ptr->word_recall = 0;
@@ -3147,7 +3105,7 @@ static void process_world(void)
if (p_ptr->word_recall == 0)
{
/* Disturbing! */
- disturb(0);
+ disturb();
/* Determine the level */
if (p_ptr->inside_quest)
@@ -3186,9 +3144,6 @@ static void process_world(void)
p_ptr->leaving = TRUE;
p_ptr->wild_mode = FALSE;
}
-
- /* Sound */
- sound(SOUND_TPLEVEL);
}
}
}
@@ -3198,7 +3153,7 @@ static void process_world(void)
/*
* Verify use of "wizard" mode
*/
-static bool_ enter_wizard_mode(void)
+static bool_ enter_wizard_mode()
{
/* Ask first time, but not while loading a dead char with the -w option */
if (!noscore && !(p_ptr->chp < 0))
@@ -3226,7 +3181,7 @@ static bool_ enter_wizard_mode(void)
/*
* Verify use of "debug" commands
*/
-static bool_ enter_debug_mode(void)
+static bool_ enter_debug_mode()
{
/* Ask first time */
if (!noscore && !wizard)
@@ -3257,8 +3212,10 @@ static bool_ enter_debug_mode(void)
*
* XXX XXX XXX Make some "blocks"
*/
-static void process_command(void)
+static void process_command()
{
+ auto const &wf_info = game->edit_data.wf_info;
+
char error_m[80];
/* Handle repeating the last command */
@@ -3412,7 +3369,7 @@ static void process_command(void)
{
if (do_control_walk()) break;
- do_cmd_walk(always_pickup, TRUE);
+ do_cmd_walk(options->always_pickup);
break;
}
@@ -3422,7 +3379,7 @@ static void process_command(void)
{
if (do_control_walk()) break;
- do_cmd_walk(!always_pickup, TRUE);
+ do_cmd_walk(!options->always_pickup);
break;
}
@@ -3442,7 +3399,7 @@ static void process_command(void)
case ',':
{
if (do_control_pickup()) break;
- do_cmd_stay(always_pickup);
+ do_cmd_stay(options->always_pickup);
break;
}
@@ -3450,7 +3407,7 @@ static void process_command(void)
case 'g':
{
if (p_ptr->control) break;
- do_cmd_stay(!always_pickup);
+ do_cmd_stay(!options->always_pickup);
break;
}
@@ -3462,23 +3419,6 @@ static void process_command(void)
break;
}
- /* Search for traps/doors */
- case 's':
- {
- if (p_ptr->control) break;
- do_cmd_search();
- break;
- }
-
- /* Toggle search mode */
- case 'S':
- {
- if (p_ptr->control) break;
- do_cmd_toggle_search();
- break;
- }
-
-
/*** Stairs and Doors and Chests and Traps ***/
/* Enter store */
@@ -3492,16 +3432,8 @@ static void process_command(void)
/* Go up staircase */
case '<':
{
- object_type *o_ptr;
- u32b f1 = 0 , f2 = 0 , f3 = 0, f4 = 0, f5 = 0, esp = 0;
-
-
- /* Check for light being wielded */
- o_ptr = &p_ptr->inventory[INVEN_LITE];
- /* Burn some fuel in the current lite */
- if (o_ptr->tval == TV_LITE)
- /* Extract the item flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ /* Get the light being wielded */
+ auto o_ptr = &p_ptr->inventory[INVEN_LITE];
/* Cannot move if rooted in place */
if (p_ptr->tim_roots) break;
@@ -3572,8 +3504,9 @@ static void process_command(void)
/* Special cases */
else
{
- if ((wf_info[wild_map[p_ptr->py][p_ptr->px].feat].entrance >= 1000) ||
- (wild_map[p_ptr->py][p_ptr->px].entrance > 1000))
+ auto const &wilderness = game->wilderness;
+ auto const &tile = wilderness(p_ptr->px, p_ptr->py);
+ if ((wf_info[tile.feat].entrance >= 1000) || (tile.entrance > 1000))
{
p_ptr->wilderness_x = p_ptr->px;
p_ptr->wilderness_y = p_ptr->py;
@@ -3650,15 +3583,6 @@ static void process_command(void)
break;
}
- /* Disarm a trap or chest */
- case 'D':
- {
- if (p_ptr->control) break;
- if (!p_ptr->wild_mode) do_cmd_disarm();
- break;
- }
-
-
/*** Magic and Prayers ***/
/* Interact with skills */
@@ -3924,7 +3848,7 @@ static void process_command(void)
if (p_ptr->control) break;
if (p_ptr->wild_mode) break;
- if (race_flags1_p(PR1_NO_GOD))
+ if (race_flags_p(PR_NO_GOD))
{
msg_print("You cannot worship gods.");
}
@@ -4186,12 +4110,7 @@ static void process_command(void)
do_cmd_macro_recorder();
break;
}
- case CMD_BLUNDER:
- {
- if (do_control_walk()) break;
- do_cmd_walk(always_pickup, FALSE);
- break;
- }
+
/* Hack -- Unknown command */
default:
{
@@ -4201,7 +4120,6 @@ static void process_command(void)
if (rand_int(100) < insanity)
{
get_rnd_line("error.txt", error_m);
- sound(SOUND_ILLEGAL);
msg_print(error_m);
}
else
@@ -4224,8 +4142,11 @@ static void process_command(void)
* must come first just in case somebody manages to corrupt
* the savefiles by clever use of menu commands or something.
*/
-static void process_player(void)
+static void process_player()
{
+ auto const &f_info = game->edit_data.f_info;
+ auto const &k_info = game->edit_data.k_info;
+
int i, j;
int speed_use;
@@ -4266,7 +4187,7 @@ static void process_player(void)
/* Stop resting */
if ((p_ptr->chp == p_ptr->mhp) && (p_ptr->csp >= p_ptr->msp))
{
- disturb(0);
+ disturb();
}
}
@@ -4297,14 +4218,14 @@ static void process_player(void)
if (stop)
{
- disturb(0);
+ disturb();
}
p_ptr->redraw |= (PR_FRAME);
}
}
/* Handle "abort" */
- if (!avoid_abort)
+ if (!options->avoid_abort)
{
/* Check for "player abort" (semi-efficiently for resting) */
if (running || command_rep || (resting && !(resting & 0x0F)))
@@ -4316,7 +4237,7 @@ static void process_player(void)
flush();
/* Disturb */
- disturb(0);
+ disturb();
/* Hack -- Show a Message */
msg_print("Cancelled.");
@@ -4344,14 +4265,17 @@ static void process_player(void)
/* Hack -- mark current wilderness location as known */
if (!p_ptr->wild_mode && dun_level == 0)
- wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].known = TRUE;
+ {
+ auto &wilderness = game->wilderness;
+ wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).known = TRUE;
+ }
/* Place the cursor on the player */
move_cursor_relative(p_ptr->py, p_ptr->px);
/* Refresh (optional) */
- if (fresh_before) Term_fresh();
+ if (options->fresh_before) Term_fresh();
/* Hack -- Pack Overflow */
if (p_ptr->inventory[INVEN_PACK].k_idx)
@@ -4366,7 +4290,7 @@ static void process_player(void)
o_ptr = &p_ptr->inventory[item];
/* Disturbing */
- disturb(0);
+ disturb();
/* Warning */
msg_print("Your pack overflows!");
@@ -4494,7 +4418,7 @@ static void process_player(void)
/* Shimmer monsters if needed */
- if (!avoid_other && shimmer_monsters)
+ if (!options->avoid_other && shimmer_monsters)
{
/* Clear the flag */
shimmer_monsters = FALSE;
@@ -4512,7 +4436,7 @@ static void process_player(void)
auto const r_ptr = m_ptr->race();
/* Skip non-multi-hued monsters */
- if (!(r_ptr->flags1 & (RF1_ATTR_MULTI))) continue;
+ if (!(r_ptr->flags & RF_ATTR_MULTI)) continue;
/* Reset the flag */
shimmer_monsters = TRUE;
@@ -4523,7 +4447,7 @@ static void process_player(void)
}
/* Shimmer objects if needed and requested */
- if (!avoid_other && !avoid_shimmer && shimmer_objects)
+ if (!options->avoid_other && !options->avoid_shimmer && shimmer_objects)
{
/* Clear the flag */
shimmer_objects = FALSE;
@@ -4533,13 +4457,13 @@ static void process_player(void)
{
/* Acquire object -- for speed only base items are allowed to shimmer */
object_type *o_ptr = &o_list[i];
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Skip dead or carried objects */
if ((!o_ptr->k_idx) || (!o_ptr->ix)) continue;
/* Skip non-multi-hued monsters */
- if (!(k_ptr->flags5 & (TR5_ATTR_MULTI))) continue;
+ if (!(k_ptr->flags & TR_ATTR_MULTI)) continue;
/* Reset the flag */
shimmer_objects = TRUE;
@@ -4559,7 +4483,7 @@ static void process_player(void)
* fast, and that's why shimmering has been limited to small
* number of monsters -- pelpel
*/
- if (!avoid_other && !avoid_shimmer &&
+ if (!options->avoid_other && !options->avoid_shimmer &&
!resting && !running)
{
for (j = panel_row_min; j <= panel_row_max; j++)
@@ -4567,21 +4491,16 @@ static void process_player(void)
for (i = panel_col_min; i <= panel_col_max; i++)
{
cave_type *c_ptr = &cave[j][i];
- feature_type *f_ptr;
+ auto f_ptr = c_ptr->mimic
+ ? &f_info[c_ptr->mimic]
+ : &f_info[f_info[c_ptr->feat].mimic];
- /* Apply terrain feature mimics */
- if (c_ptr->mimic)
- {
- f_ptr = &f_info[c_ptr->mimic];
- }
- else
+ /* Skip normal features */
+ if (!(f_ptr->flags & FF_ATTR_MULTI))
{
- f_ptr = &f_info[f_info[c_ptr->feat].mimic];
+ continue;
}
- /* Skip normal features */
- if (!(f_ptr->flags1 & (FF1_ATTR_MULTI))) continue;
-
/* Redraw a shimmering spot */
lite_spot(j, i);
}
@@ -4652,7 +4571,7 @@ static void process_player(void)
*
* Forget everything when requested hehe I'm *NASTY*
*/
- if (dun_level && (dungeon_flags1 & DF1_FORGET))
+ if (dun_level && (dungeon_flags & DF_FORGET))
{
wiz_dark();
}
@@ -4675,8 +4594,10 @@ static void process_player(void)
* This function will not exit until the level is completed,
* the user dies, or the game is terminated.
*/
-static void dungeon(void)
+static void dungeon()
{
+ auto const &d_info = game->edit_data.d_info;
+
/* Reset various flags */
hack_mind = FALSE;
@@ -4707,7 +4628,7 @@ static void dungeon(void)
/* Disturb */
- disturb(1);
+ disturb();
/* Track maximum player level */
if (p_ptr->max_plv < p_ptr->lev)
@@ -4733,12 +4654,12 @@ static void dungeon(void)
if (!dun_level) create_down_shaft = create_up_shaft = FALSE;
/* Option -- no connected stairs */
- if (!dungeon_stair) create_down_stair = create_up_stair = FALSE;
- if (!dungeon_stair) create_down_shaft = create_up_shaft = FALSE;
+ if (!options->dungeon_stair) create_down_stair = create_up_stair = FALSE;
+ if (!options->dungeon_stair) create_down_shaft = create_up_shaft = FALSE;
/* no connecting stairs on special levels */
- if (!(dungeon_flags2 & DF2_NO_STAIR)) create_down_stair = create_up_stair = FALSE;
- if (!(dungeon_flags2 & DF2_NO_STAIR)) create_down_shaft = create_up_shaft = FALSE;
+ if (!(dungeon_flags & DF_NO_STAIR)) create_down_stair = create_up_stair = FALSE;
+ if (!(dungeon_flags & DF_NO_STAIR)) create_down_shaft = create_up_shaft = FALSE;
/* Make a stairway. */
if ((create_up_stair || create_down_stair ||
@@ -4754,19 +4675,19 @@ static void dungeon(void)
/* Make stairs */
if (create_down_stair)
{
- cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_MORE);
+ cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_MORE);
}
else if (create_down_shaft)
{
- cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN);
+ cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN);
}
else if (create_up_shaft)
{
- cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP);
+ cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP);
}
else
{
- cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_LESS);
+ cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_LESS);
}
}
@@ -4941,7 +4862,7 @@ static void dungeon(void)
move_cursor_relative(p_ptr->py, p_ptr->px);
/* Optional fresh */
- if (fresh_after) Term_fresh();
+ if (options->fresh_after) Term_fresh();
/* Hack -- Notice death or departure */
if (!alive || death) break;
@@ -4969,7 +4890,7 @@ static void dungeon(void)
move_cursor_relative(p_ptr->py, p_ptr->px);
/* Optional fresh */
- if (fresh_after) Term_fresh();
+ if (options->fresh_after) Term_fresh();
/* Hack -- Notice death or departure */
if (!alive || death) break;
@@ -4982,7 +4903,7 @@ static void dungeon(void)
process_hooks_new(HOOK_END_TURN, NULL, NULL);
/* Make it pulsate and live !!!! */
- if ((dungeon_flags1 & DF1_EVOLVE) && dun_level)
+ if ((dungeon_flags & DF_EVOLVE) && dun_level)
{
if (!(turn % 10)) evolve_level(TRUE);
}
@@ -5003,7 +4924,7 @@ static void dungeon(void)
move_cursor_relative(p_ptr->py, p_ptr->px);
/* Optional fresh */
- if (fresh_after) Term_fresh();
+ if (options->fresh_after) Term_fresh();
/* Hack -- Notice death or departure */
if (!alive || death) break;
@@ -5051,13 +4972,14 @@ static void dungeon(void)
/*
* Load some "user pref files"
*/
-static void load_all_pref_files(void)
+static void load_all_pref_files()
{
char buf[1024];
+ std::string const &player_name = game->player_name;
/* Access the "race" pref file */
- sprintf(buf, "%s.prf", rp_ptr->title);
+ sprintf(buf, "%s.prf", rp_ptr->title.c_str());
/* Process that file */
process_pref_file(buf);
@@ -5069,7 +4991,7 @@ static void load_all_pref_files(void)
process_pref_file(buf);
/* Access the "character" pref file */
- sprintf(buf, "%s.prf", player_name);
+ sprintf(buf, "%s.prf", player_name.c_str());
/* Process that file */
process_pref_file(buf);
@@ -5080,7 +5002,7 @@ static void load_all_pref_files(void)
* the providence of rules and such to avoid the same
* duplication problems as caused when saving macros/keymaps. */
boost::filesystem::path userDirectory(ANGBAND_DIR_USER);
- if (automatizer_load(userDirectory / (std::string(player_name) + ".atm")))
+ if (automatizer_load(userDirectory / (player_name + ".atm")))
{
// Done
}
@@ -5092,13 +5014,11 @@ static void load_all_pref_files(void)
/*
* Actually play a game
- *
- * If the "new_game" parameter is true, then, after loading the
- * savefile, we will commit suicide, if necessary, to allow the
- * player to start a new game.
*/
-void play_game(bool_ new_game)
+void play_game()
{
+ auto const &d_info = game->edit_data.d_info;
+
int i, tmp_dun;
bool_ cheat_death = FALSE;
@@ -5126,10 +5046,11 @@ void play_game(bool_ new_game)
/* Hack -- turn off the cursor */
- (void)Term_set_cursor(0);
+ Term_set_cursor(0);
/* Character list */
- if (!new_game && !no_begin_screen) new_game = begin_screen();
+ bool_ new_game = FALSE;
+ if (!no_begin_screen) new_game = begin_screen();
no_begin_screen = FALSE;
/* Attempt to load */
@@ -5148,20 +5069,6 @@ void play_game(bool_ new_game)
/* The dungeon is not ready */
character_dungeon = FALSE;
}
- else
- {
- int i;
-
- /* Init new skills to their defaults */
- for (i = old_max_s_idx; i < max_s_idx; i++)
- {
- s32b value = 0, mod = 0;
-
- compute_skills(&value, &mod, i);
-
- init_skill(value, mod, i);
- }
- }
/* Process old character */
if (!new_game)
@@ -5170,52 +5077,8 @@ void play_game(bool_ new_game)
process_player_name(FALSE);
}
- /* Init the RNG */
- if (Rand_quick)
- {
- u32b seed;
-
- /* Basic seed */
- seed = (time(NULL));
-
-#ifdef SET_UID
-
- /* Mutate the seed on Unix machines */
- seed = ((seed >> 3) * (getpid() << 1));
-
-#endif
-
- /* Use the complex RNG */
- Rand_quick = FALSE;
-
- /* Seed the "complex" RNG */
- Rand_state_init(seed);
- }
-
- /* Extract the options */
- for (i = 0; option_info[i].o_desc; i++)
- {
- int os = option_info[i].o_page;
- int ob = option_info[i].o_bit;
-
- /* Set the "default" options */
- if (option_info[i].o_var)
- {
- /* Set */
- if (option_flag[os] & (1L << ob))
- {
- /* Set */
- (*option_info[i].o_var) = TRUE;
- }
-
- /* Clear */
- else
- {
- /* Clear */
- (*option_info[i].o_var) = FALSE;
- }
- }
- }
+ /* Force "complex" RNG */
+ set_complex_rng();
/* Roll new character */
if (new_game)
@@ -5226,8 +5089,8 @@ void play_game(bool_ new_game)
/* The dungeon is not ready */
character_dungeon = FALSE;
- /* Hack -- seed for flavors */
- seed_flavor = rand_int(0x10000000);
+ /* Set the seed for flavors */
+ seed_flavor() = seed_t::system();
/* Roll up a new character */
player_birth();
@@ -5239,7 +5102,7 @@ void play_game(bool_ new_game)
/* Hack -- enter the world */
/* Mega-hack Vampires and Spectres start at midnight */
- if (race_flags1_p(PR1_UNDEAD))
+ if (race_flags_p(PR_UNDEAD))
{
turn = (10L * DAY / 2) + 1;
}
@@ -5283,8 +5146,8 @@ void play_game(bool_ new_game)
load_all_pref_files();
/* Set or clear "rogue_like_commands" if requested */
- if (arg_force_original) rogue_like_commands = FALSE;
- if (arg_force_roguelike) rogue_like_commands = TRUE;
+ if (arg_force_original) options->rogue_like_commands = FALSE;
+ if (arg_force_roguelike) options->rogue_like_commands = TRUE;
/* Initialize vault info */
if (init_v_info()) quit("Cannot initialize vaults");
@@ -5460,16 +5323,10 @@ void play_game(bool_ new_game)
}
/* Cheat death option */
- else if ((wizard || cheat_live) && !get_check("Die? "))
+ else if ((wizard || options->cheat_live) && !get_check("Die? "))
{
cheat_death = TRUE;
- /* Mark social class, reset age, if needed */
- if (p_ptr->sc) p_ptr->sc = p_ptr->age = 0;
-
- /* Increase age */
- p_ptr->age++;
-
/* Mark savefile */
noscore |= 0x0001;
msg_print("You invoke wizard mode and cheat death.");
@@ -5497,14 +5354,14 @@ void play_game(bool_ new_game)
p_ptr->csp_frac = 0;
/* Hack -- Healing */
- (void)set_blind(0);
- (void)set_confused(0);
- (void)set_poisoned(0);
- (void)set_afraid(0);
- (void)set_paralyzed(0);
- (void)set_image(0);
- (void)set_stun(0);
- (void)set_cut(0);
+ set_blind(0);
+ set_confused(0);
+ set_poisoned(0);
+ set_afraid(0);
+ set_paralyzed(0);
+ set_image(0);
+ set_stun(0);
+ set_cut(0);
/* accounting for a new ailment. -LM- */
p_ptr->black_breath = FALSE;
@@ -5513,7 +5370,7 @@ void play_game(bool_ new_game)
p_ptr->necro_extra &= ~CLASS_UNDEAD;
/* Hack -- Prevent starvation */
- (void)set_food(PY_FOOD_MAX - 1);
+ set_food(PY_FOOD_MAX - 1);
/* Hack -- cancel recall */
if (p_ptr->word_recall)
@@ -5526,8 +5383,8 @@ void play_game(bool_ new_game)
p_ptr->word_recall = 0;
}
- /* Note cause of death XXX XXX XXX */
- (void)strcpy(died_from, "Cheating death");
+ /* Note cause of death */
+ game->died_from = "Cheating death";
/* Do not die */
death = FALSE;
diff --git a/src/dungeon.h b/src/dungeon.h
index 1ce166d1..b5a81a59 100644
--- a/src/dungeon.h
+++ b/src/dungeon.h
@@ -1,13 +1,11 @@
#pragma once
-#include "h-basic.h"
-
// C linkage required for these functions since main-* code uses them.
#ifdef __cplusplus
extern "C" {
#endif
-extern void play_game(bool_ new_game);
+void play_game();
#ifdef __cplusplus
} // extern "C"
diff --git a/src/dungeon.hpp b/src/dungeon.hpp
index bbe6da87..e14f4a12 100644
--- a/src/dungeon.hpp
+++ b/src/dungeon.hpp
@@ -2,5 +2,5 @@
#include <vector>
-extern void sense_inventory();
-extern void sense_objects(std::vector<int> const &object_idxs);
+void sense_inventory();
+void sense_objects(std::vector<int> const &object_idxs);
diff --git a/src/dungeon_flag.hpp b/src/dungeon_flag.hpp
new file mode 100644
index 00000000..bf8d77d8
--- /dev/null
+++ b/src/dungeon_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "dungeon_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define DF(tier, index, name) \
+ DECLARE_FLAG(dungeon_flag_set, BOOST_PP_CAT(DF_,name), tier, index)
+#include "dungeon_flag_list.hpp"
+#undef DF
diff --git a/src/dungeon_flag_list.hpp b/src/dungeon_flag_list.hpp
new file mode 100644
index 00000000..8fdefc95
--- /dev/null
+++ b/src/dungeon_flag_list.hpp
@@ -0,0 +1,55 @@
+/**
+ * X-macro list of all the dungeon flags
+ */
+
+/* DF(<tier>, <index>, <name>) */
+DF(1, 0, PRINCIPAL)
+DF(1, 1, MAZE)
+DF(1, 2, SMALLEST)
+DF(1, 3, SMALL)
+DF(1, 4, BIG)
+DF(1, 5, NO_DOORS)
+DF(1, 6, WATER_RIVER)
+DF(1, 7, LAVA_RIVER)
+DF(1, 8, WATER_RIVERS)
+DF(1, 9, LAVA_RIVERS)
+DF(1, 10, CAVE)
+DF(1, 11, CAVERN)
+DF(1, 12, NO_UP)
+DF(1, 13, HOT)
+DF(1, 14, COLD)
+DF(1, 15, FORCE_DOWN)
+DF(1, 16, FORGET)
+DF(1, 17, NO_DESTROY)
+DF(1, 18, SAND_VEIN)
+DF(1, 19, CIRCULAR_ROOMS)
+DF(1, 20, EMPTY)
+DF(1, 21, DAMAGE_FEAT)
+DF(1, 22, FLAT)
+DF(1, 23, TOWER)
+DF(1, 24, RANDOM_TOWNS)
+DF(1, 25, DOUBLE)
+DF(1, 26, LIFE_LEVEL)
+DF(1, 27, EVOLVE)
+DF(1, 28, ADJUST_LEVEL_1)
+DF(1, 29, ADJUST_LEVEL_2)
+DF(1, 30, NO_RECALL)
+DF(1, 31, NO_STREAMERS)
+
+DF(2, 0, ADJUST_LEVEL_1_2)
+DF(2, 1, NO_SHAFT)
+DF(2, 2, ADJUST_LEVEL_PLAYER)
+DF(2, 3, NO_TELEPORT)
+DF(2, 4, ASK_LEAVE)
+DF(2, 5, NO_STAIR)
+DF(2, 6, SPECIAL)
+DF(2, 7, NO_NEW_MONSTER)
+DF(2, 8, DESC)
+DF(2, 9, NO_GENO)
+DF(2, 10, NO_BREATH)
+DF(2, 11, WATER_BREATH)
+DF(2, 12, ELVEN)
+DF(2, 13, DWARVEN)
+DF(2, 14, NO_EASY_MOVE)
+DF(2, 15, NO_RECALL_OUT)
+DF(2, 16, DESC_ALWAYS)
diff --git a/src/dungeon_flag_set.hpp b/src/dungeon_flag_set.hpp
new file mode 100644
index 00000000..539a574a
--- /dev/null
+++ b/src/dungeon_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t DF_MAX_TIERS = 2;
+
+typedef flag_set<DF_MAX_TIERS> dungeon_flag_set;
diff --git a/src/dungeon_info_type.hpp b/src/dungeon_info_type.hpp
index 5f6fc9d0..2f8fefde 100644
--- a/src/dungeon_info_type.hpp
+++ b/src/dungeon_info_type.hpp
@@ -3,6 +3,10 @@
#include "h-basic.h"
#include "rule_type.hpp"
#include "obj_theme.hpp"
+#include "dungeon_flag_set.hpp"
+
+#include <array>
+#include <string>
/**
* Maximum number of towns per dungeon
@@ -12,61 +16,63 @@ constexpr int TOWN_DUNGEON = 4;
/* A structure for the != dungeon types */
struct dungeon_info_type
{
- const char *name; /* Name */
- char *text; /* Description */
- char short_name[3]; /* Short name */
-
- char generator[30]; /* Name of the level generator */
-
- s16b floor1; /* Floor tile 1 */
- byte floor_percent1[2]; /* Chance of type 1 */
- s16b floor2; /* Floor tile 2 */
- byte floor_percent2[2]; /* Chance of type 2 */
- s16b floor3; /* Floor tile 3 */
- byte floor_percent3[2]; /* Chance of type 3 */
- s16b outer_wall; /* Outer wall tile */
- s16b inner_wall; /* Inner wall tile */
- s16b fill_type1; /* Cave tile 1 */
- byte fill_percent1[2]; /* Chance of type 1 */
- s16b fill_type2; /* Cave tile 2 */
- byte fill_percent2[2]; /* Chance of type 2 */
- s16b fill_type3; /* Cave tile 3 */
- byte fill_percent3[2]; /* Chance of type 3 */
- byte fill_method; /* Smoothing parameter for the above */
-
- s16b mindepth; /* Minimal depth */
- s16b maxdepth; /* Maximal depth */
-
- bool_ principal; /* If it's a part of the main dungeon */
- byte next; /* The next part of the main dungeon */
- byte min_plev; /* Minimal plev needed to enter -- it's an anti-cheating mesure */
-
- int min_m_alloc_level; /* Minimal number of monsters per level */
- int max_m_alloc_chance; /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */
-
- u32b flags1; /* Flags 1 */
- u32b flags2; /* Flags 1 */
-
- int size_x, size_y; /* Desired numers of panels */
-
- byte rule_percents[100]; /* Flat rule percents */
- rule_type rules[5]; /* Monster generation rules */
-
- int final_object; /* The object you'll find at the bottom */
- int final_artifact; /* The artifact you'll find at the bottom */
- int final_guardian; /* The artifact's guardian. If an artifact is specified, then it's NEEDED */
-
- int ix, iy, ox, oy; /* Wilderness coordinates of the entrance/output of the dungeon */
-
- obj_theme objs; /* The drops type */
-
- int d_dice[4]; /* Number of dices */
- int d_side[4]; /* Number of sides */
- int d_frequency[4]; /* Frequency of damage (1 is the minimum) */
- int d_type[4]; /* Type of damage */
-
- s16b t_idx[TOWN_DUNGEON]; /* The towns */
- s16b t_level[TOWN_DUNGEON]; /* The towns levels */
- s16b t_num; /* Number of towns */
+ std::string name; /* Name */
+ std::string text; /* Description */
+ std::string short_name; /* Short name */
+
+ std::string generator; /* Name of the level generator */
+
+ s16b floor1 = 0; /* Floor tile 1 */
+ byte floor_percent1[2] = { 0 }; /* Chance of type 1 */
+ s16b floor2 = 0; /* Floor tile 2 */
+ byte floor_percent2[2] = { 0 }; /* Chance of type 2 */
+ s16b floor3 = 0; /* Floor tile 3 */
+ byte floor_percent3[2] = { 0 }; /* Chance of type 3 */
+ s16b outer_wall = 0; /* Outer wall tile */
+ s16b inner_wall = 0; /* Inner wall tile */
+ s16b fill_type1 = 0; /* Cave tile 1 */
+ byte fill_percent1[2] = { 0 }; /* Chance of type 1 */
+ s16b fill_type2 = 0; /* Cave tile 2 */
+ byte fill_percent2[2] = { 0 }; /* Chance of type 2 */
+ s16b fill_type3 = 0; /* Cave tile 3 */
+ byte fill_percent3[2] = { 0 }; /* Chance of type 3 */
+ byte fill_method = 0; /* Smoothing parameter for the above */
+
+ s16b mindepth = 0; /* Minimal depth */
+ s16b maxdepth = 0; /* Maximal depth */
+
+ bool_ principal = 0; /* If it's a part of the main dungeon */
+ byte min_plev = 0; /* Minimal plev needed to enter -- it's an anti-cheating mesure */
+
+ int min_m_alloc_level = 0; /* Minimal number of monsters per level */
+ int max_m_alloc_chance = 0; /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */
+
+ dungeon_flag_set flags { }; /* Dungeon flags */
+
+ int size_x = 0;
+ int size_y = 0;
+
+ byte rule_percents[100] = {0}; /* Flat rule percents */
+ std::array<rule_type, 5> rules { }; /* Monster generation rules */
+
+ int final_object = 0; /* The object you'll find at the bottom */
+ int final_artifact = 0; /* The artifact you'll find at the bottom */
+ int final_guardian = 0; /* The artifact's guardian. If an artifact is specified, then it's NEEDED */
+
+ int ix = 0; /* Wilderness coordinates of entrance */
+ int iy = 0; /* Wilderness coordinates of entrance */
+ int ox = 0; /* Wilderness coordinates of exit */
+ int oy = 0; /* Wilderness coordinates of exit */
+
+ obj_theme objs; /* The drops type */
+
+ int d_dice[4] = { 0 }; /* Number of dices */
+ int d_side[4] = { 0 }; /* Number of sides */
+ int d_frequency[4] = { 0 }; /* Frequency of damage (1 is the minimum) */
+ int d_type[4] = { 0 }; /* Type of damage */
+
+ s16b t_idx[TOWN_DUNGEON] = { 0 }; /* The towns */
+ s16b t_level[TOWN_DUNGEON] = { 0 }; /* The towns levels */
+ s16b t_num = 0; /* Number of towns */
};
diff --git a/src/ego_flag.hpp b/src/ego_flag.hpp
new file mode 100644
index 00000000..8afb6b19
--- /dev/null
+++ b/src/ego_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "ego_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define ETR(tier, index, name) \
+ DECLARE_FLAG(ego_flag_set, BOOST_PP_CAT(ETR_,name), tier, index)
+#include "ego_flag_list.hpp"
+#undef ETR
diff --git a/src/ego_flag_list.hpp b/src/ego_flag_list.hpp
new file mode 100644
index 00000000..b05fb9b1
--- /dev/null
+++ b/src/ego_flag_list.hpp
@@ -0,0 +1,38 @@
+/**
+ * X-macro list of all the ego flags
+ */
+
+/* ETR(<tier>, <index>, <name>) */
+
+ETR(1, 0, SUSTAIN ) /* Ego-Item gives a Random Sustain */
+ETR(1, 1, OLD_RESIST ) /* The old "extra power" random high resist */
+ETR(1, 2, ABILITY ) /* Ego-Item has a random Sustain */
+ETR(1, 3, R_ELEM ) /* Item resists Acid/Fire/Cold/Elec or Poison */
+ETR(1, 4, R_LOW ) /* Item has a random low resist */
+ETR(1, 5, R_HIGH ) /* Item has a random high resist */
+ETR(1, 6, R_ANY ) /* Item has one additional resist */
+ETR(1, 7, R_DRAGON ) /* Item gets "Dragon" Resist */
+ETR(1, 8, SLAY_WEAP ) /* Special 'Slaying' bonus */
+ETR(1, 9, DAM_DIE ) /* Item has an additional dam die */
+ETR(1, 10, DAM_SIZE ) /* Item has greater damage dice */
+ETR(1, 11, PVAL_M1 ) /* Item has +1 to pval */
+ETR(1, 12, PVAL_M2 ) /* Item has +(up to 2) to pval */
+ETR(1, 13, PVAL_M3 ) /* Item has +(up to 3) to pval */
+ETR(1, 14, PVAL_M5 ) /* Item has +(up to 5) to pval */
+ETR(1, 15, AC_M1 ) /* Item has +1 to AC */
+ETR(1, 16, AC_M2 ) /* Item has +(up to 2) to AC */
+ETR(1, 17, AC_M3 ) /* Item has +(up to 3) to AC */
+ETR(1, 18, AC_M5 ) /* Item has +(up to 5) to AC */
+ETR(1, 19, TH_M1 ) /* Item has +1 to hit */
+ETR(1, 20, TH_M2 ) /* Item has +(up to 2) to hit */
+ETR(1, 21, TH_M3 ) /* Item has +(up to 3) to hit */
+ETR(1, 22, TH_M5 ) /* Item has +(up to 5) to hit */
+ETR(1, 23, TD_M1 ) /* Item has +1 to dam */
+ETR(1, 24, TD_M2 ) /* Item has +(up to 2) to dam */
+ETR(1, 25, TD_M3 ) /* Item has +(up to 3) to dam */
+ETR(1, 26, TD_M5 ) /* Item has +(up to 5) to dam */
+ETR(1, 27, R_P_ABILITY) /* Item has a random pval-affected ability */
+ETR(1, 28, R_STAT ) /* Item affects a random stat */
+ETR(1, 29, R_STAT_SUST) /* Item affects a random stat & sustains it */
+ETR(1, 30, R_IMMUNITY ) /* Item gives a random immunity */
+ETR(1, 31, LIMIT_BLOWS) /* switch the "limit blows" feature */
diff --git a/src/ego_flag_set.hpp b/src/ego_flag_set.hpp
new file mode 100644
index 00000000..0e77d5e0
--- /dev/null
+++ b/src/ego_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t ETR_MAX_TIERS = 1;
+
+typedef flag_set<ETR_MAX_TIERS> ego_flag_set;
diff --git a/src/ego_item_type.hpp b/src/ego_item_type.hpp
index f9b6970a..2082c083 100644
--- a/src/ego_item_type.hpp
+++ b/src/ego_item_type.hpp
@@ -1,6 +1,10 @@
#pragma once
+#include "ego_flag_set.hpp"
#include "h-basic.h"
+#include "object_flag_set.hpp"
+
+#include <array>
/*
* Size of flag rarity tables
@@ -12,57 +16,47 @@ constexpr int FLAG_RARITY_MAX = 6;
*/
struct ego_item_type
{
- const char *name; /* Name (offset) */
-
- bool_ before; /* Before or after the object name ? */
-
- byte tval[10];
- byte min_sval[10];
- byte max_sval[10];
-
- byte rating; /* Rating boost */
-
- byte level; /* Minimum level */
- byte rarity; /* Object rarity */
- byte mrarity; /* Object rarity */
-
- s16b max_to_h; /* Maximum to-hit bonus */
- s16b max_to_d; /* Maximum to-dam bonus */
- s16b max_to_a; /* Maximum to-ac bonus */
-
- s16b activate; /* Activation Number */
-
- s32b max_pval; /* Maximum pval */
-
- s32b cost; /* Ego-item "cost" */
-
- byte rar[FLAG_RARITY_MAX];
- u32b flags1[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 1 */
- u32b flags2[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 2 */
- u32b flags3[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 3 */
- u32b flags4[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 4 */
- u32b flags5[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 5 */
- u32b esp[FLAG_RARITY_MAX]; /* ESP flags */
- u32b oflags1[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 1 */
- u32b oflags2[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 2 */
- u32b oflags3[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 3 */
- u32b oflags4[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 4 */
- u32b oflags5[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 5 */
- u32b oesp[FLAG_RARITY_MAX]; /* Obvious ESP flags */
- u32b fego[FLAG_RARITY_MAX]; /* ego flags */
-
- u32b need_flags1; /* Ego-Item Flags, set 1 */
- u32b need_flags2; /* Ego-Item Flags, set 2 */
- u32b need_flags3; /* Ego-Item Flags, set 3 */
- u32b need_flags4; /* Ego-Item Flags, set 4 */
- u32b need_flags5; /* Ego-Item Flags, set 5 */
- u32b need_esp; /* ESP flags */
- u32b forbid_flags1; /* Ego-Item Flags, set 1 */
- u32b forbid_flags2; /* Ego-Item Flags, set 2 */
- u32b forbid_flags3; /* Ego-Item Flags, set 3 */
- u32b forbid_flags4; /* Ego-Item Flags, set 4 */
- u32b forbid_flags5; /* Ego-Item Flags, set 5 */
- u32b forbid_esp; /* ESP flags */
-
- s16b power; /* Power granted(if any) */
+ const char *name = nullptr; /* Name */
+
+ bool_ before = FALSE; /* Before or after the object name ? */
+
+ byte tval[10] = { 0 };
+ byte min_sval[10] = { 0 };
+ byte max_sval[10] = { 0 };
+
+ byte rating = 0; /* Rating boost */
+
+ byte level = 0; /* Minimum level */
+ byte rarity = 0; /* Object rarity */
+ byte mrarity = 0; /* Object rarity */
+
+ s16b max_to_h = 0; /* Maximum to-hit bonus */
+ s16b max_to_d = 0; /* Maximum to-dam bonus */
+ s16b max_to_a = 0; /* Maximum to-ac bonus */
+
+ s16b activate = 0; /* Activation Number */
+
+ s32b max_pval = 0; /* Maximum pval */
+
+ s32b cost = 0; /* Ego-item "cost" */
+
+ byte rar[FLAG_RARITY_MAX] = { 0 };
+
+ std::array<object_flag_set, FLAG_RARITY_MAX> flags;
+ std::array<object_flag_set, FLAG_RARITY_MAX> oflags;
+
+ std::array<ego_flag_set, FLAG_RARITY_MAX> fego;
+
+ object_flag_set need_flags;
+ object_flag_set forbid_flags;
+
+ s16b power = -1; /* Power granted, if any */
+
+public:
+ ego_item_type()
+ {
+ std::fill(std::begin(tval),
+ std::end(tval),
+ 255);
+ }
};
diff --git a/src/ego_item_type_fwd.hpp b/src/ego_item_type_fwd.hpp
deleted file mode 100644
index 795f4403..00000000
--- a/src/ego_item_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct ego_item_type;
diff --git a/src/feature_flag.hpp b/src/feature_flag.hpp
new file mode 100644
index 00000000..09aa5b43
--- /dev/null
+++ b/src/feature_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "feature_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define FF(tier, index, name) \
+ DECLARE_FLAG(feature_flag_set, BOOST_PP_CAT(FF_,name), tier, index)
+#include "feature_flag_list.hpp"
+#undef FF
diff --git a/src/feature_flag_list.hpp b/src/feature_flag_list.hpp
new file mode 100644
index 00000000..0a433c3a
--- /dev/null
+++ b/src/feature_flag_list.hpp
@@ -0,0 +1,25 @@
+/**
+ * X-macro list of all the feature flags
+ */
+
+/* FF(<tier>, <index>, <name>) */
+
+FF(1, 0, NO_WALK)
+FF(1, 1, NO_VISION)
+FF(1, 2, CAN_LEVITATE)
+FF(1, 3, CAN_PASS)
+FF(1, 4, FLOOR)
+FF(1, 5, WALL)
+FF(1, 6, PERMANENT)
+FF(1, 7, CAN_FLY)
+FF(1, 8, REMEMBER)
+FF(1, 9, NOTICE)
+FF(1, 10, DONT_NOTICE_RUNNING)
+FF(1, 11, CAN_RUN)
+FF(1, 12, DOOR)
+FF(1, 13, SUPPORT_LIGHT)
+FF(1, 14, CAN_CLIMB)
+FF(1, 15, TUNNELABLE)
+FF(1, 16, WEB)
+FF(1, 17, ATTR_MULTI)
+FF(1, 18, SUPPORT_GROWTH)
diff --git a/src/feature_flag_set.hpp b/src/feature_flag_set.hpp
new file mode 100644
index 00000000..abc4f47d
--- /dev/null
+++ b/src/feature_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t FF_MAX_TIERS = 1;
+
+typedef flag_set<FF_MAX_TIERS> feature_flag_set;
diff --git a/src/feature_type.hpp b/src/feature_type.hpp
index 1a79aeb3..e818f17a 100644
--- a/src/feature_type.hpp
+++ b/src/feature_type.hpp
@@ -2,36 +2,33 @@
#include "h-basic.h"
+#include "feature_flag_set.hpp"
+
/**
* Terrain feature descriptor.
*/
struct feature_type
{
- char *name; /* Name */
-
- const char *text; /* Text. May point to shared read-only memory, DO NOT FREE! */
- const char *tunnel; /* Text for tunneling. May point to shared read-only memory, DO NOT FREE! */
- const char *block; /* Text for blocking. May point to shared read-only memory, DO NOT FREE! */
-
- byte mimic; /* Feature to mimic */
-
- u32b flags1; /* First set of flags */
+ char *name = nullptr; /* Name */
- byte extra; /* Extra byte (unused) */
+ const char *text = nullptr; /* Text. May point to shared read-only memory, DO NOT FREE! */
+ const char *tunnel = nullptr; /* Text for tunneling. May point to shared read-only memory, DO NOT FREE! */
+ const char *block = nullptr; /* Text for blocking. May point to shared read-only memory, DO NOT FREE! */
- s16b unused; /* Extra bytes (unused) */
+ byte mimic = 0; /* Feature to mimic */
- byte d_attr; /* Default feature attribute */
- char d_char; /* Default feature character */
+ feature_flag_set flags; /* First set of flags */
+ byte d_attr = 0; /* Default feature attribute */
+ char d_char = '\0'; /* Default feature character */
- byte x_attr; /* Desired feature attribute */
- char x_char; /* Desired feature character */
+ byte x_attr = 0; /* Desired feature attribute */
+ char x_char = '\0'; /* Desired feature character */
- byte shimmer[7]; /* Shimmer colors */
+ byte shimmer[7]; /* Shimmer colors */
- int d_dice[4]; /* Number of dices */
- int d_side[4]; /* Number of sides */
- int d_frequency[4]; /* Frequency of damage (1 is the minimum) */
- int d_type[4]; /* Type of damage */
+ int d_dice[4] = { 0 }; /* Number of dice */
+ int d_side[4] = { 0 }; /* Number of sides */
+ int d_frequency[4] = { 0 }; /* Frequency of damage (1 is the minimum) */
+ int d_type[4] = { 0 }; /* Type of damage */
};
diff --git a/src/feature_type_fwd.hpp b/src/feature_type_fwd.hpp
deleted file mode 100644
index 168ec6c7..00000000
--- a/src/feature_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct feature_type;
diff --git a/src/files.cc b/src/files.cc
index cc168ba5..6b3de0f0 100644
--- a/src/files.cc
+++ b/src/files.cc
@@ -15,6 +15,7 @@
#include "cmd3.hpp"
#include "dungeon_info_type.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hiscore.hpp"
#include "hook_chardump_in.hpp"
#include "hooks.hpp"
@@ -23,18 +24,23 @@
#include "loadsave.h"
#include "loadsave.hpp"
#include "mimic.hpp"
+#include "monoid.hpp"
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_ego.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "notes.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
+#include "object_flag_meta.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_class.hpp"
#include "player_race.hpp"
+#include "player_race_flag.hpp"
#include "player_race_mod.hpp"
#include "player_spec.hpp"
#include "player_type.hpp"
@@ -44,7 +50,6 @@
#include "store_type.hpp"
#include "tables.hpp"
#include "town_type.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -54,6 +59,12 @@
#include "xtra1.hpp"
#include "z-rand.hpp"
+#include <boost/algorithm/string.hpp>
+#include <boost/filesystem.hpp>
+#include <iostream>
+#include <fmt/format.h>
+#include <fstream>
+#include <limits>
#include <memory>
#include <unordered_set>
@@ -204,6 +215,13 @@ s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2)
*/
errr process_pref_file_aux(char *buf)
{
+ auto &race_mod_info = game->edit_data.race_mod_info;
+ auto &st_info = game->edit_data.st_info;
+ auto &re_info = game->edit_data.re_info;
+ auto &r_info = game->edit_data.r_info;
+ auto &f_info = game->edit_data.f_info;
+ auto &k_info = game->edit_data.k_info;
+
int i, j, n1, n2;
char *zz[16];
@@ -235,17 +253,26 @@ errr process_pref_file_aux(char *buf)
{
if (tokenize(buf + 2, 3, zz, ':', '/') == 3)
{
- monster_race *r_ptr;
- i = (huge)strtol(zz[0], NULL, 0);
+ std::size_t i = strtoul(zz[0], NULL, 0);
n1 = strtol(zz[1], NULL, 0);
n2 = strtol(zz[2], NULL, 0);
- if (i >= max_r_idx) return (1);
- r_ptr = &r_info[i];
- if (n1) r_ptr->x_attr = n1;
+
+ if (i >= r_info.size())
+ {
+ return (1);
+ }
+
+ auto r_ptr = &r_info[i];
+
+ if (n1)
+ {
+ r_ptr->x_attr = n1;
+ }
if (n2)
{
r_ptr->x_char = n2;
}
+
return (0);
}
}
@@ -259,18 +286,27 @@ errr process_pref_file_aux(char *buf)
{
if (tokenize(buf + 4, 3, zz, ':', '/') == 3)
{
- monster_ego *re_ptr;
- i = (huge)strtol(zz[0], NULL, 0);
+ std::size_t i = strtoul(zz[0], NULL, 0);
n1 = strtol(zz[1], NULL, 0);
n2 = strtol(zz[2], NULL, 0);
- if (i >= max_re_idx) return (1);
- re_ptr = &re_info[i];
- if (n1) re_ptr->g_attr = n1;
+
+ if (i >= re_info.size())
+ {
+ return 1;
+ }
+
+ auto re_ptr = &re_info[i];
+
+ if (n1)
+ {
+ re_ptr->g_attr = n1;
+ }
if (n2)
{
re_ptr->g_char = n2;
}
- return (0);
+
+ return 0;
}
}
@@ -283,7 +319,7 @@ errr process_pref_file_aux(char *buf)
i = (huge)strtol(zz[0], NULL, 0);
n1 = strtol(zz[1], NULL, 0);
n2 = strtol(zz[2], NULL, 0);
- if (i >= max_rmp_idx) return (1);
+ if (i >= static_cast<int>(race_mod_info.size())) return (1);
rmp_ptr = &race_mod_info[i];
if (n1) rmp_ptr->g_attr = n1;
if (n2)
@@ -293,26 +329,6 @@ errr process_pref_file_aux(char *buf)
return (0);
}
}
-
- /* Process "G:T:<num>:<a>/<c>" -- attr/char for traps */
- if (buf[2] == 'T')
- {
- if (tokenize(buf + 4, 3, zz, ':', '/') == 3)
- {
- trap_type *t_ptr;
- i = (huge)strtol(zz[0], NULL, 0);
- n1 = strtol(zz[1], NULL, 0);
- n2 = strtol(zz[2], NULL, 0);
- if (i >= max_t_idx) return (1);
- t_ptr = &t_info[i];
- if (n1) t_ptr->g_attr = n1;
- if (n2)
- {
- t_ptr->g_char = n2;
- }
- return (0);
- }
- }
}
@@ -321,13 +337,21 @@ errr process_pref_file_aux(char *buf)
{
if (tokenize(buf + 2, 3, zz, ':', '/') == 3)
{
- object_kind *k_ptr;
- i = (huge)strtol(zz[0], NULL, 0);
+ std::size_t i = strtoul(zz[0], NULL, 0);
n1 = strtol(zz[1], NULL, 0);
n2 = strtol(zz[2], NULL, 0);
- if (i >= max_k_idx) return (1);
- k_ptr = &k_info[i];
- if (n1) k_ptr->x_attr = n1;
+
+ if (i >= k_info.size())
+ {
+ return (1);
+ }
+
+ auto k_ptr = &k_info[i];
+
+ if (n1)
+ {
+ k_ptr->x_attr = n1;
+ }
if (n2)
{
k_ptr->x_char = n2;
@@ -342,13 +366,18 @@ errr process_pref_file_aux(char *buf)
{
if (tokenize(buf + 2, 3, zz, ':', '/') == 3)
{
- feature_type *f_ptr;
- i = (huge)strtol(zz[0], NULL, 0);
+ std::size_t f_idx = strtoul(zz[0], NULL, 0);
n1 = strtol(zz[1], NULL, 0);
n2 = strtol(zz[2], NULL, 0);
- if (i >= max_f_idx) return (1);
- f_ptr = &f_info[i];
- if (n1) f_ptr->x_attr = n1;
+
+ if (f_idx >= f_info.size()) return (1);
+
+ auto f_ptr = &f_info[f_idx];
+
+ if (n1)
+ {
+ f_ptr->x_attr = n1;
+ }
if (n2)
{
f_ptr->x_char = n2;
@@ -362,12 +391,13 @@ errr process_pref_file_aux(char *buf)
{
if (tokenize(buf + 2, 3, zz, ':', '/') == 3)
{
- store_info_type *st_ptr;
- i = (huge)strtol(zz[0], NULL, 0);
+ std::size_t i = std::stoul(zz[0], 0, 0);
n1 = strtol(zz[1], NULL, 0);
n2 = strtol(zz[2], NULL, 0);
- if (i >= max_st_idx) return (1);
- st_ptr = &st_info[i];
+
+ if (i >= st_info.size()) return (1);
+
+ auto st_ptr = &st_info[i];
if (n1) st_ptr->x_attr = n1;
if (n2) st_ptr->x_char = n2;
return (0);
@@ -393,16 +423,23 @@ errr process_pref_file_aux(char *buf)
{
if (tokenize(buf + 2, 3, zz, ':', '/') == 3)
{
- j = (huge)strtol(zz[0], NULL, 0);
+ j = strtoul(zz[0], NULL, 0);
n1 = strtol(zz[1], NULL, 0);
n2 = strtol(zz[2], NULL, 0);
- for (i = 1; i < max_k_idx; i++)
+
+ for (auto &k_ref: k_info)
{
- object_kind *k_ptr = &k_info[i];
+ auto k_ptr = &k_ref;
if (k_ptr->tval == j)
{
- if (n1) k_ptr->d_attr = n1;
- if (n2) k_ptr->d_char = n2;
+ if (n1)
+ {
+ k_ref.d_attr = n1;
+ }
+ if (n2)
+ {
+ k_ref.d_char = n2;
+ }
}
}
return (0);
@@ -585,14 +622,12 @@ errr process_pref_file_aux(char *buf)
/* Process "X:<str>" -- turn option off */
else if (buf[0] == 'X')
{
- for (i = 0; option_info[i].o_desc; i++)
+ for (auto const &option: options->standard_options)
{
- if (option_info[i].o_var &&
- option_info[i].o_text &&
- streq(option_info[i].o_text, buf + 2))
+ if (option.o_var && streq(option.o_text, buf + 2))
{
- (*option_info[i].o_var) = FALSE;
- return (0);
+ *option.o_var = FALSE;
+ return 0;
}
}
}
@@ -600,14 +635,12 @@ errr process_pref_file_aux(char *buf)
/* Process "Y:<str>" -- turn option on */
else if (buf[0] == 'Y')
{
- for (i = 0; option_info[i].o_desc; i++)
+ for (auto const &option: options->standard_options)
{
- if (option_info[i].o_var &&
- option_info[i].o_text &&
- streq(option_info[i].o_text, buf + 2))
+ if (option.o_var && streq(option.o_text, buf + 2))
{
- (*option_info[i].o_var) = TRUE;
- return (0);
+ *option.o_var = TRUE;
+ return 0;
}
}
}
@@ -885,13 +918,13 @@ static cptr process_pref_file_expr(char **sp, char *fp)
/* Race */
else if (streq(b + 1, "RACE"))
{
- v = rp_ptr->title;
+ v = rp_ptr->title.c_str(); // The string SHOULD be stable enough for this
}
/* Race */
else if (streq(b + 1, "RACEMOD"))
{
- v = rmp_ptr->title;
+ v = rmp_ptr->title.c_str(); // The string SHOULD be stable enough for this
}
/* Class */
@@ -903,7 +936,7 @@ static cptr process_pref_file_expr(char **sp, char *fp)
/* Player */
else if (streq(b + 1, "PLAYER"))
{
- v = player_base;
+ v = game->player_base.c_str(); // The string SHOULD be stable enough for this
}
}
@@ -1012,7 +1045,7 @@ errr process_pref_file(cptr name)
if (buf[0] == '%')
{
/* Process that file if allowed */
- (void)process_pref_file(buf + 2);
+ process_pref_file(buf + 2);
/* Continue */
continue;
@@ -1055,7 +1088,7 @@ static void prt_lnum(cptr header, s32b num, int row, int col, byte color)
char out_val[32];
put_str(header, row, col);
- (void)sprintf(out_val, "%9ld", (long)num);
+ sprintf(out_val, "%9ld", (long)num);
c_put_str(color, out_val, row, col + len);
}
@@ -1071,7 +1104,7 @@ static void prt_num(cptr header, int num, int row, int col, byte color,
put_str(header, row, col);
put_str(space, row, col + len);
- (void)sprintf(out_val, "%6ld", (long)num);
+ sprintf(out_val, "%6ld", (long)num);
c_put_str(color, out_val, row, col + len + strlen(space));
}
@@ -1086,7 +1119,7 @@ static void prt_str(cptr header, cptr str, int row, int col, byte color)
put_str(header, row, col);
put_str(" ", row, col + len);
- (void)sprintf(out_val, "%6s", str);
+ sprintf(out_val, "%6s", str);
c_put_str(color, out_val, row, col + len + 3);
}
@@ -1097,7 +1130,7 @@ static void prt_str(cptr header, cptr str, int row, int col, byte color)
* For this to look right, the following should be spaced the
* same as in the prt_lnum code... -CFT
*/
-static void display_player_middle(void)
+static void display_player_middle()
{
int show_tohit = p_ptr->dis_to_h;
int show_todam = p_ptr->dis_to_d;
@@ -1145,7 +1178,7 @@ static void display_player_middle(void)
prt_lnum("Max Exp ", p_ptr->max_exp, 11, 28, TERM_L_GREEN);
- if ((p_ptr->lev >= PY_MAX_LEVEL) || (p_ptr->lev >= max_plev))
+ if (p_ptr->lev >= PY_MAX_LEVEL)
{
put_str("Exp to Adv.", 12, 28);
c_put_str(TERM_L_GREEN, " *****", 12, 28 + 11);
@@ -1166,7 +1199,7 @@ static void display_player_middle(void)
{
color = TERM_L_BLUE;
}
- else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
+ else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10)
{
color = TERM_VIOLET;
}
@@ -1174,10 +1207,10 @@ static void display_player_middle(void)
{
color = TERM_L_RED;
}
- (void)sprintf(num, "%6ld", (long)p_ptr->chp);
+ sprintf(num, "%6ld", (long)p_ptr->chp);
c_put_str(color, num, 9, 65);
put_str("/", 9, 71);
- (void)sprintf(num, "%6ld", (long)p_ptr->mhp);
+ sprintf(num, "%6ld", (long)p_ptr->mhp);
c_put_str(TERM_L_BLUE, num, 9, 72);
}
else
@@ -1187,7 +1220,7 @@ static void display_player_middle(void)
{
color = TERM_L_GREEN;
}
- else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
+ else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10)
{
color = TERM_YELLOW;
}
@@ -1195,10 +1228,10 @@ static void display_player_middle(void)
{
color = TERM_RED;
}
- (void)sprintf(num, "%6ld", (long)p_ptr->chp);
+ sprintf(num, "%6ld", (long)p_ptr->chp);
c_put_str(color, num, 9, 65);
put_str("/", 9, 71);
- (void)sprintf(num, "%6ld", (long)p_ptr->mhp);
+ sprintf(num, "%6ld", (long)p_ptr->mhp);
c_put_str(TERM_L_GREEN, num, 9, 72);
}
@@ -1207,7 +1240,7 @@ static void display_player_middle(void)
{
color = TERM_L_GREEN;
}
- else if (p_ptr->csp > (p_ptr->msp * hitpoint_warn) / 10)
+ else if (p_ptr->csp > (p_ptr->msp * options->hitpoint_warn) / 10)
{
color = TERM_YELLOW;
}
@@ -1215,10 +1248,10 @@ static void display_player_middle(void)
{
color = TERM_RED;
}
- (void)sprintf(num, "%6ld", (long)p_ptr->csp);
+ sprintf(num, "%6ld", (long)p_ptr->csp);
c_put_str(color, num, 10, 65);
put_str("/", 10, 71);
- (void)sprintf(num, "%6ld", (long)p_ptr->msp);
+ sprintf(num, "%6ld", (long)p_ptr->msp);
c_put_str(TERM_L_GREEN, num, 10, 72);
put_str("Sanity ", 11, 52);
@@ -1226,7 +1259,7 @@ static void display_player_middle(void)
{
color = TERM_L_GREEN;
}
- else if (p_ptr->csane > (p_ptr->msane * hitpoint_warn) / 10)
+ else if (p_ptr->csane > (p_ptr->msane * options->hitpoint_warn) / 10)
{
color = TERM_YELLOW;
}
@@ -1234,10 +1267,10 @@ static void display_player_middle(void)
{
color = TERM_RED;
}
- (void)sprintf(num, "%6ld", (long)p_ptr->csane);
+ sprintf(num, "%6ld", (long)p_ptr->csane);
c_put_str(color, num, 11, 65);
put_str("/", 11, 71);
- (void)sprintf(num, "%6ld", (long)p_ptr->msane);
+ sprintf(num, "%6ld", (long)p_ptr->msane);
c_put_str(TERM_L_GREEN, num, 11, 72);
if (p_ptr->pgod != GOD_NONE)
@@ -1247,18 +1280,16 @@ static void display_player_middle(void)
put_str("Speed ", 13, 52);
speed = p_ptr->pspeed;
- /* Hack -- Visually "undo" the Search Mode Slowdown */
- if (p_ptr->searching) speed += 10;
if (speed > 110)
{
char s[11];
- (void)sprintf(s, "Fast (+%d)", speed - 110);
+ sprintf(s, "Fast (+%d)", speed - 110);
c_put_str(TERM_L_GREEN, s, 13, (speed >= 120) ? 68 : 69);
}
else if (speed < 110)
{
char s[11];
- (void)sprintf(s, "Slow (-%d)", 110 - speed);
+ sprintf(s, "Slow (-%d)", 110 - speed);
c_put_str(TERM_L_UMBER, s, 13, (speed <= 100) ? 68 : 69);
}
else
@@ -1361,11 +1392,13 @@ static cptr likert(int x, int y)
*
* This code is "imitated" elsewhere to "dump" a character sheet.
*/
-static void display_player_various(void)
+static void display_player_various()
{
+ auto const &r_info = game->edit_data.r_info;
+
int tmp, tmp2, damdice, damsides, dambonus, blows;
- int xthn, xthb, xfos, xsrh;
- int xdis, xdev, xsav, xstl;
+ int xthn, xthb;
+ int xdev, xsav, xstl;
cptr desc;
int i;
@@ -1387,12 +1420,9 @@ static void display_player_various(void)
blows = p_ptr->num_blow;
/* Basic abilities */
- xdis = p_ptr->skill_dis;
xdev = p_ptr->skill_dev;
xsav = p_ptr->skill_sav;
xstl = p_ptr->skill_stl;
- xsrh = p_ptr->skill_srh;
- xfos = p_ptr->skill_fos;
put_str("Fighting :", 16, 1);
@@ -1412,21 +1442,9 @@ static void display_player_various(void)
c_put_str(likert_color, desc, 19, 15);
- put_str("Perception :", 16, 28);
- desc = likert(xfos, 6);
- c_put_str(likert_color, desc, 16, 42);
-
- put_str("Searching :", 17, 28);
- desc = likert(xsrh, 6);
- c_put_str(likert_color, desc, 17, 42);
-
- put_str("Disarming :", 18, 28);
- desc = likert(xdis, 8);
- c_put_str(likert_color, desc, 18, 42);
-
- put_str("Magic Device:", 19, 28);
+ put_str("Magic Device:", 20, 1);
desc = likert(xdev, 6);
- c_put_str(likert_color, desc, 19, 42);
+ c_put_str(likert_color, desc, 20, 15);
put_str("Blows/Round:", 16, 55);
@@ -1473,7 +1491,7 @@ static void display_player_various(void)
}
else if (!r_info[p_ptr->body_monster].body_parts[BODY_WEAPON])
{
- if (r_info[p_ptr->body_monster].flags1 & RF1_NEVER_BLOW)
+ if (r_info[p_ptr->body_monster].flags & RF_NEVER_BLOW)
desc = "nil!";
else
{
@@ -1542,29 +1560,38 @@ static void display_player_various(void)
* Obtain the "flags" of the wielded symbiote
*/
-void wield_monster_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
+static object_flag_set wield_monster_flags()
{
- object_type *o_ptr;
- monster_race *r_ptr;
+ auto const &r_info = game->edit_data.r_info;
- /* Clear */
- (*f1) = (*f2) = (*f3) = (*f4) = (*f5) = (*esp) = 0L;
+ object_flag_set flags;
/* Get the carried monster */
- o_ptr = &p_ptr->inventory[INVEN_CARRY];
-
+ auto o_ptr = &p_ptr->inventory[INVEN_CARRY];
if (o_ptr->k_idx)
{
- r_ptr = &r_info[o_ptr->pval];
+ auto r_ptr = &r_info[o_ptr->pval];
+
+ if (r_ptr->flags & RF_INVISIBLE)
+ flags |= TR_INVIS;
+ if (r_ptr->flags & RF_REFLECTING)
+ flags |= TR_REFLECT;
+ if (r_ptr->flags & RF_CAN_FLY)
+ flags |= TR_FEATHER;
+ if (r_ptr->flags & RF_AQUATIC)
+ flags |= TR_WATER_BREATH;
+ }
+
+ return flags;
+}
- if (r_ptr->flags2 & RF2_INVISIBLE)
- (*f2) |= TR2_INVIS;
- if (r_ptr->flags2 & RF2_REFLECTING)
- (*f2) |= TR2_REFLECT;
- if (r_ptr->flags7 & RF7_CAN_FLY)
- (*f3) |= TR3_FEATHER;
- if (r_ptr->flags7 & RF7_AQUATIC)
- (*f5) |= TR5_WATER_BREATH;
+
+template<class LF>
+static void apply_lflags(LF const &lflags, object_flag_set *f)
+{
+ for (int i = 1; i <= p_ptr->lev; i++)
+ {
+ (*f) |= lflags[i].oflags;
}
}
@@ -1572,607 +1599,620 @@ void wield_monster_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b
/*
* Obtain the "flags" for the player as if he was an item
*/
-void player_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
+object_flag_set player_flags()
{
- int i;
+ auto const &r_info = game->edit_data.r_info;
/* Clear */
- (*f1) = (*f2) = (*f3) = (*f4) = (*f5) = (*esp) = 0L;
+ object_flag_set f;
/* Astral chars */
if (p_ptr->astral)
{
- (*f3) |= TR3_WRAITH;
+ f |= TR_WRAITH;
}
/* Skills */
- if (get_skill(SKILL_DAEMON) > 20) (*f2) |= TR2_RES_CONF;
- if (get_skill(SKILL_DAEMON) > 30) (*f2) |= TR2_RES_FEAR;
- if (get_skill(SKILL_MINDCRAFT) >= 40) (*esp) |= ESP_ALL;
+ if (get_skill(SKILL_DAEMON) > 20) f |= TR_RES_CONF;
+ if (get_skill(SKILL_DAEMON) > 30) f |= TR_RES_FEAR;
+ if (get_skill(SKILL_MINDCRAFT) >= 40) f |= ESP_ALL;
if (p_ptr->melee_style == SKILL_HAND && get_skill(SKILL_HAND) > 24 && !monk_heavy_armor())
- (*f2) |= TR2_FREE_ACT;
-/* Hack - from Lua */
- if (get_skill(SKILL_MANA) >= 35) (*f1) |= TR1_MANA;
- if (get_skill(SKILL_AIR) >= 50) (*f5) |= (TR5_MAGIC_BREATH | TR5_WATER_BREATH);
- if (get_skill(SKILL_WATER) >= 30) (*f5) |= TR5_WATER_BREATH;
+ {
+ f |= TR_FREE_ACT;
+ }
+ if (get_skill(SKILL_MANA) >= 35) f |= TR_MANA;
+ if (get_skill(SKILL_AIR) >= 50) f |= (TR_MAGIC_BREATH | TR_WATER_BREATH);
+ if (get_skill(SKILL_WATER) >= 30) f |= TR_WATER_BREATH;
/* Gods */
if (p_ptr->pgod == GOD_ERU)
{
- if ((p_ptr->grace >= 100) || (p_ptr->grace <= -100)) (*f1) |= TR1_MANA;
- if (p_ptr->grace > 10000) (*f1) |= TR1_WIS;
+ if ((p_ptr->grace >= 100) || (p_ptr->grace <= -100)) f |= TR_MANA;
+ if (p_ptr->grace > 10000) f |= TR_WIS;
}
if (p_ptr->pgod == GOD_MELKOR)
{
- (*f2) |= TR2_RES_FIRE;
- if (p_ptr->melkor_sacrifice > 0) (*f2) |= TR2_LIFE;
- if (p_ptr->grace > 10000) (*f1) |= (TR1_STR | TR1_CON | TR1_INT | TR1_WIS | TR1_CHR);
+ f |= TR_RES_FIRE;
+ if (p_ptr->melkor_sacrifice > 0) f |= TR_LIFE;
+ if (p_ptr->grace > 10000) f |= (TR_STR | TR_CON | TR_INT | TR_WIS | TR_CHR);
if (p_ptr->praying)
{
- if (p_ptr->grace > 5000) (*f2) |= TR2_INVIS;
- if (p_ptr->grace > 15000) (*f2) |= TR2_IM_FIRE;
+ if (p_ptr->grace > 5000) f |= TR_INVIS;
+ if (p_ptr->grace > 15000) f |= TR_IM_FIRE;
}
}
if (p_ptr->pgod == GOD_MANWE)
{
- if (p_ptr->grace >= 2000) (*f3) |= TR3_FEATHER;
+ if (p_ptr->grace >= 2000) f |= TR_FEATHER;
if (p_ptr->praying)
{
- if (p_ptr->grace >= 7000) (*f2) |= TR2_FREE_ACT;
- if (p_ptr->grace >= 15000) (*f4) |= TR4_FLY;
- if ((p_ptr->grace >= 5000) || (p_ptr->grace <= -5000)) (*f1) |= TR1_SPEED;
+ if (p_ptr->grace >= 7000) f |= TR_FREE_ACT;
+ if (p_ptr->grace >= 15000) f |= TR_FLY;
+ if ((p_ptr->grace >= 5000) || (p_ptr->grace <= -5000)) f |= TR_SPEED;
}
}
if (p_ptr->pgod == GOD_TULKAS)
{
- if (p_ptr->grace > 5000) (*f1) |= TR1_CON;
- if (p_ptr->grace > 10000) (*f1) |= TR1_STR;
+ if (p_ptr->grace > 5000) f |= TR_CON;
+ if (p_ptr->grace > 10000) f |= TR_STR;
}
if (p_ptr->pgod == GOD_AULE)
{
if (p_ptr->grace > 5000)
{
- (*f2) |= TR2_RES_FIRE;
+ f |= TR_RES_FIRE;
}
}
if (p_ptr->pgod == GOD_MANDOS)
{
- (*f2) |= TR2_RES_NETHER;
+ f |= TR_RES_NETHER;
if ((p_ptr->grace > 10000) &&
(p_ptr->praying == TRUE))
{
- (*f3) |= TR3_NO_TELE;
+ f |= TR_NO_TELE;
}
if ((p_ptr->grace > 20000) &&
(p_ptr->praying == TRUE))
{
- (*f4) |= TR4_IM_NETHER;
+ f |= TR_IM_NETHER;
}
}
if (p_ptr->pgod == GOD_ULMO)
{
- (*f5) |= TR5_WATER_BREATH;
+ f |= TR_WATER_BREATH;
if ((p_ptr->grace > 1000) &&
(p_ptr->praying == TRUE))
{
- (*f2) |= TR2_RES_POIS;
+ f |= TR_RES_POIS;
}
if ((p_ptr->grace > 15000) &&
(p_ptr->praying == TRUE))
{
- (*f5) |= TR5_MAGIC_BREATH;
+ f |= TR_MAGIC_BREATH;
}
}
/* Classes */
- for (i = 1; i <= p_ptr->lev; i++)
- {
- (*f1) |= cp_ptr->oflags1[i];
- (*f2) |= cp_ptr->oflags2[i];
- (*f3) |= cp_ptr->oflags3[i];
- (*f4) |= cp_ptr->oflags4[i];
- (*f5) |= cp_ptr->oflags5[i];
- (*esp) |= cp_ptr->oesp[i];
- }
+ apply_lflags(cp_ptr->lflags, &f);
/* Races */
if ((!p_ptr->mimic_form) && (!p_ptr->body_monster))
{
- for (i = 1; i <= p_ptr->lev; i++)
- {
- (*f1) |= rp_ptr->oflags1[i];
- (*f2) |= rp_ptr->oflags2[i];
- (*f3) |= rp_ptr->oflags3[i];
- (*f4) |= rp_ptr->oflags4[i];
- (*f5) |= rp_ptr->oflags5[i];
- (*esp) |= rp_ptr->oesp[i];
-
- (*f1) |= rmp_ptr->oflags1[i];
- (*f2) |= rmp_ptr->oflags2[i];
- (*f3) |= rmp_ptr->oflags3[i];
- (*f4) |= rmp_ptr->oflags4[i];
- (*f5) |= rmp_ptr->oflags5[i];
- (*esp) |= rmp_ptr->oesp[i];
- }
+ apply_lflags(rp_ptr->lflags, &f);
+ apply_lflags(rmp_ptr->lflags, &f);
}
else
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
-
- if (r_ptr->flags2 & RF2_REFLECTING) (*f2) |= TR2_REFLECT;
- if (r_ptr->flags2 & RF2_REGENERATE) (*f3) |= TR3_REGEN;
- if (r_ptr->flags2 & RF2_AURA_FIRE) (*f3) |= TR3_SH_FIRE;
- if (r_ptr->flags2 & RF2_AURA_ELEC) (*f3) |= TR3_SH_ELEC;
- if (r_ptr->flags2 & RF2_PASS_WALL) (*f3) |= TR3_WRAITH;
- if (r_ptr->flags3 & RF3_SUSCEP_FIRE) (*f2) |= TR2_SENS_FIRE;
- if (r_ptr->flags3 & RF3_IM_ACID) (*f2) |= TR2_RES_ACID;
- if (r_ptr->flags3 & RF3_IM_ELEC) (*f2) |= TR2_RES_ELEC;
- if (r_ptr->flags3 & RF3_IM_FIRE) (*f2) |= TR2_RES_FIRE;
- if (r_ptr->flags3 & RF3_IM_POIS) (*f2) |= TR2_RES_POIS;
- if (r_ptr->flags3 & RF3_IM_COLD) (*f2) |= TR2_RES_COLD;
- if (r_ptr->flags3 & RF3_RES_NETH) (*f2) |= TR2_RES_NETHER;
- if (r_ptr->flags3 & RF3_RES_NEXU) (*f2) |= TR2_RES_NEXUS;
- if (r_ptr->flags3 & RF3_RES_DISE) (*f2) |= TR2_RES_DISEN;
- if (r_ptr->flags3 & RF3_NO_FEAR) (*f2) |= TR2_RES_FEAR;
- if (r_ptr->flags3 & RF3_NO_SLEEP) (*f2) |= TR2_FREE_ACT;
- if (r_ptr->flags3 & RF3_NO_CONF) (*f2) |= TR2_RES_CONF;
- if (r_ptr->flags7 & RF7_CAN_FLY) (*f3) |= TR3_FEATHER;
- }
-
- (*f1) |= p_ptr->xtra_f1;
- (*f2) |= p_ptr->xtra_f2;
- (*f3) |= p_ptr->xtra_f3;
- (*f4) |= p_ptr->xtra_f4;
- (*f5) |= p_ptr->xtra_f5;
- (*esp) |= p_ptr->xtra_esp;
+ auto &r_ref = r_info[p_ptr->body_monster];
+
+ if (r_ref.flags & RF_REFLECTING) f |= TR_REFLECT;
+ if (r_ref.flags & RF_REGENERATE) f |= TR_REGEN;
+ if (r_ref.flags & RF_AURA_FIRE) f |= TR_SH_FIRE;
+ if (r_ref.flags & RF_AURA_ELEC) f |= TR_SH_ELEC;
+ if (r_ref.flags & RF_PASS_WALL) f |= TR_WRAITH;
+ if (r_ref.flags & RF_SUSCEP_FIRE) f |= TR_SENS_FIRE;
+ if (r_ref.flags & RF_IM_ACID) f |= TR_RES_ACID;
+ if (r_ref.flags & RF_IM_ELEC) f |= TR_RES_ELEC;
+ if (r_ref.flags & RF_IM_FIRE) f |= TR_RES_FIRE;
+ if (r_ref.flags & RF_IM_POIS) f |= TR_RES_POIS;
+ if (r_ref.flags & RF_IM_COLD) f |= TR_RES_COLD;
+ if (r_ref.flags & RF_RES_NETH) f |= TR_RES_NETHER;
+ if (r_ref.flags & RF_RES_NEXU) f |= TR_RES_NEXUS;
+ if (r_ref.flags & RF_RES_DISE) f |= TR_RES_DISEN;
+ if (r_ref.flags & RF_NO_FEAR) f |= TR_RES_FEAR;
+ if (r_ref.flags & RF_NO_SLEEP) f |= TR_FREE_ACT;
+ if (r_ref.flags & RF_NO_CONF) f |= TR_RES_CONF;
+ if (r_ref.flags & RF_CAN_FLY) f |= TR_FEATHER;
+ }
+
+ f |= p_ptr->xtra_flags;
if (p_ptr->black_breath)
{
- (*f4) |= TR4_BLACK_BREATH;
+ f |= TR_BLACK_BREATH;
}
if (p_ptr->hp_mod != 0)
{
- (*f2) |= TR2_LIFE;
+ f |= TR_LIFE;
}
+
+ return f;
}
+namespace { // <anonymous>
+
/*
- * Object flag names
+ * Build an return a (static) index of all the object_flag_meta
+ * information indexed by page->column->row.
*/
-static cptr object_flag_names[192] =
+static std::vector<object_flag_meta const *> const &object_flag_metas_by_pcr(int page, int column, int row)
{
- "Add Str",
- "Add Int",
- "Add Wis",
- "Add Dex",
- "Add Con",
- "Add Chr",
- "Mul Mana",
- "Mul SPower",
- "Add Stea.",
- "Add Sear.",
- "Add Infra",
- "Add Tun..",
- "Add Speed",
- "Add Blows",
- "Chaotic",
- "Vampiric",
- "Slay Anim.",
- "Slay Evil",
- "Slay Und.",
- "Slay Demon",
- "Slay Orc",
- "Slay Troll",
- "Slay Giant",
- "Slay Drag.",
- "Kill Drag.",
- "Sharpness",
- "Impact",
- "Poison Brd",
- "Acid Brand",
- "Elec Brand",
- "Fire Brand",
- "Cold Brand",
-
- "Sust Str",
- "Sust Int",
- "Sust Wis",
- "Sust Dex",
- "Sust Con",
- "Sust Chr",
- "Invisible",
- "Mul life",
- "Imm Acid",
- "Imm Elec",
- "Imm Fire",
- "Imm Cold",
- "Sens Fire",
- "Reflect",
- "Free Act",
- "Hold Life",
- "Res Acid",
- "Res Elec",
- "Res Fire",
- "Res Cold",
- "Res Pois",
- "Res Fear",
- "Res Light",
- "Res Dark",
- "Res Blind",
- "Res Conf",
- "Res Sound",
- "Res Shard",
- "Res Neth",
- "Res Nexus",
- "Res Chaos",
- "Res Disen",
-
-
-
- "Aura Fire",
- "Aura Elec",
- "Auto Curse",
- NULL,
- "NoTeleport",
- "AntiMagic",
- "WraithForm",
- "EvilCurse",
- NULL,
- NULL,
- NULL,
- NULL,
- "Levitate",
- "Lite",
- "See Invis",
- NULL,
- "Digestion",
- "Regen",
- "Xtra Might",
- "Xtra Shots",
- NULL,
- NULL,
- NULL,
- NULL,
- "Activate",
- "Drain Exp",
- "Teleport",
- "Aggravate",
- "Blessed",
- "Cursed",
- "Hvy Curse",
- "Prm Curse",
-
- "No blows",
- "Precogn.",
- "B.Breath",
- "Recharge",
- "Fly",
- "Mrg.Curse",
- NULL,
- NULL,
- "Sentient",
- "Clone",
- NULL,
- "Climb",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "Imm Neth",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
-
- "Orc.ESP",
- "Troll.ESP",
- "Dragon.ESP",
- "Giant.ESP",
- "Demon.ESP",
- "Undead.ESP",
- "Evil.ESP",
- "Animal.ESP",
- "TLord.ESP",
- "Good.ESP",
- "Nlive.ESP",
- "Unique.ESP",
- "Spider ESP",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "Full ESP",
+ static std::vector<std::vector<std::vector<std::vector<object_flag_meta const *>>>> instance;
+
+ if (instance.empty())
+ {
+ // Find number of pages, columns and rows.
+ std::size_t n_pages = 0;
+ std::size_t n_columns = 0;
+ std::size_t n_rows = 0;
+
+ for (auto const &object_flag_meta: object_flags_meta())
+ {
+ n_pages = std::max<std::size_t>(n_pages, object_flag_meta->c_page + 1);
+ n_columns = std::max<std::size_t>(n_columns, object_flag_meta->c_column + 1);
+ n_rows = std::max<std::size_t>(n_rows, object_flag_meta->c_row + 1);
+ }
+
+ // Sanity check; we should always have enough data.
+ assert(n_pages > 0);
+ assert(n_columns > 0);
+ assert(n_rows > 0);
+
+ // Build the scaffolding structure without the actual data.
+ instance.reserve(n_pages);
+ for (std::size_t i = 0; i < n_pages; i++)
+ {
+ std::vector<std::vector<std::vector<object_flag_meta const *>>> page;
+ page.reserve(n_columns);
+
+ for (std::size_t j = 0; j < n_columns; j++)
+ {
+ std::vector<std::vector<object_flag_meta const *>> column;
+ column.reserve(n_rows);
+
+ for (std::size_t k = 0; k < n_rows; k++)
+ {
+ std::vector<object_flag_meta const *> row;
+ column.push_back(row);
+ }
+
+ page.push_back(column);
+ }
+
+ instance.push_back(page);
+ }
+
+ // Insert all the data.
+ for (auto const object_flag_meta: object_flags_meta())
+ {
+ // Ignore if not mapped to any page.
+ if (!object_flag_meta->c_name)
+ {
+ continue;
+ }
+
+ // Find the row
+ auto &row = instance
+ .at(object_flag_meta->c_page)
+ .at(object_flag_meta->c_column)
+ .at(object_flag_meta->c_row);
+
+ // Insert
+ row.push_back(object_flag_meta);
+ }
+ }
+
+ return instance.at(page).at(column).at(row);
+}
+
+
+/**
+ * Convert a number to a digit, capping at '9'. Ignores the sign of the number.
+ */
+static char number_to_digit(int n) {
+ // Throw away sign.
+ n = std::abs(n);
+ // Convert to digit or '*'
+ return (n > 9 ? '*' : I2D(n));
};
-/*
- * Summarize resistances
+
+/**
+ * Check that two object_flag types are compatible.
*/
-static void display_player_ben_one(int mode)
+static bool object_flag_types_are_compatible(char type_a, char type_b)
{
- int i, n, x, y, z, dispx, modetemp, xtemp;
+ switch (type_a)
+ {
+ case 'n':
+ return (type_b == 'n');
+ case 'b':
+ return (type_b == 'b');
+ case '+':
+ case '*':
+ return (type_b == '+') || (type_b == '*');
+ case 'f':
+ return (type_b == 'f');
+ case '\0':
+ return true;
+ default:
+ abort();
+ }
+}
- object_type *o_ptr;
+/**
+ * Object flag data for calculating cells on the character sheet.
+ */
+struct object_flag_cell {
+ /**
+ * Type designator for the cell, if any.
+ */
+ char type;
- char dummy[80], c;
+ /**
+ * Associated PVAL, if any.
+ */
+ int pval;
+
+ /**
+ * Label for the cell, given its current contents.
+ */
+ const char *label;
- u32b f1, f2, f3, f4, f5, esp;
+ /**
+ * Create object_flag_cell from object_flag_meta.
+ */
+ static object_flag_cell from_object_flag_meta(object_flag_meta const &object_flag_meta, int pval)
+ {
+ // The FIXED type flags require special handling.
+ if ((object_flag_meta.c_type == '1') || (object_flag_meta.c_type == '2') || (object_flag_meta.c_type == '3'))
+ {
+ return object_flag_cell {
+ 'f',
+ D2I(object_flag_meta.c_type),
+ object_flag_meta.c_name
+ };
+ }
+ else
+ {
+ return object_flag_cell {
+ object_flag_meta.c_type,
+ pval,
+ object_flag_meta.c_name
+ };
+ }
+ }
- u16b b[INVEN_TOTAL - INVEN_WIELD + 1][10];
+};
- int d[INVEN_TOTAL - INVEN_WIELD + 1];
+namespace detail { // "hide" from surrounding scope; should only be accessed through the monoid
- bool_ got;
+static object_flag_cell object_flag_cell_append(object_flag_cell const &a, object_flag_cell const &b)
+{
+ // The "empty" value automatically gets swallowed, whatever
+ // "side" of the append it's on.
+ if (a.type == '\0')
+ {
+ return b;
+ }
- byte a;
+ if (b.type == '\0')
+ {
+ return a;
+ }
- cptr name;
+ // The rest of the code assumes compatible types, so we
+ // assert this to a) avoid over-complicated logic, and
+ // b) breaking under 'unexpected' changes to the object
+ // flag list.
+ if (!object_flag_types_are_compatible(a.type, b.type))
+ {
+ abort();
+ }
- /* Scan equipment */
- for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
+ // Any boolean flag which is "set" overrides the previous
+ // flag. (If the flag was already set we won't lose any
+ // information.)
+ if (b.type == 'b')
{
- /* Index */
- n = (i - INVEN_WIELD);
+ return b;
+ }
- /* Object */
- o_ptr = &p_ptr->inventory[i];
+ // Flags with a numerical value get added together.
+ if (b.type == 'n') // (a.type == 'n') by symmetry and object_flag_types_are_compatible()
+ {
+ // Arbitrary choice of label -- the labels *should* be the same, by definition
+ return object_flag_cell { 'n', a.pval + b.pval, a.label };
+ }
- /* Known object flags */
- object_flags_known(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ // Fixed-value flags.
+ if (a.type == 'f') // (b.type == 'f') by symmetry and object_flag_types_are_compatible()
+ {
+ // Arbitrary choice of label -- the labels *should* be the same, by definition
+ return object_flag_cell { 'f', a.pval + b.pval, a.label };
+ }
- /* Incorporate */
- b[n][0] = (u16b)(f1 & 0xFFFF);
- b[n][1] = (u16b)(f1 >> 16);
- b[n][2] = (u16b)(f2 & 0xFFFF);
- b[n][3] = (u16b)(f2 >> 16);
- b[n][4] = (u16b)(f3 & 0xFFFF);
- b[n][5] = (u16b)(f3 >> 16);
- b[n][6] = (u16b)(f4 & 0xFFFF);
- b[n][7] = (u16b)(f4 >> 16);
- b[n][8] = (u16b)(esp & 0xFFFF);
- b[n][9] = (u16b)(esp >> 16);
- d[n] = o_ptr->pval;
+ // Flags of the TERNARY variety have a "supercedes" rule
+ // where immunity supercedes resistance.
+ if (a.type == '*')
+ {
+ return object_flag_cell { '*', 0, a.label };
+ }
+ else if (b.type == '*')
+ {
+ return object_flag_cell { '*', 0, b.label };
+ }
+ else // Both must be '+'
+ {
+ // Arbitrary choice of label -- the labels *should* be the same, by definition
+ return object_flag_cell { '+', 0, a.label };
}
+}
- /* Carried symbiote */
- n = INVEN_CARRY - INVEN_WIELD;
+constexpr object_flag_cell object_flag_cell_empty { '\0', 0, nullptr };
- /* Player flags */
- wield_monster_flags(&f1, &f2, &f3, &f4, &f5, &esp);
+} // namespace "detail"
- /* Incorporate */
- b[n][0] = (u16b)(f1 & 0xFFFF);
- b[n][1] = (u16b)(f1 >> 16);
- b[n][2] = (u16b)(f2 & 0xFFFF);
- b[n][3] = (u16b)(f2 >> 16);
- b[n][4] = (u16b)(f3 & 0xFFFF);
- b[n][5] = (u16b)(f3 >> 16);
- b[n][6] = (u16b)(f4 & 0xFFFF);
- b[n][7] = (u16b)(f4 >> 16);
- b[n][8] = (u16b)(esp & 0xFFFF);
- b[n][9] = (u16b)(esp >> 16);
+using object_flag_cell_monoid = monoid<object_flag_cell, detail::object_flag_cell_append, detail::object_flag_cell_empty>;
- /* Index */
- n = INVEN_TOTAL - INVEN_WIELD;
+} // namespace <anonymous>
- /* Player flags */
- player_flags(&f1, &f2, &f3, &f4, &f5, &esp);
+namespace { // <anonymous>
- /* Incorporate */
- b[n][0] = (u16b)(f1 & 0xFFFF);
- b[n][1] = (u16b)(f1 >> 16);
- b[n][2] = (u16b)(f2 & 0xFFFF);
- b[n][3] = (u16b)(f2 >> 16);
- b[n][4] = (u16b)(f3 & 0xFFFF);
- b[n][5] = (u16b)(f3 >> 16);
- b[n][6] = (u16b)(f4 & 0xFFFF);
- b[n][7] = (u16b)(f4 >> 16);
- b[n][8] = (u16b)(esp & 0xFFFF);
- b[n][9] = (u16b)(esp >> 16);
+static object_flag_meta const *get_lowest_priority_object_flag_meta(std::vector<object_flag_meta const *> const &object_flag_metas)
+{
+ object_flag_meta const *found = nullptr;
- /* Generate the equip chars */
- sprintf(dummy, " ");
- for (i = 0; i < INVEN_TOTAL - INVEN_WIELD; i++)
+ for (auto object_flag_meta: object_flag_metas)
{
- /* If you have that body part then show it */
- if (p_ptr->body_parts[i])
+ if ((!found) || (found->c_priority > object_flag_meta->c_priority))
{
- strcat(dummy, format("%c", i + 'a'));
+ found = object_flag_meta;
}
}
- strcat(dummy, "@");
- /* Scan cols */
- for (x = 1; x > -1; x--)
+ return found;
+}
+
+
+static std::tuple<char, int> object_flag_cell_to_char(object_flag_cell const &object_flag_cell)
+{
+ switch (object_flag_cell.type)
{
- /* Label */
- Term_putstr(x * 40 + 11, 3, -1, TERM_WHITE, dummy);
+ case 'n':
+ case 'f':
+ // If we have no pval, we use a simple '+'. This applies
+ // to the 'player' slot.
+ if (object_flag_cell.pval == 0)
+ {
+ return std::make_tuple('+', 1);
+ }
+ else
+ {
+ return std::make_tuple(
+ number_to_digit(object_flag_cell.pval),
+ (object_flag_cell.pval >= 0) ? 1 : -1);
+ }
+ break;
+
+ case 'b':
+ case '+':
+ return std::make_tuple('+', 1);
+ break;
- /* Scan rows */
- for (y = 0; y < 16; y++)
+ case '*':
+ return std::make_tuple('*', 1);
+ break;
+
+ default:
+ return std::make_tuple('.', 0);
+ break;
+ }
+
+ abort();
+}
+
+
+/*
+ * Output a slot
+ */
+static void display_flag_row(
+ int y,
+ int x0,
+ std::vector<std::tuple<char, int, object_flag_set>> const &slots,
+ std::vector<object_flag_meta const *> const &object_flag_metas_at_pcr)
+{
+ assert(!object_flag_metas_at_pcr.empty());
+
+ // Accumulated value of all of the slots
+ auto acc = object_flag_cell_monoid::empty;
+
+ // Go through each slot
+ for (std::size_t i = 0; i < slots.size(); i++)
+ {
+ object_flag_cell combined = object_flag_cell_monoid::empty;
+
+ // Go through all flags that are actually set for this 'cell'.
{
- if (mode == 3 && x == 1)
- {
- modetemp = 4;
- xtemp = 0;
- }
- else
+ auto const &slot = slots[i];
+ auto const pval = std::get<1>(slot);
+ auto const flags = std::get<2>(slot);
+
+ for (auto const object_flag_meta: object_flag_metas_at_pcr)
{
- modetemp = mode;
- xtemp = x;
+ if (object_flag_meta->flag_set & flags)
+ {
+ combined = object_flag_cell_monoid::append(
+ combined,
+ object_flag_cell::from_object_flag_meta(*object_flag_meta, pval));
+ }
}
+ }
- for (z = mode; z <= modetemp; z++)
- {
- if (mode == 3 && x == 1 && z == modetemp) xtemp = 1;
- name = object_flag_names[32 * modetemp + 16 * xtemp + y];
- got = FALSE;
+ // Accumulate into the global accumulator
+ acc = object_flag_cell_monoid::append(acc, combined);
- /* No name */
- if (!name) continue;
+ // Write the cell's value.
+ auto const char_and_rating = object_flag_cell_to_char(combined);
+ auto const ch = std::get<0>(char_and_rating);
+ auto const rating = std::get<1>(char_and_rating);
- /* Dump colon */
- if (!(modetemp == 1 && x == 0 && y > 7 && y < 12))
- {
- Term_putch(x * 40 + 10, y + 4, TERM_WHITE, ':');
- }
+ // Convert good flag into a color.
+ byte a;
+ if (rating == 0)
+ {
+ a = (i & 0x02) ? TERM_GREEN : TERM_SLATE;
+ }
+ else if (rating < 0)
+ {
+ a = TERM_RED;
+ }
+ else
+ {
+ a = TERM_L_GREEN;
+ }
- /* Check flags */
- dispx = 0;
- for (n = 0; n < INVEN_TOTAL - INVEN_WIELD + 1; n++)
- {
- /* Change colour every two columns */
- bool_ is_green = (dispx & 0x02);
- a = (is_green ? TERM_GREEN : TERM_SLATE);
- c = '.';
+ // Output the flag
+ Term_putch(x0 + 11 + i, y, a, ch);
+ }
- /* If the body part doesn't exists then skip it :) */
- if ((n < INVEN_TOTAL - INVEN_WIELD) && (!p_ptr->body_parts[n])) continue;
+ // Extract the label. If the flag isn't set at all then we don't have
+ // an actual label, so we'll use the one from the meta-level object
+ // flag definition. Note that the prioritization is crucial for the
+ // labeling to work properly; e.g. IMM_FIRE comes *before* the
+ // RES_FIRE flag in the object flag list, but we don't want the *label*
+ // from IMM_FIRE to be used when the flag is not set at all.
+ auto const label = (acc.label != nullptr)
+ ? acc.label
+ : get_lowest_priority_object_flag_meta(object_flag_metas_at_pcr)->c_name;
- /* Increment the drawing coordinates */
- dispx++;
+ // Get the "rating" for the label.
+ auto const rating = std::get<1>(object_flag_cell_to_char(acc));
- /* Check flag */
- if (b[n][2 * modetemp + xtemp] & (1 << y))
- {
- a = (is_green ? TERM_L_GREEN : TERM_WHITE);
- if (modetemp == 1 && x == 0 && y > 7 && y < 12)
- {
- c = '*';
- }
- else if (modetemp == 0 && x == 0 && y < 14 && (y < 6 || y > 7))
- {
- if (n == INVEN_TOTAL - INVEN_WIELD)
- {
- c = '+';
- }
- else
- {
- c = d[n];
- if (c < 0)
- {
- c = -c;
- a = TERM_RED;
- }
- c = (c > 9 ? '*' : I2D(c));
- }
- }
- else
- {
- c = '+';
- }
- got = TRUE;
- }
+ byte label_attr;
+ if (rating == 0) {
+ label_attr = TERM_WHITE;
+ } else if (rating < 0) {
+ label_attr = TERM_RED;
+ } else {
+ label_attr = TERM_L_GREEN;
+ }
- /* HACK - Check for nether immunity and
- apply to Res Neth line */
- if (modetemp == 1 && x == 1 && y == 12)
- {
- if (b[n][7] & (1 << 6))
- {
- a = (is_green ? TERM_L_GREEN : TERM_WHITE);
- c = '*';
- got = TRUE;
- }
- }
+ Term_putch(x0 + 10, y, TERM_WHITE, ':');
+ Term_putstr(x0, y, -1, label_attr, label);
+}
- /* Dump flag */
- if (modetemp == 1 && x == 0 && y > 7 && y < 12)
- {
- if (c == '*') Term_putch(40 + 11 + dispx, y - 4, a, c);
- }
- else
- {
- Term_putch(x * 40 + 11 + dispx, y + 4, a, c);
- }
- }
+/*
+ * Summarize resistances
+ */
+static void display_player_ben_one(int page)
+{
+ // Slots of flags to show.
+ std::vector<std::tuple<char, int, object_flag_set>> slots;
+ slots.reserve(INVEN_TOTAL - INVEN_WIELD + 1);
- a = TERM_WHITE;
- if (got)
- {
- if (modetemp == 1 && x == 0 && y > 7 && y < 12)
- {
- a = TERM_L_GREEN;
- }
- else if (modetemp != 0)
- {
- a = TERM_GREEN;
- }
- }
+ // Scan equipment
+ for (std::size_t i = INVEN_WIELD; i < INVEN_TOTAL; i++)
+ {
+ // Skip inventory slots that don't exist on the body.
+ auto n = i - INVEN_WIELD;
+ if ((n < INVEN_TOTAL - INVEN_WIELD) && (!p_ptr->body_parts[n])) continue;
- /* HACK - Check for nether immunity and change "Res Neth" */
- if (modetemp == 1 && x == 1 && y == 12 && p_ptr->immune_neth)
- {
- name = "Imm Neth";
- a = TERM_L_GREEN;
- }
+ // Extract object flags
+ auto const o_ptr = &p_ptr->inventory[i];
+ auto const flags = object_flags_known(o_ptr);
+ // Add slot
+ slots.emplace_back(
+ std::make_tuple('a' + i - INVEN_WIELD, o_ptr->pval, flags));
+ }
- /* Dump name */
- if (modetemp == 1 && x == 0 && y > 7 && y < 12)
- {
- if (got) Term_putstr(40, y - 4, -1, a, name);
- }
- else
- {
- Term_putstr(x * 40, y + 4, -1, a, name);
- }
+ // Carried symbiote
+ {
+ // Extract flags
+ auto const flags = wield_monster_flags();
+ // Add slot
+ slots.emplace_back(
+ std::make_tuple('z', 0, flags));
+ }
+
+ // Player
+ slots.emplace_back(
+ std::make_tuple('@', 0, player_flags()));
+
+ // Go through each column
+ for (int col = 0; col < 2; col++)
+ {
+ // Base coordinate for output
+ const auto x0 = col * 40;
+ const auto y0 = 3;
+
+ // Add slot headings.
+ {
+ std::string buf;
+ buf.reserve(slots.size());
+
+ for (auto const &slot: slots)
+ {
+ buf += std::get<0>(slot);
+ }
+
+ Term_putstr(x0 + 11, y0, -1, TERM_WHITE, buf.c_str());
+ }
+
+ // Scan rows
+ for (int row = 0; row < 16; row++)
+ {
+ // Extract the flag metadata for the current page/col/row
+ auto const object_flag_metas_at_pcr =
+ object_flag_metas_by_pcr(page, col, row);
+
+ // Ignore flags which we don't actually map to anything.
+ if (object_flag_metas_at_pcr.empty())
+ {
+ continue;
}
+
+ // Y coordinate for the row
+ auto const y = y0 + 1 + row;
+
+ // Show the row
+ display_flag_row(y, x0, slots, object_flag_metas_at_pcr);
}
}
}
+} // namespace <anonymous>
/*
- * Display the character on the screen (various modes)
- *
- * The top two and bottom two lines are left blank.
- *
- * Mode 0 = standard display with skills
- * Mode 1 = standard display with history
- * Mode 2 = current flags (part 1)
- * Mode 3 = current flags (part 2)
- * Mode 4 = current flags (part 3)
- * Mode 5 = current flags (part 4)
- * Mode 6 = current flags (part 5 -- esp)
+ * Display the character on the screen
*/
void display_player(int mode)
{
- int i;
+ auto const &r_info = game->edit_data.r_info;
+
+ assert(mode >= 0);
+ assert(mode < 5);
char buf[80];
@@ -2181,47 +2221,29 @@ void display_player(int mode)
clear_from(0);
/* Standard */
- if ((mode == 0) || (mode == 1))
+ if (mode == 0)
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
/* Name, Sex, Race, Class */
put_str("Name :", 2, 1);
- put_str("Sex :", 3, 1);
- put_str("Race :", 4, 1);
- put_str("Class :", 5, 1);
- put_str("Body :", 6, 1);
- put_str("God :", 7, 1);
- c_put_str(TERM_L_BLUE, player_name, 2, 9);
- if (p_ptr->body_monster != 0)
- {
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
- char tmp[12];
-
- if ((r_ptr->flags1 & RF1_MALE) != 0)
- strcpy(tmp, "Male");
- else if ((r_ptr->flags1 & RF1_FEMALE) != 0)
- strcpy(tmp, "Female");
- else
- strcpy(tmp, "Neuter");
- c_put_str(TERM_L_BLUE, tmp, 3, 9);
- }
- else
- c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9);
- sprintf(buf, "%s", get_player_race_name(p_ptr->prace, p_ptr->pracem));
- c_put_str(TERM_L_BLUE, buf, 4, 9);
- c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9);
- c_put_str(TERM_L_BLUE, r_ptr->name, 6, 9);
- c_put_str(TERM_L_BLUE, deity_info[p_ptr->pgod].name, 7, 9);
-
- /* Age, Height, Weight, Social */
- prt_num("Age ", (int)p_ptr->age + bst(YEAR, turn), 2, 32, TERM_L_BLUE, " ");
- prt_num("Height ", (int)p_ptr->ht, 3, 32, TERM_L_BLUE, " ");
- prt_num("Weight ", (int)p_ptr->wt, 4, 32, TERM_L_BLUE, " ");
- prt_num("Social Class ", (int)p_ptr->sc, 5, 32, TERM_L_BLUE, " ");
+ c_put_str(TERM_L_BLUE, game->player_name.c_str(), 2, 9);
+
+ put_str("Race :", 3, 1);
+ auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem);
+ c_put_str(TERM_L_BLUE, player_race_name.c_str(), 3, 9);
+
+ put_str("Class :", 4, 1);
+ c_put_str(TERM_L_BLUE, spp_ptr->title, 4, 9);
+
+ put_str("Body :", 5, 1);
+ c_put_str(TERM_L_BLUE, r_ptr->name, 5, 9);
+
+ put_str("God :", 6, 1);
+ c_put_str(TERM_L_BLUE, deity_info[p_ptr->pgod].name, 6, 9);
/* Display the stats */
- for (i = 0; i < 6; i++)
+ for (int i = 0; i < 6; i++)
{
char punctuation = p_ptr->stat_max[i] == 18 + 100 ? '!' : ':';
/* Special treatment of "injured" stats */
@@ -2274,30 +2296,15 @@ void display_player(int mode)
/* Extra info */
display_player_middle();
- /* Display "history" info */
- if (mode == 1)
- {
- put_str("(Character Background)", 15, 25);
-
- for (i = 0; i < 4; i++)
- {
- put_str(history[i], i + 16, 10);
- }
- }
-
/* Display "various" info */
- else
- {
- put_str("(Miscellaneous Abilities)", 15, 25);
-
- display_player_various();
- }
+ put_str("(Miscellaneous Abilities)", 15, 25);
+ display_player_various();
}
/* Special */
else
{
- display_player_ben_one(mode - 2);
+ display_player_ben_one(mode - 1);
}
}
@@ -2307,25 +2314,29 @@ void display_player(int mode)
* Describe the player's location -- either by dungeon level, town, or in
* wilderness with landmark reference.
*/
-cptr describe_player_location()
+std::string describe_player_location()
{
- int i;
- static char desc[80];
+ auto const &wilderness = game->wilderness;
+ auto const &d_info = game->edit_data.d_info;
+ auto const &wf_info = game->edit_data.wf_info;
+
+ std::string desc;
+
int pwx = (p_ptr->wild_mode ? p_ptr->px : p_ptr->wilderness_x);
int pwy = (p_ptr->wild_mode ? p_ptr->py : p_ptr->wilderness_y);
- int feat = wild_map[pwy][pwx].feat;
+ int feat = wilderness(pwx, pwy).feat;
if (dungeon_type != DUNGEON_WILDERNESS && dun_level > 0)
{
- sprintf(desc, "on level %d of %s", dun_level, d_info[dungeon_type].name);
+ desc += fmt::format("on level {:d} of {}", dun_level, d_info[dungeon_type].name);
}
else if (wf_info[feat].terrain_idx == TERRAIN_TOWN)
{
- sprintf(desc, "in the town of %s", wf_info[feat].name);
+ desc += fmt::format("in the town of {}", wf_info[feat].name);
}
else if (wf_info[feat].entrance)
{
- sprintf(desc, "near %s", wf_info[feat].name);
+ desc += fmt::format("near {}", wf_info[feat].name);
}
else
{
@@ -2338,21 +2349,19 @@ cptr describe_player_location()
*/
int landmark = 0, lwx = 0, lwy = 0;
int l_dist = -1;
- int i;
- for (i = 0; i < max_wf_idx; i++)
+ for (std::size_t i = 0; i < wf_info.size(); i++)
{
int wx = wf_info[i].wild_x;
int wy = wf_info[i].wild_y;
- int dist;
/* Skip if not a landmark */
if (!wf_info[i].entrance) continue;
/* Skip if we haven't seen it */
- if (!wild_map[wy][wx].known) continue;
+ if (!wilderness(wx, wy).known) continue;
- dist = distance(wy, wx, pwy, pwx);
+ int dist = distance(wy, wx, pwy, pwx);
if (dist < l_dist || l_dist < 0)
{
landmark = i;
@@ -2364,12 +2373,12 @@ cptr describe_player_location()
if (!landmark)
{
- sprintf(desc, "in %s", wf_info[feat].text);
+ desc += fmt::format("in {}", wf_info[feat].text);
}
else if (pwx == lwx && pwy == lwy)
{
/* Paranoia; this should have been caught above */
- sprintf(desc, "near %s", wf_info[feat].name);
+ desc += fmt::format("near {}", wf_info[feat].name);
}
else
{
@@ -2391,7 +2400,8 @@ cptr describe_player_location()
if (dy * 81 < dx * 31) ns = "";
if (dx * 81 < dy * 31) ew = "";
- sprintf(desc, "in %s %s%s of %s",
+ desc += fmt::format(
+ "in {} {}{} of {}",
wf_info[feat].text,
ns,
ew,
@@ -2399,10 +2409,8 @@ cptr describe_player_location()
}
}
- /* strip trailing whitespace */
- for (i = 0; desc[i]; ++i);
- while (desc[--i] == ' ')
- desc[i] = 0;
+ /* Strip trailing whitespace */
+ boost::trim_right(desc);
return desc;
}
@@ -2446,7 +2454,7 @@ static void file_character_print_grid(FILE *fff, bool_ show_gaps, bool_ show_leg
{
for (x = 0; x < 40; x++)
{
- (void)(Term_what(x, y, &a, &c));
+ (Term_what(x, y, &a, &c));
buf[x] = c;
}
@@ -2459,7 +2467,7 @@ static void file_character_print_grid(FILE *fff, bool_ show_gaps, bool_ show_leg
{
for (x = 40; x < 80; x++)
{
- (void)(Term_what(x, y, &a, &c));
+ (Term_what(x, y, &a, &c));
buf[x - 40] = c;
}
@@ -2494,19 +2502,20 @@ void file_character_print_item(FILE *fff, char label, object_type *obj, bool_ fu
*
* Prints out one "store" (for Home and Mathom-house)
*/
-void file_character_print_store(FILE *fff, wilderness_type_info *place, int store, bool_ full)
+static void file_character_print_store(FILE *fff, wilderness_type_info const *place, std::size_t store, bool_ full)
{
- int i;
+ auto const &st_info = game->edit_data.st_info;
+
town_type *town = &town_info[place->entrance];
store_type *st_ptr = &town->store[store];
- if (st_ptr->stock_num)
+ if (st_ptr->stock.size())
{
/* Header with name of the town */
- fprintf(fff, " [%s Inventory - %s]\n\n", st_info[store].name, place->name);
+ fprintf(fff, " [%s Inventory - %s]\n\n", st_info[store].name.c_str(), place->name);
/* Dump all available items */
- for (i = 0; i < st_ptr->stock_num; i++)
+ for (std::size_t i = 0; i < st_ptr->stock.size(); i++)
{
file_character_print_item(fff, I2A(i%24), &st_ptr->stock[i], full);
}
@@ -2523,7 +2532,7 @@ void file_character_print_store(FILE *fff, wilderness_type_info *place, int stor
* was not already there. XXX This is an ugly workaround for the double Gondolin
* problem.
*/
-static bool_ file_character_check_stores(std::unordered_set<store_type *> *seen_stores, wilderness_type_info *place, int store)
+static bool_ file_character_check_stores(std::unordered_set<store_type *> *seen_stores, wilderness_type_info const *place, int store)
{
town_type *town = &town_info[place->entrance];
store_type *st_ptr = &town->store[store];
@@ -2547,7 +2556,11 @@ static bool_ file_character_check_stores(std::unordered_set<store_type *> *seen_
*/
errr file_character(cptr name, bool_ full)
{
- int i, j, x, y;
+ auto const &d_info = game->edit_data.d_info;
+ auto const &wf_info = game->edit_data.wf_info;
+ auto const &r_info = game->edit_data.r_info;
+
+ int i, x, y;
byte a;
char c;
int fd = -1;
@@ -2566,10 +2579,10 @@ errr file_character(cptr name, bool_ full)
char out_val[160];
/* Close the file */
- (void)fd_close(fd);
+ fd_close(fd);
/* Build query */
- (void)sprintf(out_val, "Replace existing file %s? ", buf);
+ sprintf(out_val, "Replace existing file %s? ", buf);
/* Ask */
if (get_check(out_val)) fd = -1;
@@ -2604,7 +2617,7 @@ errr file_character(cptr name, bool_ full)
for (x = 0; x < 79; x++)
{
/* Get the attr/char */
- (void)(Term_what(x, y, &a, &c));
+ (Term_what(x, y, &a, &c));
/* Dump it */
buf[x] = c;
@@ -2627,7 +2640,7 @@ errr file_character(cptr name, bool_ full)
for (x = 0; x < 79; x++)
{
/* Get the attr/char */
- (void)(Term_what(x, y, &a, &c));
+ (Term_what(x, y, &a, &c));
/* Dump it */
buf[x] = c;
@@ -2642,52 +2655,52 @@ errr file_character(cptr name, bool_ full)
/* List the patches */
fprintf(fff, "\n\n [Miscellaneous information]\n");
- if (joke_monsters)
+ if (options->joke_monsters)
fprintf(fff, "\n Joke monsters: ON");
else
fprintf(fff, "\n Joke monsters: OFF");
- if (p_ptr->preserve)
+ if (options->preserve)
fprintf(fff, "\n Preserve Mode: ON");
else
fprintf(fff, "\n Preserve Mode: OFF");
- if (auto_scum)
+ if (options->auto_scum)
fprintf(fff, "\n Autoscum: ON");
else
fprintf(fff, "\n Autoscum: OFF");
- if (always_small_level)
+ if (options->always_small_level)
fprintf(fff, "\n Small Levels: ALWAYS");
- else if (small_levels)
+ else if (options->small_levels)
fprintf(fff, "\n Small Levels: ON");
else
fprintf(fff, "\n Small Levels: OFF");
- if (empty_levels)
+ if (options->empty_levels)
fprintf(fff, "\n Arena Levels: ON");
else
fprintf(fff, "\n Arena Levels: OFF");
- if (ironman_rooms)
+ if (options->ironman_rooms)
fprintf(fff, "\n Always unusual rooms: ON");
else
fprintf(fff, "\n Always unusual rooms: OFF");
fprintf(fff, "\n\n Recall Depth:");
- for (y = 1; y < max_d_idx; y++)
+ for (y = 1; y < static_cast<int>(d_info.size()); y++)
{
if (max_dlv[y])
- fprintf(fff, "\n %s: Level %d (%d')",
- d_info[y].name,
- max_dlv[y], 50 * (max_dlv[y]));
+ fprintf(fff, "\n %s: Level %d",
+ d_info[y].name.c_str(),
+ max_dlv[y]);
}
fprintf(fff, "\n");
if (noscore)
fprintf(fff, "\n You have done something illegal.");
- if (race_flags1_p(PR1_EXPERIMENTAL))
+ if (race_flags_p(PR_EXPERIMENTAL))
fprintf(fff, "\n You have done something experimental.");
{
@@ -2705,18 +2718,20 @@ errr file_character(cptr name, bool_ full)
}
/* Where we are, if we're alive */
- if (!death) fprintf(fff, "\n You are currently %s.", describe_player_location());
+ if (!death)
+ {
+ fprintf(fff, "\n You are currently %s.", describe_player_location().c_str());
+ }
/* Monsters slain */
{
- int k;
s32b Total = 0;
- for (k = 1; k < max_r_idx; k++)
+ for (auto const &r_ref: r_info)
{
- monster_race *r_ptr = &r_info[k];
+ auto r_ptr = &r_ref;
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
bool_ dead = (r_ptr->max_num == 0);
if (dead)
@@ -2755,33 +2770,24 @@ errr file_character(cptr name, bool_ full)
fprintf (fff, "\n\n");
- /* Emit the self-knowledge lines, even though they duplicate the
- information in the grids (below), because they contain information
- that's not in the grids (racial abilities, luck, etc.). */
- if (full)
- {
- self_knowledge(fff);
- fprintf(fff, "\n\n");
- }
-
/* adds and slays */
- display_player (2);
+ display_player(1);
file_character_print_grid(fff, FALSE, TRUE);
/* sustains and resistances */
- display_player (3);
+ display_player(2);
file_character_print_grid(fff, TRUE, FALSE);
/* stuff */
- display_player (4);
+ display_player(3);
file_character_print_grid(fff, FALSE, FALSE);
/* a little bit of stuff */
- display_player (5);
+ display_player(4);
file_character_print_grid(fff, FALSE, FALSE);
/* Dump corruptions */
- dump_corruptions(fff, FALSE, TRUE);
+ fprintf(fff, "\n%s\n", dump_corruptions(false, true).c_str());
/* Dump skills */
dump_skills(fff);
@@ -2803,7 +2809,7 @@ errr file_character(cptr name, bool_ full)
if ((fates[i].fate) && (fates[i].know))
{
fprintf(fff, "\n\n [Fates]\n\n");
- dump_fates(fff);
+ fprintf(fff, "%s", dump_fates().c_str());
break;
}
}
@@ -2837,12 +2843,12 @@ errr file_character(cptr name, bool_ full)
/* Print all homes in the different towns */
{
std::unordered_set<store_type *> seen_stores;
- for (j = 0; j < max_wf_idx; j++)
+ for (auto const &wf_ref: wf_info)
{
- if (wf_info[j].feat == FEAT_TOWN &&
- file_character_check_stores(&seen_stores, &wf_info[j], 7))
+ if (wf_ref.feat == FEAT_TOWN &&
+ file_character_check_stores(&seen_stores, &wf_ref, 7))
{
- file_character_print_store(fff, &wf_info[j], 7, full);
+ file_character_print_store(fff, &wf_ref, 7, full);
}
}
}
@@ -2850,12 +2856,12 @@ errr file_character(cptr name, bool_ full)
/* Print all Mathom-houses in the different towns */
{
std::unordered_set<store_type *> seen_stores;
- for (j = 0; j < max_wf_idx; j++)
+ for (auto const &wf_ref: wf_info)
{
- if (wf_info[j].feat == FEAT_TOWN &&
- file_character_check_stores(&seen_stores, &wf_info[j], 57))
+ if (wf_ref.feat == FEAT_TOWN &&
+ file_character_check_stores(&seen_stores, &wf_ref, 57))
{
- file_character_print_store(fff, &wf_info[j], 57, full);
+ file_character_print_store(fff, &wf_ref, 57, full);
}
}
}
@@ -2917,7 +2923,7 @@ struct hyperlink
typedef struct hyperlink hyperlink_type;
-bool_ show_file(cptr name, cptr what, int line, int mode)
+static bool_ show_file_aux(cptr name, cptr what, int line)
{
int i, k, x;
@@ -3375,7 +3381,7 @@ bool_ show_file(cptr name, cptr what, int line, int mode)
{
/* Get "h_ptr->shower" */
prt("Show: ", hgt - 1, 0);
- (void)askfor_aux(h_ptr->shower, 80);
+ askfor_aux(h_ptr->shower, 80);
}
/* Hack -- try finding */
@@ -3415,7 +3421,7 @@ bool_ show_file(cptr name, cptr what, int line, int mode)
strcpy(tmp, "help.hlp");
if (askfor_aux(tmp, 80))
{
- if (!show_file(tmp, NULL, 0, mode)) k = ESCAPE;
+ if (!show_file_aux(tmp, NULL, 0)) k = ESCAPE;
}
}
@@ -3469,7 +3475,7 @@ bool_ show_file(cptr name, cptr what, int line, int mode)
if (h_ptr->link_x[cur_link] != -1)
{
/* Recurse on that file */
- if (!show_file(h_ptr->link[cur_link], NULL, h_ptr->link_line[cur_link], mode)) k = ESCAPE;
+ if (!show_file_aux(h_ptr->link[cur_link], NULL, h_ptr->link_line[cur_link])) k = ESCAPE;
}
}
@@ -3482,7 +3488,7 @@ bool_ show_file(cptr name, cptr what, int line, int mode)
if (h_ptr->link_key[i] == k)
{
/* Recurse on that file */
- if (!show_file(h_ptr->link[i], NULL, h_ptr->link_line[i], mode)) k = ESCAPE;
+ if (!show_file_aux(h_ptr->link[i], NULL, h_ptr->link_line[i])) k = ESCAPE;
break;
}
}
@@ -3498,316 +3504,27 @@ bool_ show_file(cptr name, cptr what, int line, int mode)
return (TRUE);
}
-bool_ txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool_ force, bool_ recur)
+void show_string(const char *lines, const char *title, int line)
{
- int i, x;
-
- /* Number of "real" lines passed by */
- int next = 0;
-
- char buf_name[80];
+ // Temporary file
+ auto const file_name = boost::filesystem::unique_path().string();
- /* Color of the next line */
- byte color = TERM_WHITE;
-
- /* Current help file */
- FILE *fff = NULL;
+ // Open a new file
+ std::ofstream ofs(file_name);
+ ofs.exceptions(std::ofstream::failbit);
+ ofs << lines;
+ ofs.close();
- /* Current aux file */
- FILE *aux = NULL;
-
- /* Current html file */
- FILE *htm = NULL;
-
- cptr file_ext = "html";
- cptr link_prefix = "";
- cptr link_suffix = "";
-
- /* Pointer to general buffer in the above */
- char *buf;
-
- /* Allocate hyperlink data */
- std::unique_ptr<hyperlink_type> h_ptr(new hyperlink_type);
- memset(h_ptr.get(), 0, sizeof(hyperlink_type));
+ // Display the file contents
+ show_file_aux(file_name.c_str(), title, line);
- /* Setup buffer pointer */
- buf = h_ptr->rbuf;
-
- /* Wipe the links */
- for (i = 0; i < MAX_LINKS; i++)
- {
- h_ptr->link_x[i] = -1;
- }
-
- sprintf(buf_name, "%s.%s", base, file_ext);
-
- if ((!force) && file_exist(buf_name)) return FALSE;
-
- /* Build the filename */
- path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, buf_name);
-
- /* Open the file */
- htm = my_fopen(h_ptr->path, "w");
-
- sprintf(buf_name, "%s.%s", base, ext);
-
- /* h_ptr->caption */
- sprintf(h_ptr->caption, "Help file '%s'", buf_name);
-
- /* Build the filename */
- path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, buf_name);
-
- /* Open the file */
- fff = my_fopen(h_ptr->path, "r");
-
- /* Oops */
- if (!fff || !htm)
- {
- my_fclose(fff);
- my_fclose(htm);
-
- /* Oops */
- return (TRUE);
- }
-
- /* Build the filename */
- path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, head);
-
- /* Open the file */
- aux = my_fopen(h_ptr->path, "r");
-
- /* Copy the header */
- if (aux)
- {
- while (TRUE)
- {
- char *find;
-
- if (my_fgets(aux, h_ptr->rbuf, 1024)) break;
- find = strstr(h_ptr->rbuf, "%t");
- if (find != NULL)
- {
- *find = '\0';
- find += 2;
- fprintf(htm, "%s", h_ptr->rbuf);
- fprintf(htm, "%s", base);
- fprintf(htm, "%s\n", find);
- }
- else
- fprintf(htm, "%s\n", h_ptr->rbuf);
- }
- my_fclose(aux);
- }
-
- /* Display the file */
- while (TRUE)
- {
- bool_ do_color = FALSE;
-
- /* Skip a line */
- if (my_fgets(fff, h_ptr->rbuf, 1024)) break;
-
- color = TERM_WHITE;
-
- {
- int print_x;
-
- /* Get a color */
- if (prefix(h_ptr->rbuf, "#####"))
- {
- color = color_char_to_attr(h_ptr->rbuf[5]);
- do_color = TRUE;
- fprintf(htm, "<FONT COLOR=\"#%02X%02X%02X\">",
- angband_color_table[color][1],
- angband_color_table[color][2],
- angband_color_table[color][3]);
- buf = &h_ptr->rbuf[6];
- }
- else buf = h_ptr->rbuf;
-
- /* Count the "real" lines */
- next++;
-
- /* Skip link colors */
- if (prefix(buf, "|||||")) continue;
-
- /* Skip tags */
- if (prefix(buf, "~~~~~"))
- {
- int i;
-
- for (i = 5; (buf[i] >= '0') && (buf[i] <= '9'); i++)
- ;
- buf[i] = '\0';
- fprintf(htm, "<A NAME=\"%s\"></A>", buf + 5);
- continue;
- }
-
- /* Dump the line */
- print_x = 0;
- if (!prefix(buf, "&&&&&"))
- {
- x = 0;
- while (buf[x])
- {
- /* Hyperlink ? */
- if (prefix(buf + x, "*****"))
- {
- int xx = x + 5, z = 0;
- char buff[80];
- char link_line[80], *s;
-
- if (buf[xx] == '/') xx += 2;
-
- /* Zap the link info */
- while (buf[xx] != '*')
- {
- buff[z++] = buf[xx];
- xx++;
- }
- xx++;
- buff[z] = '\0';
-
- /* Zap the link info */
- z = 0;
- while (buf[xx] != '[')
- {
- link_line[z++] = buf[xx];
- xx++;
- }
- xx++;
- link_line[z] = '\0';
-
- /* parse it */
- s = buff;
- while (*s != '.') s++;
- *s = '\0';
- s++;
- if (recur) txt_to_html(head, foot, buff, s, FALSE, recur);
-
- if (atoi(link_line)) fprintf(htm, "<A HREF=\"%s%s.%s%s#%d\">", link_prefix, buff, file_ext, link_suffix, atoi(link_line));
- else fprintf(htm, "<A HREF=\"%s%s.%s%s\">", link_prefix, buff, file_ext, link_suffix);
-
- /* Ok print the link name */
- while (buf[xx] != ']')
- {
- /* Now we treat the next char as printable */
- if (buf[xx] == '\\')
- xx++;
- fprintf(htm, "%c", buf[xx]);
- xx++;
- print_x++;
- }
- x = xx;
-
- fprintf(htm, "</A>");
- }
- /* Color ? */
- else if (prefix(buf + x, "[[[[["))
- {
- int xx = x + 6;
-
- color = color_char_to_attr(buf[x + 5]);
- fprintf(htm, "<FONT COLOR=\"#%02X%02X%02X\">",
- angband_color_table[color][1],
- angband_color_table[color][2],
- angband_color_table[color][3]);
-
- /* Ok print the link name */
- while (buf[xx] != ']')
- {
- /* Now we treat the next char as printable */
- if (buf[xx] == '\\')
- xx++;
- fprintf(htm, "%c", buf[xx]);
- xx++;
- print_x++;
- }
- x++;
- x = xx;
-
- fprintf(htm, "</FONT>");
- }
- /* Hidden HTML tag? */
- else if (prefix(buf + x, "{{{{{"))
- {
- int xx = x + 5;
-
- /* Ok output the tag inside */
- while (buf[xx] != '}')
- {
- fprintf(htm, "%c", buf[xx]);
- xx++;
- }
- x++;
- x = xx;
- }
- else
- {
- fprintf(htm, "%c", buf[x]);
- print_x++;
- }
-
- x++;
- }
- }
- /* Verbatim mode: i.e: acacacac */
- else
- {
- byte old_color;
-
- x = 5;
- old_color = color_char_to_attr(buf[x]);
- fprintf(htm, "<FONT COLOR=\"#%02X%02X%02X\">",
- angband_color_table[color][1],
- angband_color_table[color][2],
- angband_color_table[color][3]);
- while (buf[x])
- {
- color = color_char_to_attr(buf[x]);
- if (color != old_color)
- fprintf(htm, "</FONT><FONT COLOR=\"#%02X%02X%02X\">",
- angband_color_table[color][1],
- angband_color_table[color][2],
- angband_color_table[color][3]);
-
- fprintf(htm, "%c", buf[x + 1]);
- print_x++;
- x += 2;
- }
- fprintf(htm, "</FONT>");
- }
- }
- if (do_color)
- {
- fprintf(htm, "</FONT>");
- }
- fprintf(htm, "\n");
- }
-
- /* Build the filename */
- path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, foot);
-
- /* Open the file */
- aux = my_fopen(h_ptr->path, "r");
-
- /* Copy the footer */
- if (aux)
- {
- while (TRUE)
- {
- if (my_fgets(aux, h_ptr->rbuf, 1024)) break;
- fprintf(htm, "%s\n", h_ptr->rbuf);
- }
- my_fclose(aux);
- }
-
- /* Close the file */
- my_fclose(htm);
- my_fclose(fff);
+ // Remove the file
+ fd_kill(file_name.c_str());
+}
- /* Normal return */
- return (TRUE);
+void show_file(cptr name, cptr what, int line)
+{
+ show_file_aux(name, what, line);
}
static void cmovie_clean_line(int y, char *abuf, char *cbuf)
@@ -4001,13 +3718,13 @@ void html_screenshot(cptr name)
/*
* Peruse the On-Line-Help
*/
-void do_cmd_help(void)
+void do_cmd_help()
{
/* Save screen */
screen_save();
/* Peruse the main help file */
- (void)show_file("help.hlp", NULL, 0, 0);
+ show_file("help.hlp", NULL);
/* Load screen */
screen_load();
@@ -4016,72 +3733,53 @@ void do_cmd_help(void)
-/*
- * Process the player name.
- * Extract a clean "base name".
- * Build the savefile name if needed.
- */
void process_player_base()
{
- char temp[128];
-
- /* Rename the savefile, using the player_base */
- (void)sprintf(temp, "%s", player_base);
-
- /* Build the filename */
- path_build(savefile, 1024, ANGBAND_DIR_SAVE, temp);
+ path_build(savefile, 1024, ANGBAND_DIR_SAVE, game->player_base.c_str());
}
void process_player_name(bool_ sf)
{
- int i, k = 0;
- char tmp[50];
-
/* Cannot be too long */
- if (strlen(player_base) > 15)
+ if (game->player_base.size() > 15)
{
- /* Name too long */
- quit_fmt("The name '%s' is too long!", player_base);
+ quit_fmt("The name '%s' is too long!", game->player_base.c_str());
}
- /* Cannot contain "icky" characters */
- for (i = 0; player_base[i]; i++)
+ /* Cannot contain control characters */
+ for (auto c : game->player_base)
{
- /* No control characters */
- if (iscntrl(player_base[i]))
+ if (iscntrl(c))
{
- /* Illegal characters */
- quit_fmt("The name '%s' contains control chars!", player_base);
+ quit_fmt("The name '%s' contains control chars!", game->player_base.c_str());
}
}
/* Extract "useful" letters */
- for (i = 0; player_base[i]; i++)
+ std::string buf;
+ for (auto c : game->player_base)
{
- char c = player_base[i];
-
/* Accept some letters */
- if (isalpha(c) || isdigit(c)) tmp[k++] = c;
+ if (isalpha(c) || isdigit(c))
+ {
+ buf += c;
+ }
/* Convert space, dot, and underscore to underscore */
- else if (strchr("@. _", c)) tmp[k++] = '_';
+ else if (strchr("@. _", c))
+ {
+ buf += '_';
+ }
}
-
-#if defined(WINDOWS)
-
- /* Hack -- max length */
- if (k > 8) k = 8;
-
-#endif
-
/* Terminate */
- tmp[k] = '\0';
- sprintf(player_base, "%s", tmp);
+ game->player_base = buf;
/* Require a "base" name */
- if (!player_base[0]) strcpy(player_base, "PLAYER");
-
+ if (game->player_base.empty())
+ {
+ game->player_base = "PLAYER";
+ }
/* Change the savefile name */
if (sf)
@@ -4101,7 +3799,7 @@ void process_player_name(bool_ sf)
*
* What a horrible name for a global function. XXX XXX XXX
*/
-void get_name(void)
+void get_name()
{
char tmp[32];
@@ -4118,10 +3816,13 @@ void get_name(void)
move_cursor(2, 9);
/* Save the player name */
- strcpy(tmp, player_name);
+ strcpy(tmp, game->player_name.c_str());
/* Get an input, ignore "Escape" */
- if (askfor_aux(tmp, 31)) strcpy(player_name, tmp);
+ if (askfor_aux(tmp, 31))
+ {
+ game->player_name = tmp;
+ }
/* Process the player name */
process_player_name(FALSE);
@@ -4131,7 +3832,7 @@ void get_name(void)
}
/* Pad the name (to clear junk) */
- sprintf(tmp, "%-31.31s", player_name);
+ sprintf(tmp, "%-31.31s", game->player_name.c_str());
/* Re-Draw the name (in light blue) */
c_put_str(TERM_L_BLUE, tmp, 2, 9);
@@ -4145,7 +3846,7 @@ void get_name(void)
/*
* Hack -- commit suicide
*/
-void do_cmd_suicide(void)
+void do_cmd_suicide()
{
int i;
@@ -4186,7 +3887,7 @@ void do_cmd_suicide(void)
p_ptr->leaving = TRUE;
/* Cause of death */
- (void)strcpy(died_from, "Quitting");
+ game->died_from = "Quitting";
}
@@ -4222,7 +3923,7 @@ void remove_cave_view(bool_ remove)
/*
* Save the game
*/
-void do_cmd_save_game(void)
+void do_cmd_save_game()
{
remove_cave_view(TRUE);
@@ -4233,7 +3934,7 @@ void do_cmd_save_game(void)
if (!is_autosave)
{
/* Disturb the player */
- disturb(1);
+ disturb();
}
/* Clear messages */
@@ -4249,7 +3950,7 @@ void do_cmd_save_game(void)
Term_fresh();
/* The player is not dead */
- (void)strcpy(died_from, "(saved)");
+ game->died_from = "(saved)";
/* Save the player */
if (save_player())
@@ -4269,7 +3970,7 @@ void do_cmd_save_game(void)
Term_fresh();
/* Note that the player is not dead */
- (void)strcpy(died_from, "(alive and well)");
+ game->died_from = "(alive and well)";
}
/*
@@ -4277,7 +3978,7 @@ void do_cmd_save_game(void)
*/
void autosave_checkpoint()
{
- if (autosave_l)
+ if (options->autosave_l)
{
is_autosave = TRUE;
msg_print("Autosaving the game...");
@@ -4289,28 +3990,36 @@ void autosave_checkpoint()
/*
* Hack -- Calculates the total number of points earned -JWT-
*/
-static long total_points(void)
+static long total_points()
{
- s16b max_dl = 0, i, k;
+ auto const &d_info = game->edit_data.d_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+
+ s16b max_dl = 0;
long temp, Total = 0;
long mult = 20; /* was 100. Divided values by 5 because of an overflow error */
long comp_death = (p_ptr->companion_killed * 2 / 5);
if (!comp_death) comp_death = 1;
- if (p_ptr->preserve) mult -= 1; /* Penalize preserve, maximize modes */
+ if (options->preserve) mult -= 1; /* Penalize preserve, maximize modes */
mult -= 1; /* maximize pentalty, always on */
- if (auto_scum) mult -= 4;
- if (small_levels) mult += ((always_small_level) ? 4 : 10);
- if (empty_levels) mult += 2;
- if (smart_learn) mult += 4;
+ if (options->auto_scum) mult -= 4;
+ if (options->small_levels) mult += ((options->always_small_level) ? 4 : 10);
+ if (options->empty_levels) mult += 2;
+ if (options->smart_learn) mult += 4;
if (mult < 2) mult = 2; /* At least 10% of the original score */
/* mult is now between 2 and 40, i.e. 10% and 200% */
- for (i = 0; i < max_d_idx; i++)
+ for (std::size_t i = 0; i < d_info.size(); i++)
+ {
if (max_dlv[i] > max_dl)
+ {
max_dl = max_dlv[i];
+ }
+ }
temp = p_ptr->lev * p_ptr->lev * p_ptr->lev * p_ptr->lev + (100 * max_dl);
@@ -4322,7 +4031,7 @@ static long total_points(void)
temp += p_ptr->au / 5;
/* Completing quest increase score */
- for (i = 0; i < MAX_Q_IDX; i++)
+ for (std::size_t i = 0; i < MAX_Q_IDX; i++)
{
if (quest[i].status >= QUEST_STATUS_COMPLETED)
{
@@ -4334,14 +4043,13 @@ static long total_points(void)
/* Death of a companion is BAD */
temp /= comp_death;
- /* The know objects increase the score */
- /* Scan the object kinds */
- for (k = 1; k < max_k_idx; k++)
+ /* The known objects increase the score */
+ for (std::size_t k = 1; k < k_info.size(); k++)
{
- object_kind *k_ptr = &k_info[k];
+ auto k_ptr = &k_info[k];
/* Hack -- skip artifacts */
- if (k_ptr->flags3 & (TR3_INSTA_ART)) continue;
+ if (k_ptr->flags & TR_INSTA_ART) continue;
/* List known flavored objects */
if (k_ptr->flavor && k_ptr->aware)
@@ -4359,11 +4067,11 @@ static long total_points(void)
}
}
- for (k = 1; k < max_r_idx; k++)
+ for (auto const &r_ref: r_info)
{
- monster_race *r_ptr = &r_info[k];
+ auto r_ptr = &r_ref;
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
bool_ dead = (r_ptr->max_num == 0);
@@ -4393,50 +4101,26 @@ static long total_points(void)
}
-
-/*
- * Centers a string within a 31 character string -JWT-
- */
-static void center_string(char *buf, cptr str)
-{
- int i, j;
-
- /* Total length */
- i = strlen(str);
-
- /* Necessary border */
- j = 15 - i / 2;
-
- /* Mega-Hack */
- (void)sprintf(buf, "%*s%s%*s", j, "", str, 31 - i - j, "");
-}
-
-
/*
* Display a "tomb-stone"
*/
-static void print_tomb(void)
+static void print_tomb()
{
- cptr p;
-
- char tmp[160];
-
- char buf[1024];
- char dummy[80];
-
- FILE *fp;
-
time_t ct = time(nullptr);
+ auto center = [](std::string const &s) -> std::string {
+ return fmt::format("{:^31s}", s);
+ };
/* Clear screen */
Term_clear();
/* Build the filename */
+ char buf[1024];
path_build(buf, 1024, ANGBAND_DIR_FILE, "dead.txt");
/* Open the News file */
- fp = my_fopen(buf, "r");
+ FILE *fp = my_fopen(buf, "r");
/* Dump */
if (fp)
@@ -4454,81 +4138,38 @@ static void print_tomb(void)
my_fclose(fp);
}
-
- /* King or Queen */
+ std::string p_title;
if (total_winner || (p_ptr->lev > PY_MAX_LEVEL))
{
- p = "Magnificent";
+ p_title = "Magnificent";
}
-
- /* Normal */
else
{
- p = cp_ptr->titles[(p_ptr->lev - 1) / 5];
- }
-
- center_string(buf, player_name);
- put_str(buf, 6, 11);
-
- center_string(buf, "the");
- put_str(buf, 7, 11);
-
- center_string(buf, p);
- put_str(buf, 8, 11);
-
-
- center_string(buf, spp_ptr->title);
- put_str(buf, 10, 11);
-
- (void)sprintf(tmp, "Level: %d", (int)p_ptr->lev);
- center_string(buf, tmp);
- put_str(buf, 11, 11);
-
- (void)sprintf(tmp, "Exp: %ld", (long)p_ptr->exp);
- center_string(buf, tmp);
- put_str(buf, 12, 11);
-
- (void)sprintf(tmp, "AU: %ld", (long)p_ptr->au);
- center_string(buf, tmp);
- put_str(buf, 13, 11);
-
- (void)sprintf(tmp, "Killed on Level %d", dun_level);
- center_string(buf, tmp);
- put_str(buf, 14, 11);
-
-
- if (strlen(died_from) > 24)
- {
- strncpy(dummy, died_from, 24);
- dummy[24] = '\0';
- (void)sprintf(tmp, "by %s.", dummy);
+ p_title = cp_ptr->titles[(p_ptr->lev - 1) / 5];
}
- else
- (void)sprintf(tmp, "by %s.", died_from);
- center_string(buf, tmp);
- put_str(buf, 15, 11);
-
-
- (void)sprintf(tmp, "%-.24s", ctime(&ct));
- center_string(buf, tmp);
- put_str(buf, 17, 11);
+ put_str(center(game->player_name), 6, 11);
+ put_str(center("the"), 7, 11);
+ put_str(center(p_title), 8, 11);
+ put_str(center(spp_ptr->title), 10, 11);
+ put_str(center(fmt::format("Level: {}", p_ptr->lev)), 11, 11);
+ put_str(center(fmt::format("Exp: {}", p_ptr->exp)), 12, 11);
+ put_str(center(fmt::format("AU: {}", p_ptr->au)), 13, 11);
+ put_str(center(fmt::format("Killed on Level {}", dun_level)), 14, 11);
+ put_str(center(fmt::format("by {}.", game->died_from.substr(0, 24))), 15, 11);
+ put_str(center(std::string(ctime(&ct)).substr(0, 24)), 17, 11);
}
/*
* Display some character info
*/
-static void show_info(void)
+static void show_info()
{
- int i, j, k;
- object_type *o_ptr;
- store_type *st_ptr;
-
/* Hack -- Know everything in the inven/equip */
- for (i = 0; i < INVEN_TOTAL; i++)
+ for (auto &o_ref: p_ptr->inventory)
{
- o_ptr = &p_ptr->inventory[i];
+ auto o_ptr = &o_ref;
/* Skip non-objects */
if (!o_ptr->k_idx) continue;
@@ -4538,14 +4179,13 @@ static void show_info(void)
object_known(o_ptr);
}
- for (i = 1; i < max_towns; i++)
+ /* Hack -- Know everything in the home */
+ for (int i = 1; i < max_towns; i++)
{
- st_ptr = &town_info[i].store[7];
-
- /* Hack -- Know everything in the home */
- for (j = 0; j < st_ptr->stock_num; j++)
+ auto st_ptr = &town_info[i].store[7];
+ for (auto &o_ref: st_ptr->stock)
{
- o_ptr = &st_ptr->stock[j];
+ auto o_ptr = &o_ref;
/* Skip non-objects */
if (!o_ptr->k_idx) continue;
@@ -4595,7 +4235,7 @@ static void show_info(void)
Term_save();
/* Dump a character file */
- (void)file_character(out_val, TRUE);
+ file_character(out_val, TRUE);
/* Load screen */
Term_load();
@@ -4634,27 +4274,28 @@ static void show_info(void)
}
/* Homes in the different towns */
- for (k = 1; k < max_towns; k++)
+ for (int k = 1; k < max_towns; k++)
{
- st_ptr = &town_info[k].store[7];
+ store_type *st_ptr = &town_info[k].store[7];
/* Home -- if anything there */
- if (st_ptr->stock_num)
+ if (!st_ptr->stock.empty())
{
+ std::size_t i;
/* Display contents of the home */
- for (k = 0, i = 0; i < st_ptr->stock_num; k++)
+ for (k = 0, i = 0; i < st_ptr->stock.size(); k++)
{
/* Clear screen */
Term_clear();
/* Show 12 items */
- for (j = 0; (j < 12) && (i < st_ptr->stock_num); j++, i++)
+ for (int j = 0; (j < 12) && (i < st_ptr->stock.size()); j++, i++)
{
char o_name[80];
char tmp_val[80];
/* Acquire item */
- o_ptr = &st_ptr->stock[i];
+ auto o_ptr = &st_ptr->stock[i];
/* Print header, clear line */
sprintf(tmp_val, "%c) ", I2A(j));
@@ -4688,6 +4329,8 @@ static void show_info(void)
*/
static void display_scores_aux(int highscore_fd, int from, int to, int note, high_score *score)
{
+ auto const &class_info = game->edit_data.class_info;
+
int i, j, k, n, place;
byte attr;
char out_val[256];
@@ -4788,11 +4431,12 @@ static void display_scores_aux(int highscore_fd, int from, int to, int note, hig
for (aged = the_score.turns; isspace(*aged); aged++) /* loop */;
/* Dump some info */
+ auto const player_race_name = get_player_race_name(pr, ps);
sprintf(out_val, "%3d.%9s %s the %s %s, Level %d",
place,
the_score.pts,
the_score.who,
- get_player_race_name(pr, ps),
+ player_race_name.c_str(),
class_info[pc].spec[pcs].title,
clev);
@@ -4851,11 +4495,12 @@ static void display_scores_aux(int highscore_fd, int from, int to, int note, hig
*/
void show_highclass(int building)
{
+ auto const &race_info = game->edit_data.race_info;
int i = 0, j, m = 0;
int pr, pc, clev;
high_score the_score;
- char buf[1024], out_val[256];
+ char buf[1024];
int highscore_fd;
switch (building)
@@ -4914,6 +4559,9 @@ void show_highclass(int building)
j = 0;
clev = 0;
+ auto const format_num = "{:>3d}) {} the {} (Level {:>2d})"; // See also race_score()
+ auto const format_you = "You) {} the {} (Level {:>2d})";
+
while ((m < 9) || (j < MAX_HISCORES))
{
if (highscore_seek(highscore_fd, j)) break;
@@ -4924,9 +4572,9 @@ void show_highclass(int building)
if (((pc == (building - 10)) && (building != 1)) ||
((building == 1) && (clev >= PY_MAX_LEVEL)))
{
- sprintf(out_val, "%3d) %s the %s (Level %2d)",
+ auto out_val = fmt::format(format_num,
(m + 1), the_score.who, race_info[pr].title, clev);
- prt(out_val, (m + 7), 0);
+ prt(out_val.c_str(), (m + 7), 0);
m++;
}
j++;
@@ -4935,17 +4583,21 @@ void show_highclass(int building)
/* Now, list the active player if they qualify */
if ((building == 1) && (p_ptr->lev >= PY_MAX_LEVEL))
{
- sprintf(out_val, "You) %s the %s (Level %2d)",
- player_name, race_info[p_ptr->prace].title, p_ptr->lev);
- prt(out_val, (m + 8), 0);
+ auto out_val = fmt::format(format_you,
+ game->player_name,
+ race_info[p_ptr->prace].title,
+ p_ptr->lev);
+ prt(out_val.c_str(), (m + 8), 0);
}
else if ((building != 1))
{
if ((p_ptr->lev > clev) && (p_ptr->pclass == (building - 10)))
{
- sprintf(out_val, "You) %s the %s (Level %2d)",
- player_name, race_info[p_ptr->prace].title, p_ptr->lev);
- prt(out_val, (m + 8), 0);
+ auto out_val = fmt::format(format_you,
+ game->player_name,
+ race_info[p_ptr->prace].title,
+ p_ptr->lev);
+ prt(out_val.c_str(), (m + 8), 0);
}
}
@@ -4964,16 +4616,18 @@ void show_highclass(int building)
*/
void race_score(int race_num)
{
+ auto const &race_info = game->edit_data.race_info;
+
int i = 0, j, m = 0;
int pr, clev, lastlev;
high_score the_score;
- char buf[1024], out_val[256], tmp_str[80];
+ char buf[1024], tmp_str[80];
int highscore_fd;
lastlev = 0;
/* rr9: TODO - pluralize the race */
- sprintf(tmp_str, "The Greatest of all the %s", race_info[race_num].title);
+ sprintf(tmp_str, "The Greatest of all the %s", race_info[race_num].title.c_str());
prt(tmp_str, 5, 3);
/* Build the filename */
@@ -4999,6 +4653,9 @@ void race_score(int race_num)
m = 0;
j = 0;
+ auto const format_num = "{:>3d}) {} the {} (Level {:>2d})"; // See also show_highclass()
+ auto const format_you = "You) {} the {} (Level {:>2d})";
+
while ((m < 10) && (j < i))
{
if (highscore_seek(highscore_fd, j)) break;
@@ -5007,10 +4664,12 @@ void race_score(int race_num)
clev = atoi(the_score.cur_lev);
if (pr == race_num)
{
- sprintf(out_val, "%3d) %s the %s (Level %3d)",
- (m + 1), the_score.who,
- race_info[pr].title, clev);
- prt(out_val, (m + 7), 0);
+ auto out_val = fmt::format(format_num,
+ (m + 1),
+ the_score.who,
+ race_info[pr].title,
+ clev);
+ prt(out_val.c_str(), (m + 7), 0);
m++;
lastlev = clev;
}
@@ -5020,9 +4679,11 @@ void race_score(int race_num)
/* add player if qualified */
if ((p_ptr->prace == race_num) && (p_ptr->lev >= lastlev))
{
- sprintf(out_val, "You) %s the %s (Level %3d)",
- player_name, race_info[p_ptr->prace].title, p_ptr->lev);
- prt(out_val, (m + 8), 0);
+ auto out_val = fmt::format(format_you,
+ game->player_name,
+ race_info[p_ptr->prace].title,
+ p_ptr->lev);
+ prt(out_val.c_str(), (m + 8), 0);
}
fd_close(highscore_fd);
@@ -5033,17 +4694,19 @@ void race_score(int race_num)
* Race Legends
* -KMW-
*/
-void race_legends(void)
+void race_legends()
{
- int i, j;
+ auto const &race_info = game->edit_data.race_info;
- for (i = 0; i < max_rp_idx; i++)
+ for (size_t i = 0; i < race_info.size(); i++)
{
race_score(i);
msg_print("Hit any key to continue");
msg_print(NULL);
- for (j = 5; j < 19; j++)
+ for (int j = 5; j < 19; j++)
+ {
prt("", j, 0);
+ }
}
}
@@ -5054,7 +4717,7 @@ void race_legends(void)
* Enters a players name on a hi-score table, if "legal", and in any
* case, displays some relevant portion of the high score list.
*/
-static errr top_twenty(void)
+static errr top_twenty()
{
int j;
@@ -5091,15 +4754,6 @@ static errr top_twenty(void)
goto out;
}
- /* Borg-mode pre-empts scoring */
- if (noscore & 0x00F0)
- {
- msg_print("Score not registered for borgs.");
- msg_print(NULL);
- display_scores_aux(highscore_fd, 0, 10, -1, NULL);
- goto out;
- }
-
/* Cheaters are not scored */
if (noscore & 0xFF00)
{
@@ -5109,17 +4763,8 @@ static errr top_twenty(void)
goto out;
}
- /* Interupted */
- if (!total_winner && streq(died_from, "Interrupting"))
- {
- msg_print("Score not registered due to interruption.");
- msg_print(NULL);
- display_scores_aux(highscore_fd, 0, 10, -1, NULL);
- goto out;
- }
-
/* Quitter */
- if (!total_winner && streq(died_from, "Quitting"))
+ if (!total_winner && (game->died_from == "Quitting"))
{
msg_print("Score not registered due to quitting.");
msg_print(NULL);
@@ -5153,10 +4798,9 @@ static errr top_twenty(void)
strftime(the_score.day, 9, "%m/%d/%y", localtime(&ct));
/* Save the player name (15 chars) */
- sprintf(the_score.who, "%-.15s", player_name);
+ sprintf(the_score.who, "%-.15s", game->player_name.c_str());
/* Save the player info XXX XXX XXX */
- sprintf(the_score.sex, "%c", (p_ptr->psex ? 'm' : 'f'));
sprintf(the_score.p_r, "%2d", p_ptr->prace);
sprintf(the_score.p_s, "%2d", p_ptr->pracem);
sprintf(the_score.p_c, "%2d", p_ptr->pclass);
@@ -5171,7 +4815,7 @@ static errr top_twenty(void)
sprintf(the_score.inside_quest, "%3d", p_ptr->inside_quest);
/* Save the cause of death (31 chars) */
- sprintf(the_score.how, "%-.31s", died_from);
+ sprintf(the_score.how, "%-.31s", game->died_from.c_str());
/* Add a new entry to the score list, see where it went */
@@ -5206,7 +4850,7 @@ out:
/*
* Predict the players location, and display it.
*/
-static errr predict_score(void)
+static errr predict_score()
{
int j;
@@ -5254,10 +4898,9 @@ static errr predict_score(void)
strcpy(the_score.day, "TODAY");
/* Save the player name (15 chars) */
- sprintf(the_score.who, "%-.15s", player_name);
+ sprintf(the_score.who, "%-.15s", game->player_name.c_str());
/* Save the player info XXX XXX XXX */
- sprintf(the_score.sex, "%c", (p_ptr->psex ? 'm' : 'f'));
sprintf(the_score.p_r, "%2d", p_ptr->prace);
sprintf(the_score.p_s, "%2d", p_ptr->pracem);
sprintf(the_score.p_c, "%2d", p_ptr->pclass);
@@ -5346,7 +4989,7 @@ void predict_score_gui(bool_ *initialized_p, bool_ *game_in_progress_p)
}
/* Close the high score file */
- (void)fd_close(highscore_fd);
+ fd_close(highscore_fd);
/* Forget the fd */
highscore_fd = -1;
@@ -5365,13 +5008,13 @@ void predict_score_gui(bool_ *initialized_p, bool_ *game_in_progress_p)
/*
* Change the player into a King! -RAK-
*/
-static void kingly(void)
+static void kingly()
{
/* Hack -- retire in town */
dun_level = 0;
/* Fake death */
- (void)strcpy(died_from, "Ripe Old Age");
+ game->died_from = "Ripe Old Age";
/* Restore the experience */
p_ptr->exp = p_ptr->max_exp;
@@ -5404,7 +5047,7 @@ static void kingly(void)
/* Display a message */
put_str("Veni, Vidi, Vici!", 15, 26);
put_str("I came, I saw, I conquered!", 16, 21);
- put_str(format("All Hail the Mighty %s!", sp_ptr->winner), 17, 22);
+ put_str(format("All Hail the Mighty %s!", game->player_name.c_str()), 17, 22);
/* Flush input */
flush();
@@ -5419,13 +5062,16 @@ static void kingly(void)
*/
void wipe_saved()
{
- int d, l, od = dungeon_type, ol = dun_level;
+ auto const &d_info = game->edit_data.d_info;
+
+ int od = dungeon_type;
+ int ol = dun_level;
- for (d = 0; d < max_d_idx; d++)
+ for (std::size_t d = 0; d < d_info.size(); d++)
{
- dungeon_info_type *d_ptr = &d_info[d];
+ auto d_ptr = &d_info[d];
- for (l = d_ptr->mindepth; l <= d_ptr->maxdepth; l++)
+ for (auto l = d_ptr->mindepth; l <= d_ptr->maxdepth; l++)
{
char buf[10];
@@ -5433,10 +5079,10 @@ void wipe_saved()
dungeon_type = d;
if (get_dungeon_save(buf))
{
- char tmp[80], name[1024];
+ auto tmp = fmt::format("{}.{}", game->player_base, buf);
- sprintf(tmp, "%s.%s", player_base, buf);
- path_build(name, 1024, ANGBAND_DIR_SAVE, tmp);
+ char name[1024];
+ path_build(name, 1024, ANGBAND_DIR_SAVE, tmp.c_str());
/* Remove the dungeon save file */
fd_kill(name);
@@ -5454,7 +5100,7 @@ void wipe_saved()
*
* This function is called only from "main.c" and "signals.c".
*/
-void close_game(void)
+void close_game()
{
/* Handle stuff */
handle_stuff();
@@ -5497,7 +5143,6 @@ void close_game(void)
/* Make a note */
{
char long_day[30];
- char buf[80];
time_t ct = time((time_t*)NULL);
/* Get the date */
@@ -5505,11 +5150,13 @@ void close_game(void)
"%Y-%m-%d at %H:%M:%S", localtime(&ct));
/* Create string */
- sprintf(buf, "\n%s was killed by %s on %s\n", player_name,
- died_from, long_day);
+ auto buf = fmt::format("\n{} was killed by {} on {}\n",
+ game->player_name,
+ game->died_from,
+ long_day);
/* Output to the notes file */
- output_note(buf);
+ output_note(buf.c_str());
}
/* Handle score, show Top scores */
@@ -5556,7 +5203,7 @@ errr get_rnd_line(const char *file_name, char *output)
strcpy(output, "");
/* test hack */
- if (wizard && cheat_xtra) msg_print(file_name);
+ if (wizard && options->cheat_xtra) msg_print(file_name);
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_FILE, file_name);
@@ -5678,7 +5325,7 @@ errr get_xtra_line(const char *file_name, monster_type *m_ptr, char *output)
strcpy(output, "");
/* test and DEBUG hack */
- if (wizard && cheat_xtra)
+ if (wizard && options->cheat_xtra)
{
msg_print(file_name);
}
@@ -5757,7 +5404,7 @@ errr get_xtra_line(const char *file_name, monster_type *m_ptr, char *output)
line = rand_int(num_entries);
/* test and DEBUG hack */
- if (wizard && cheat_xtra)
+ if (wizard && options->cheat_xtra)
{
sprintf(buf, "Line number %d", line);
msg_print(buf);
diff --git a/src/files.h b/src/files.h
index e3df5636..78521f4c 100644
--- a/src/files.h
+++ b/src/files.h
@@ -7,10 +7,8 @@
extern "C" {
#endif
-extern bool_ txt_to_html(cptr head, cptr food, cptr base, cptr ext, bool_ force, bool_ recur);
-extern void process_player_name(bool_ sf);
-extern void do_cmd_save_game(void);
-extern void predict_score_gui(bool_ *initialized, bool_ *game_in_progress);
+void do_cmd_save_game();
+void predict_score_gui(bool_ *initialized, bool_ *game_in_progress);
#ifdef __cplusplus
} // extern "C"
diff --git a/src/files.hpp b/src/files.hpp
index 52206d12..f431eb69 100644
--- a/src/files.hpp
+++ b/src/files.hpp
@@ -2,26 +2,32 @@
#include "h-basic.h"
#include "monster_type_fwd.hpp"
+#include "object_flag_set.hpp"
-extern void html_screenshot(cptr name);
-extern void help_file_screenshot(cptr name);
-extern void player_flags(u32b* f1, u32b* f2, u32b* f3, u32b* f4, u32b* f5, u32b* esp);
-extern void wipe_saved(void);
-extern s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2);
-extern void display_player(int mode);
-extern cptr describe_player_location(void);
-extern errr file_character(cptr name, bool_ full);
-extern errr process_pref_file_aux(char *buf);
-extern errr process_pref_file(cptr name);
-extern bool_ show_file(cptr name, cptr what, int line, int mode);
-extern void do_cmd_help(void);
-extern void process_player_base(void);
-extern void get_name(void);
-extern void do_cmd_suicide(void);
-extern void autosave_checkpoint();
-extern void close_game(void);
-extern errr get_rnd_line(const char * file_name, char * output);
-extern char *get_line(const char* fname, cptr fdir, char *linbuf, int line);
-extern void race_legends(void);
-extern void show_highclass(int building);
-extern errr get_xtra_line(const char * file_name, monster_type *m_ptr, char * output);
+#include <string>
+#include <vector>
+
+void html_screenshot(cptr name);
+void help_file_screenshot(cptr name);
+object_flag_set player_flags();
+void wipe_saved();
+s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2);
+void display_player(int mode);
+std::string describe_player_location();
+errr file_character(cptr name, bool_ full);
+errr process_pref_file_aux(char *buf);
+errr process_pref_file(cptr name);
+void show_string(const char *lines, const char *title, int line = 0);
+void show_file(cptr name, cptr what, int line = 0);
+void do_cmd_help();
+void process_player_base();
+void get_name();
+void do_cmd_suicide();
+void autosave_checkpoint();
+void close_game();
+errr get_rnd_line(const char * file_name, char * output);
+char *get_line(const char* fname, cptr fdir, char *linbuf, int line);
+void race_legends();
+void show_highclass(int building);
+errr get_xtra_line(const char * file_name, monster_type *m_ptr, char * output);
+void process_player_name(bool_ sf);
diff --git a/src/flag_set.hpp b/src/flag_set.hpp
new file mode 100644
index 00000000..7960de42
--- /dev/null
+++ b/src/flag_set.hpp
@@ -0,0 +1,201 @@
+#pragma once
+
+#include <array>
+#include <cassert>
+#include <cstdint>
+
+#include "tome/pp/global_constexpr.hpp"
+
+/**
+ * Set of binary flags.
+ */
+template<std::size_t Tiers> struct flag_set
+{
+private:
+ static constexpr std::size_t tiers = Tiers;
+ std::uint32_t m_data[tiers];
+
+public:
+ static constexpr const std::size_t nbits = tiers * 32;
+
+public:
+
+ constexpr flag_set()
+ : m_data { 0 }
+ {
+ // It is *extremely* important that there are absolutely
+ // NO dependencies on any global objects in here; lest we
+ // fall into SIOF territory; see DECLARE_FLAG_ZERO_IMPL
+ }
+
+ // This method is a workaround for a a segmentation fault
+ // when compiling with GCC 5.3.0 (Arch Linux). We should be
+ // able to use make() directly in DECLARE_FLAG_MAKE_INIT,
+ // but GCC segfaults.
+ template<std::uint32_t tier, std::size_t index> static constexpr flag_set make_static()
+ {
+ static_assert(tier < tiers, "tier >= tiers");
+ static_assert(index < 32, "index >= 32");
+ flag_set f;
+ f.m_data[tier] = (1UL << index);
+ return f;
+ }
+
+ static constexpr flag_set make(std::uint32_t tier, std::size_t index)
+ {
+ assert(tier < tiers);
+ assert(index < 32);
+ flag_set f;
+ f.m_data[tier] = (1UL << index);
+ return f;
+ }
+
+ static constexpr flag_set make_bit(std::size_t ibit)
+ {
+ assert(ibit < nbits);
+ flag_set f;
+ f.m_data[ibit / 32] = (1UL << (ibit % 32));
+ return f;
+ }
+
+ constexpr std::size_t size() const
+ {
+ return tiers;
+ }
+
+ constexpr bool empty() const
+ {
+ for (std::size_t i = 0; i < tiers; i++)
+ {
+ if (m_data[i])
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ constexpr std::size_t count() const
+ {
+ std::size_t n = 0;
+ for (std::size_t i = 0; i < nbits; i++)
+ {
+ if (bit(i))
+ {
+ n += 1;
+ }
+ }
+ return n;
+ }
+
+ uint32_t &operator[](std::size_t i)
+ {
+ assert(i < tiers);
+ return m_data[i];
+ }
+
+ constexpr uint32_t const &operator [](std::size_t i) const
+ {
+ assert(i < tiers);
+ return m_data[i];
+ }
+
+ explicit constexpr operator bool() const
+ {
+ return !empty();
+ }
+
+ constexpr bool operator == (flag_set const &other) const
+ {
+ for (std::size_t i = 0; i < tiers; i++)
+ {
+ if (m_data[i] != other.m_data[i])
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ constexpr bool operator != (flag_set const &other) const
+ {
+ return !(*this == other);
+ }
+
+ constexpr bool bit(std::size_t i) const
+ {
+ assert(i < nbits);
+ return (m_data[i / 32] & (1UL << (i % 32)));
+ }
+
+ flag_set &operator |= (flag_set const &other)
+ {
+ for (std::size_t i = 0; i < tiers; i++)
+ {
+ m_data[i] |= other.m_data[i];
+ }
+ return *this;
+ }
+
+ constexpr flag_set operator | (flag_set const &other) const
+ {
+ flag_set f;
+ for (std::size_t i = 0; i < tiers; i++)
+ {
+ f.m_data[i] = m_data[i] | other.m_data[i];
+ }
+ return f;
+ }
+
+ flag_set &operator &= (flag_set const &other)
+ {
+ for (std::size_t i = 0; i < tiers; i++)
+ {
+ m_data[i] &= other.m_data[i];
+ }
+ return *this;
+ }
+
+ constexpr flag_set operator & (flag_set const &other) const
+ {
+ flag_set f;
+ for (std::size_t i = 0; i < tiers; i++)
+ {
+ f.m_data[i] = m_data[i] & other.m_data[i];
+ }
+ return f;
+ }
+
+ constexpr flag_set operator ~ () const
+ {
+ flag_set f;
+ for (std::size_t i = 0; i < tiers; i++)
+ {
+ f.m_data[i] = ~m_data[i];
+ }
+ return f;
+ }
+
+};
+
+// Implementation details, because preprocessor.
+#define DECLARE_FLAG_MAKE_INIT(type, tier, index) \
+ type::make_static<tier-1,index>()
+
+/**
+ * Macro for declaring a "flag" constant.
+ */
+#define DECLARE_FLAG(type, name, tier, index) \
+ PP_GLOBAL_CONSTEXPR_CONST(type, name, DECLARE_FLAG_MAKE_INIT(type, tier, index))
+
+/**
+ * Macro for declaring a zero'ed "flag" variable.
+ */
+#define DECLARE_FLAG_ZERO_INTF(type, name) \
+ extern type name
+
+/**
+ * Macro for declaring the implementation of a zero'ed "flag" variable.
+ */
+#define DECLARE_FLAG_ZERO_IMPL(type, name) \
+ type name { };
diff --git a/src/flags_group.hpp b/src/flags_group.hpp
index bdf5216b..84809e37 100644
--- a/src/flags_group.hpp
+++ b/src/flags_group.hpp
@@ -1,20 +1,17 @@
#pragma once
#include "h-basic.h"
+#include "object_flag_set.hpp"
/**
* For level gaining artifacts
*/
struct flags_group
{
- char name[30]; /* Name */
- byte color; /* Color */
+ char name[30] { }; /* Name */
+ byte color = 0; /* Color */
- byte price; /* Price to "buy" it */
+ byte price = 0; /* Price to "buy" it */
- u32b flags1; /* Flags set 1 */
- u32b flags2; /* Flags set 2 */
- u32b flags3; /* Flags set 3 */
- u32b flags4; /* Flags set 4 */
- u32b esp; /* ESP flags set */
+ object_flag_set flags; /* Flags set */
};
diff --git a/src/game.cc b/src/game.cc
new file mode 100644
index 00000000..284c9ccc
--- /dev/null
+++ b/src/game.cc
@@ -0,0 +1,3 @@
+#include "game.hpp"
+
+Game *game;
diff --git a/src/game.hpp b/src/game.hpp
new file mode 100644
index 00000000..4f84f52c
--- /dev/null
+++ b/src/game.hpp
@@ -0,0 +1,97 @@
+#pragma once
+
+#include "game_fwd.hpp"
+
+#include "alloc.hpp"
+#include "birther.hpp"
+#include "game_edit_data.hpp"
+#include "grid.hpp"
+#include "h-basic.h"
+#include "level_marker.hpp"
+#include "messages.hpp"
+#include "player_defs.hpp"
+#include "random_artifact.hpp"
+#include "skill_type.hpp"
+#include "timer_type_fwd.hpp"
+#include "wilderness_map.hpp"
+
+#include <boost/multi_array.hpp>
+
+/**
+ * All structures for the game itself.
+ */
+struct Game {
+
+ /**
+ * Player character name
+ */
+ std::string player_name;
+
+ /*
+ * Stripped version of "player_name"
+ */
+ std::string player_base;
+
+ /**
+ * What did the player die from?
+ */
+ std::string died_from;
+
+ /**
+ * Previous character
+ */
+ birther previous_char;
+
+ /**
+ * Wilderness map
+ */
+ grid<wilderness_map> wilderness;
+
+ /**
+ * Random artifacts
+ */
+ std::vector<random_artifact> random_artifacts;
+
+ /**
+ * Allocations
+ */
+ Alloc alloc;
+
+ /**
+ * Player's un-adjusted HP at every level.
+ * Stored to avoid shenanigans with draininging levels
+ * and restoring them back, &c.
+ */
+ std::array<s16b, PY_MAX_LEVEL> player_hp { };
+
+ /**
+ * Message buffer.
+ */
+ Messages messages { 2048 };
+
+ /**
+ * Game edit data
+ */
+ GameEditData edit_data;
+
+ /**
+ * Current skill values.
+ */
+ std::vector<skill_type> s_info;
+
+ /**
+ * Timers
+ */
+ std::vector<timer_type *> timers;
+
+ /**
+ * Level markers for 'special' levels.
+ */
+ boost::multi_array<level_marker, 2> level_markers { };
+
+ /**
+ * Generate a special level feeling?
+ */
+ bool generate_special_feeling = false;
+
+};
diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp
new file mode 100644
index 00000000..a4727d90
--- /dev/null
+++ b/src/game_edit_data.hpp
@@ -0,0 +1,138 @@
+#pragma once
+
+#include "ability_type.hpp"
+#include "artifact_type.hpp"
+#include "dungeon_info_type.hpp"
+#include "ego_item_type.hpp"
+#include "feature_type.hpp"
+#include "monster_ego.hpp"
+#include "monster_race.hpp"
+#include "object_kind.hpp"
+#include "owner_type.hpp"
+#include "player_class.hpp"
+#include "player_race.hpp"
+#include "player_race_mod.hpp"
+#include "randart_gen_type.hpp"
+#include "randart_part_type.hpp"
+#include "set_type.hpp"
+#include "skill_descriptor.hpp"
+#include "store_action_type.hpp"
+#include "store_info_type.hpp"
+#include "vault_type.hpp"
+#include "wilderness_type_info.hpp"
+
+#include <vector>
+
+/**
+ * Game edit data, i.e. the parsed contents of the edit .txt
+ * files.
+ */
+struct GameEditData {
+
+ /**
+ * Dungeons
+ */
+ std::vector<dungeon_info_type> d_info;
+
+ /**
+ * Vaults
+ */
+ std::vector<vault_type> v_info;
+
+ /**
+ * Random artifact part descriptors, i.e. the bits that
+ * randarts are made up of.
+ */
+ std::vector<randart_part_type> ra_info;
+
+ /**
+ * Random artifact generation parameters.
+ */
+ std::vector<randart_gen_type> ra_gen;
+
+ /**
+ * Artifacts
+ */
+ std::vector<artifact_type> a_info;
+
+ /**
+ * Ego items
+ */
+ std::vector<ego_item_type> e_info;
+
+ /**
+ * Artifact sets
+ */
+ std::vector<set_type> set_info;
+
+ /**
+ * Object kinds
+ */
+ std::vector<object_kind> k_info;
+
+ /**
+ * Building actions.
+ */
+ std::vector<store_action_type> ba_info;
+
+ /**
+ * Buildings
+ */
+ std::vector<store_info_type> st_info;
+
+ /**
+ * Building owners.
+ */
+ std::vector<owner_type> ow_info;
+
+ /**
+ * Player classes.
+ */
+ std::vector<player_class> class_info;
+
+ /**
+ * Player races.
+ */
+ std::vector<player_race> race_info;
+
+ /**
+ * Player subraces.
+ */
+ std::vector<player_race_mod> race_mod_info;
+
+ /**
+ * Player skills
+ */
+ std::vector<skill_descriptor> s_descriptors;
+
+ /*
+ * The monster races
+ */
+ std::vector<monster_race> r_info;
+
+ /**
+ * Monster race egos
+ */
+ std::vector<monster_ego> re_info;
+
+ /*
+ * Terrain features
+ */
+ std::vector<feature_type> f_info;
+
+ /**
+ * Wilderness features
+ */
+ std::vector<wilderness_type_info> wf_info;
+
+ /**
+ * Base skills for all characters.
+ */
+ skill_modifiers gen_skill;
+
+ /**
+ * Player abilities.
+ */
+ std::vector<ability_type> ab_info;
+
+};
diff --git a/src/game_edit_data_fwd.hpp b/src/game_edit_data_fwd.hpp
new file mode 100644
index 00000000..3c986dfa
--- /dev/null
+++ b/src/game_edit_data_fwd.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+struct GameEditData;
diff --git a/src/game_fwd.hpp b/src/game_fwd.hpp
new file mode 100644
index 00000000..840e5f3b
--- /dev/null
+++ b/src/game_fwd.hpp
@@ -0,0 +1,4 @@
+#pragma once
+
+struct Game;
+extern Game *game;
diff --git a/src/gen_evol.cc b/src/gen_evol.cc
index 6f3fbcba..7dca5b9a 100644
--- a/src/gen_evol.cc
+++ b/src/gen_evol.cc
@@ -10,7 +10,9 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "generate.hpp"
#include "levels.hpp"
#include "player_type.hpp"
@@ -22,6 +24,8 @@
*/
void evolve_level(bool_ noise)
{
+ auto const &f_info = game->edit_data.f_info;
+
int i, j;
int cw = 0, cf = 0;
@@ -34,8 +38,8 @@ void evolve_level(bool_ noise)
{
for (j = 1; j < cur_hgt - 1; j++)
{
- if (f_info[cave[j][i].feat].flags1 & FF1_WALL) cw++;
- if (f_info[cave[j][i].feat].flags1 & FF1_FLOOR) cf++;
+ if (f_info[cave[j][i].feat].flags & FF_WALL) cw++;
+ if (f_info[cave[j][i].feat].flags & FF_FLOOR) cf++;
}
}
@@ -49,7 +53,7 @@ void evolve_level(bool_ noise)
c_ptr = &cave[j][i];
/* Permanent features should stay */
- if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) continue;
+ if (f_info[c_ptr->feat].flags & FF_PERMANENT) continue;
/* Avoid evolving grids with object or monster */
if ((!c_ptr->o_idxs.empty()) || c_ptr->m_idx) continue;
@@ -83,7 +87,7 @@ void evolve_level(bool_ noise)
c_ptr = &cave[j][i];
/* Permanent features should stay */
- if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) continue;
+ if (f_info[c_ptr->feat].flags & FF_PERMANENT) continue;
/* Avoid evolving grids with object or monster */
if ((!c_ptr->o_idxs.empty()) || c_ptr->m_idx) continue;
@@ -101,7 +105,7 @@ void evolve_level(bool_ noise)
for (y = j - 1; y <= j + 1; y++)
{
if ((x == i) && (y == j)) continue;
- if (f_info[cave[y][x].feat].flags1 & FF1_WALL) c++;
+ if (f_info[cave[y][x].feat].flags & FF_WALL) c++;
}
}
@@ -112,7 +116,7 @@ void evolve_level(bool_ noise)
/* Starved or suffocated */
if ((c < 4) || (c >= 7))
{
- if (f_info[c_ptr->feat].flags1 & FF1_WALL)
+ if (f_info[c_ptr->feat].flags & FF_WALL)
{
place_floor(j, i);
}
@@ -121,7 +125,7 @@ void evolve_level(bool_ noise)
/* Spawned */
else if ((c == 4) || (c == 5))
{
- if (!(f_info[c_ptr->feat].flags1 & FF1_WALL))
+ if (!(f_info[c_ptr->feat].flags & FF_WALL))
{
place_filler(j, i);
}
diff --git a/src/gen_evol.hpp b/src/gen_evol.hpp
index 65b1320d..6e5087c8 100644
--- a/src/gen_evol.hpp
+++ b/src/gen_evol.hpp
@@ -2,5 +2,5 @@
#include "h-basic.h"
-extern bool_ level_generate_life();
-extern void evolve_level(bool_ noise);
+bool_ level_generate_life();
+void evolve_level(bool_ noise);
diff --git a/src/gen_maze.hpp b/src/gen_maze.hpp
index 28c092e3..bc03b575 100644
--- a/src/gen_maze.hpp
+++ b/src/gen_maze.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-extern bool_ level_generate_maze();
+bool_ level_generate_maze();
diff --git a/src/generate.cc b/src/generate.cc
index b5733682..ba485faf 100644
--- a/src/generate.cc
+++ b/src/generate.cc
@@ -12,7 +12,10 @@
#include "cave.hpp"
#include "cave_type.hpp"
#include "dungeon_info_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_build_room1_in.hpp"
#include "hooks.hpp"
#include "init1.hpp"
@@ -20,8 +23,11 @@
#include "loadsave.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_type.hpp"
@@ -29,7 +35,6 @@
#include "spells1.hpp"
#include "tables.hpp"
#include "town_type.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "variable.hpp"
#include "vault_type.hpp"
@@ -192,7 +197,6 @@
* Hack -- Dungeon allocation "types"
*/
#define ALLOC_TYP_RUBBLE 1 /* Rubble */
-#define ALLOC_TYP_TRAP 3 /* Trap */
#define ALLOC_TYP_GOLD 4 /* Gold */
#define ALLOC_TYP_OBJECT 5 /* Object */
#define ALLOC_TYP_ALTAR 6 /* Altar */
@@ -406,7 +410,7 @@ static void place_up_stairs(int y, int x)
cave_type *c_ptr = &cave[y][x];
/* Create up stairs */
- if ((rand_int(3) != 0) || (dungeon_flags2 & DF2_NO_SHAFT))
+ if ((rand_int(3) != 0) || (dungeon_flags & DF_NO_SHAFT))
{
cave_set_feat(y, x, FEAT_LESS);
}
@@ -420,23 +424,12 @@ static void place_up_stairs(int y, int x)
/*
- * Convert existing terrain type to "down stairs" with dungeon changing.
- */
-static void place_magical_stairs(int y, int x, byte next)
-{
- cave_type *c_ptr = &cave[y][x];
-
- /* Create up stairs */
- cave_set_feat(y, x, FEAT_MORE);
- c_ptr->special = next;
-}
-
-
-/*
* Convert existing terrain type to "down stairs"
*/
static void place_down_stairs(int y, int x)
{
+ auto const &d_info = game->edit_data.d_info;
+
cave_type *c_ptr = &cave[y][x];
/*
@@ -444,7 +437,7 @@ static void place_down_stairs(int y, int x)
* All thoses tests are necesary because a shaft can jump up to 4 levels
*/
if ((dun_level + 4 > d_info[dungeon_type].maxdepth) ||
- (rand_int(3) != 0) || (dungeon_flags2 & DF2_NO_SHAFT))
+ (rand_int(3) != 0) || (dungeon_flags & DF_NO_SHAFT))
{
cave_set_feat(y, x, FEAT_MORE);
}
@@ -463,7 +456,9 @@ static void place_down_stairs(int y, int x)
*/
static bool_ is_safe_floor(int y, int x)
{
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto const &d_info = game->edit_data.d_info;
+
+ auto d_ptr = &d_info[dungeon_type];
byte feat = cave[y][x].feat;
/* One of the legal floor types */
@@ -481,6 +476,8 @@ static bool_ is_safe_floor(int y, int x)
*/
void place_new_way(int *y, int *x)
{
+ auto const &f_info = game->edit_data.f_info;
+
int xx, yy;
int x0, x1, x2;
int y0, y1, y2;
@@ -569,8 +566,8 @@ void place_new_way(int *y, int *x)
if (c_ptr->info & (CAVE_ICKY)) continue;
/* Reject permanent features */
- if ((f_info[c_ptr->feat].flags1 & (FF1_PERMANENT)) &&
- (f_info[c_ptr->feat].flags1 & (FF1_FLOOR))) continue;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT) &&
+ (f_info[c_ptr->feat].flags & FF_FLOOR)) continue;
/* Reject room walls */
if ((c_ptr->info & (CAVE_ROOM)) &&
@@ -719,7 +716,7 @@ bool_ new_player_spot(int branch)
int max_attempts = 5000;
/* Place the player */
- if (dungeon_flags1 & DF1_FLAT)
+ if (dungeon_flags & DF_FLAT)
{
place_new_way(&y, &x);
}
@@ -752,13 +749,13 @@ bool_ new_player_spot(int branch)
p_ptr->px = x;
/* XXX XXX XXX */
- if (dungeon_stair && !(dungeon_flags2 & DF2_NO_STAIR) && dun_level &&
+ if (options->dungeon_stair && !(dungeon_flags & DF_NO_STAIR) && dun_level &&
(!is_quest(dun_level) || (old_dun_level < dun_level)) && !branch)
{
if (old_dun_level < dun_level)
{
place_up_stairs(p_ptr->py , p_ptr->px);
- if (dungeon_flags1 & DF1_FLAT)
+ if (dungeon_flags & DF_FLAT)
{
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_WAY_LESS);
}
@@ -766,7 +763,7 @@ bool_ new_player_spot(int branch)
else
{
place_down_stairs(p_ptr->py , p_ptr->px);
- if (dungeon_flags1 & DF1_FLAT)
+ if (dungeon_flags & DF_FLAT)
{
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_WAY_MORE);
}
@@ -787,12 +784,14 @@ bool_ new_player_spot(int branch)
*/
static int next_to_walls(int y, int x)
{
- int k = 0;
+ auto const &f_info = game->edit_data.f_info;
- if (f_info[cave[y + 1][x].feat].flags1 & FF1_WALL) k++;
- if (f_info[cave[y - 1][x].feat].flags1 & FF1_WALL) k++;
- if (f_info[cave[y][x + 1].feat].flags1 & FF1_WALL) k++;
- if (f_info[cave[y][x - 1].feat].flags1 & FF1_WALL) k++;
+ int k = 0;
+
+ if (f_info[cave[y + 1][x].feat].flags & FF_WALL) k++;
+ if (f_info[cave[y - 1][x].feat].flags & FF_WALL) k++;
+ if (f_info[cave[y][x + 1].feat].flags & FF_WALL) k++;
+ if (f_info[cave[y][x - 1].feat].flags & FF_WALL) k++;
return (k);
}
@@ -824,19 +823,28 @@ static void place_altar(int y, int x)
*/
static void place_fountain(int y, int x)
{
+ auto const &k_info = game->edit_data.k_info;
+
cave_type *c_ptr = &cave[y][x];
- int svals[SV_POTION_LAST + SV_POTION2_LAST + 1], maxsval = 0, k;
+ int svals[SV_POTION_LAST + SV_POTION2_LAST + 1];
+ int maxsval = 0;
/* List of usable svals */
- for (k = 1; k < max_k_idx; k++)
+ for (auto const &k_ref: k_info)
{
- object_kind *k_ptr = &k_info[k];
+ auto k_ptr = &k_ref;
if (((k_ptr->tval == TV_POTION) || (k_ptr->tval == TV_POTION2)) &&
- (k_ptr->level <= dun_level) && (k_ptr->flags4 & TR4_FOUNTAIN))
+ (k_ptr->level <= dun_level) && (k_ptr->flags & TR_FOUNTAIN))
{
- if (k_ptr->tval == TV_POTION2) svals[maxsval] = k_ptr->sval + SV_POTION_LAST;
- else svals[maxsval] = k_ptr->sval;
+ if (k_ptr->tval == TV_POTION2)
+ {
+ svals[maxsval] = k_ptr->sval + SV_POTION_LAST;
+ }
+ else
+ {
+ svals[maxsval] = k_ptr->sval;
+ }
maxsval++;
}
}
@@ -893,6 +901,8 @@ static void place_between(int y, int x)
*/
static void place_random_stairs(int y, int x)
{
+ auto const &d_info = game->edit_data.d_info;
+
/* Paranoia */
if (!cave_clean_bold(y, x)) return;
@@ -907,14 +917,7 @@ static void place_random_stairs(int y, int x)
}
else if (dun_level >= d_info[dungeon_type].maxdepth)
{
- if (d_info[dungeon_type].next)
- {
- place_magical_stairs(y, x, d_info[dungeon_type].next);
- }
- else
- {
- place_up_stairs(y, x);
- }
+ place_up_stairs(y, x);
}
else if (rand_int(100) < 50)
{
@@ -938,45 +941,6 @@ static void place_locked_door(int y, int x)
/*
- * Place a secret door at the given location
- */
-static void place_secret_door(int y, int x)
-{
- cave_type *c_ptr = &cave[y][x];
-
- /* Vaults */
- if (c_ptr->info & CAVE_ICKY)
- {
- c_ptr->mimic = FEAT_WALL_INNER;
- }
-
- /* Ordinary room -- use current outer or inner wall */
- else if (c_ptr->info & CAVE_ROOM)
- {
- /* Determine if it's inner or outer XXX XXX XXX */
- if ((cave[y - 1][x].info & CAVE_ROOM) &&
- (cave[y + 1][x].info & CAVE_ROOM) &&
- (cave[y][x - 1].info & CAVE_ROOM) &&
- (cave[y][x + 1].info & CAVE_ROOM))
- {
- c_ptr->mimic = feat_wall_inner;
- }
- else
- {
- c_ptr->mimic = feat_wall_outer;
- }
- }
- else
- {
- c_ptr->mimic = fill_type[rand_int(100)];
- }
-
- /* Create secret door */
- cave_set_feat(y, x, FEAT_SECRET);
-}
-
-
-/*
* Place a random type of door at the given location
*/
static void place_random_door(int y, int x)
@@ -1000,11 +964,11 @@ static void place_random_door(int y, int x)
cave_set_feat(y, x, FEAT_BROKEN);
}
- /* Secret doors (200/1000) */
+ /* Secret doors (200/1000) - now locked instead */
else if (tmp < 600)
{
- /* Create secret door */
- place_secret_door(y, x);
+ /* Create locked door */
+ place_locked_door(y, x);
}
/* Closed doors (300/1000) */
@@ -1036,6 +1000,8 @@ static void place_random_door(int y, int x)
*/
static void alloc_stairs(int feat, int num, int walls, int branch)
{
+ auto const &d_info = game->edit_data.d_info;
+
int y, x, i, j, cnt;
/* Place "num" stairs */
@@ -1044,7 +1010,7 @@ static void alloc_stairs(int feat, int num, int walls, int branch)
/* Try several times, then decrease "walls" */
for (j = 0; j <= SAFE_MAX_ATTEMPTS; j++)
{
- if (dungeon_flags1 & DF1_FLAT)
+ if (dungeon_flags & DF_FLAT)
{
place_new_way(&y, &x);
}
@@ -1065,11 +1031,11 @@ static void alloc_stairs(int feat, int num, int walls, int branch)
if (!dun_level)
{
/* Clear previous contents, add down stairs */
- if (dungeon_flags1 & DF1_FLAT)
+ if (dungeon_flags & DF_FLAT)
{
cave_set_feat(y, x, FEAT_WAY_MORE);
}
- else if ((rand_int(3) == 0) && (!(dungeon_flags2 & DF2_NO_SHAFT)))
+ else if ((rand_int(3) == 0) && (!(dungeon_flags & DF_NO_SHAFT)))
{
cave_set_feat(y, x, FEAT_SHAFT_DOWN);
}
@@ -1082,14 +1048,14 @@ static void alloc_stairs(int feat, int num, int walls, int branch)
/* Quest -- must go up */
else if ((is_quest(dun_level) && (dun_level >= 1)) ||
((dun_level >= d_info[dungeon_type].maxdepth) &&
- (!(dungeon_flags1 & DF1_FORCE_DOWN))))
+ (!(dungeon_flags & DF_FORCE_DOWN))))
{
/* Clear previous contents, add up stairs */
- if (dungeon_flags1 & DF1_FLAT)
+ if (dungeon_flags & DF_FLAT)
{
cave_set_feat(y, x, FEAT_WAY_LESS);
}
- else if ((rand_int(3) == 0) && (!(dungeon_flags2 & DF2_NO_SHAFT)))
+ else if ((rand_int(3) == 0) && (!(dungeon_flags & DF_NO_SHAFT)))
{
cave_set_feat(y, x, FEAT_SHAFT_UP);
}
@@ -1163,7 +1129,7 @@ static void alloc_object(int set, int typ, int num)
if (dummy >= SAFE_MAX_ATTEMPTS)
{
- if (cheat_room)
+ if (options->cheat_room)
{
msg_format("Warning! Could not place object, type : %d!", typ);
}
@@ -1181,12 +1147,6 @@ static void alloc_object(int set, int typ, int num)
break;
}
- case ALLOC_TYP_TRAP:
- {
- place_trap(y, x);
- break;
- }
-
case ALLOC_TYP_GOLD:
{
place_gold(y, x);
@@ -1427,6 +1387,8 @@ static void add_river(int feat1, int feat2)
*/
static void build_streamer(int feat, int chance)
{
+ auto const &d_info = game->edit_data.d_info;
+
int i, tx, ty;
int y, x, dir;
int dummy = 0;
@@ -1484,7 +1446,7 @@ static void build_streamer(int feat, int chance)
if (dummy >= SAFE_MAX_ATTEMPTS)
{
- if (cheat_room)
+ if (options->cheat_room)
{
msg_print("Warning! Could not place streamer!");
}
@@ -1510,6 +1472,8 @@ static void build_streamer(int feat, int chance)
*/
static void build_streamer2(int feat, int killwall)
{
+ auto const &f_info = game->edit_data.f_info;
+
int i, j, mid, tx, ty;
int y, x, dir;
int poolchance;
@@ -1550,13 +1514,13 @@ static void build_streamer2(int feat, int killwall)
if (c_ptr->info & (CAVE_ICKY)) continue;
/* Reject permanent features */
- if ((f_info[c_ptr->feat].flags1 & (FF1_PERMANENT)) &&
- (f_info[c_ptr->feat].flags1 & (FF1_FLOOR))) continue;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT) &&
+ (f_info[c_ptr->feat].flags & FF_FLOOR)) continue;
/* Avoid converting walls when told so */
if (killwall == 0)
{
- if (f_info[c_ptr->feat].flags1 & FF1_WALL) continue;
+ if (f_info[c_ptr->feat].flags & FF_WALL) continue;
}
/* Clear mimic feature to avoid nasty consequences */
@@ -1613,7 +1577,7 @@ static void build_streamer2(int feat, int killwall)
continue;
/* Only convert non-permanent features */
- if (f_info[cave[ty][tx].feat].flags1 & FF1_PERMANENT) continue;
+ if (f_info[cave[ty][tx].feat].flags & FF_PERMANENT) continue;
/* Clear mimic feature to avoid nasty consequences */
cave[ty][tx].mimic = 0;
@@ -1630,14 +1594,14 @@ static void build_streamer2(int feat, int killwall)
/*
* Build a destroyed level
*/
-static void destroy_level(void)
+static void destroy_level()
{
int y1, x1, y, x, k, t, n;
cave_type *c_ptr;
/* Note destroyed levels */
- if ((cheat_room) || (p_ptr->precognition)) msg_print("Destroyed Level");
+ if ((options->cheat_room) || (p_ptr->precognition)) msg_print("Destroyed Level");
/* Drop a few epi-centers (usually about two) */
for (n = 0; n < randint(5); n++)
@@ -1727,11 +1691,13 @@ static void destroy_level(void)
*/
static bool_ get_is_floor(int x, int y)
{
+ auto const &f_info = game->edit_data.f_info;
+
/* Out of bounds */
if (!in_bounds(y, x)) return (FALSE);
/* Do the real check: */
- if (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) return (TRUE);
+ if (f_info[cave[y][x].feat].flags & FF_FLOOR) return (TRUE);
return (FALSE);
}
@@ -1746,7 +1712,7 @@ static void check_room_boundary(int x1, int y1, int x2, int y2)
bool_ old_is_floor, new_is_floor;
/* Avoid doing this in irrelevant places -- pelpel */
- if (!(dungeon_flags1 & DF1_CAVERN)) return;
+ if (!(dungeon_flags & DF_CAVERN)) return;
/* Initialize */
count = 0;
@@ -1847,7 +1813,7 @@ static void vault_objects(int y, int x, int num)
if (dummy >= SAFE_MAX_ATTEMPTS)
{
- if (cheat_room)
+ if (options->cheat_room)
{
msg_print("Warning! Could not place vault object!");
}
@@ -1877,61 +1843,6 @@ static void vault_objects(int y, int x, int num)
/*
- * Place a trap with a given displacement of point
- */
-static void vault_trap_aux(int y, int x, int yd, int xd)
-{
- int count = 0, y1 = y, x1 = x;
- int dummy = 0;
-
- /* Place traps */
- for (count = 0; count <= 5; count++)
- {
- /* Get a location */
- while (dummy < SAFE_MAX_ATTEMPTS)
- {
- y1 = rand_spread(y, yd);
- x1 = rand_spread(x, xd);
- dummy++;
- if (in_bounds(y1, x1)) break;
- }
-
- if (dummy >= SAFE_MAX_ATTEMPTS)
- {
- if (cheat_room)
- {
- msg_print("Warning! Could not place vault trap!");
- }
- }
-
-
- /* Require "naked" floor grids */
- if (!cave_naked_bold(y1, x1)) continue;
-
- /* Place the trap */
- place_trap(y1, x1);
-
- /* Done */
- break;
- }
-}
-
-
-/*
- * Place some traps with a given displacement of given location
- */
-static void vault_traps(int y, int x, int yd, int xd, int num)
-{
- int i;
-
- for (i = 0; i < num; i++)
- {
- vault_trap_aux(y, x, yd, xd);
- }
-}
-
-
-/*
* Hack -- Place some sleeping monsters near the given location
*/
static void vault_monsters(int y1, int x1, int num)
@@ -1954,7 +1865,7 @@ static void vault_monsters(int y1, int x1, int num)
/* Place the monster (allow groups) */
monster_level = dun_level + 2;
- (void)place_monster(y, x, TRUE, TRUE);
+ place_monster(y, x, TRUE, TRUE);
monster_level = dun_level;
}
}
@@ -2277,20 +2188,20 @@ static void build_type3(int by0, int bx0)
/* Build the vault */
build_rectangle(y1b, x1a, y2b, x2a, feat_wall_inner, info);
- /* Place a secret door on the inner room */
+ /* Place a locked door on the inner room */
switch (rand_int(4))
{
case 0:
- place_secret_door(y1b, xval);
+ place_locked_door(y1b, xval);
break;
case 1:
- place_secret_door(y2b, xval);
+ place_locked_door(y2b, xval);
break;
case 2:
- place_secret_door(yval, x1a);
+ place_locked_door(yval, x1a);
break;
case 3:
- place_secret_door(yval, x2a);
+ place_locked_door(yval, x2a);
break;
}
@@ -2300,9 +2211,6 @@ static void build_type3(int by0, int bx0)
/* Let's guard the treasure well */
vault_monsters(yval, xval, rand_int(2) + 3);
- /* Traps naturally */
- vault_traps(yval, xval, 4, 4, rand_int(3) + 2);
-
break;
}
@@ -2328,13 +2236,13 @@ static void build_type3(int by0, int bx0)
cave_set_feat(y2b + 1, x, feat_wall_inner);
}
- /* Sometimes shut using secret doors */
+ /* Sometimes shut using locked doors */
if (rand_int(3) == 0)
{
- place_secret_door(yval, x1a - 1);
- place_secret_door(yval, x2a + 1);
- place_secret_door(y1b - 1, xval);
- place_secret_door(y2b + 1, xval);
+ place_locked_door(yval, x1a - 1);
+ place_locked_door(yval, x2a + 1);
+ place_locked_door(y1b - 1, xval);
+ place_locked_door(y2b + 1, xval);
}
}
@@ -2414,20 +2322,20 @@ static void build_type4(int by0, int bx0)
/* Just an inner room with a monster */
case 1:
{
- /* Place a secret door */
+ /* Place a locked door */
switch (randint(4))
{
case 1:
- place_secret_door(y1 - 1, xval);
+ place_locked_door(y1 - 1, xval);
break;
case 2:
- place_secret_door(y2 + 1, xval);
+ place_locked_door(y2 + 1, xval);
break;
case 3:
- place_secret_door(yval, x1 - 1);
+ place_locked_door(yval, x1 - 1);
break;
case 4:
- place_secret_door(yval, x2 + 1);
+ place_locked_door(yval, x2 + 1);
break;
}
@@ -2440,20 +2348,20 @@ static void build_type4(int by0, int bx0)
/* Treasure Vault (with a door) */
case 2:
{
- /* Place a secret door */
+ /* Place a locked door */
switch (randint(4))
{
case 1:
- place_secret_door(y1 - 1, xval);
+ place_locked_door(y1 - 1, xval);
break;
case 2:
- place_secret_door(y2 + 1, xval);
+ place_locked_door(y2 + 1, xval);
break;
case 3:
- place_secret_door(yval, x1 - 1);
+ place_locked_door(yval, x1 - 1);
break;
case 4:
- place_secret_door(yval, x2 + 1);
+ place_locked_door(yval, x2 + 1);
break;
}
@@ -2493,29 +2401,26 @@ static void build_type4(int by0, int bx0)
place_random_stairs(yval, xval);
}
- /* Traps to protect the treasure */
- vault_traps(yval, xval, 4, 10, 2 + randint(3));
-
break;
}
/* Inner pillar(s). */
case 3:
{
- /* Place a secret door */
+ /* Place a locked door */
switch (randint(4))
{
case 1:
- place_secret_door(y1 - 1, xval);
+ place_locked_door(y1 - 1, xval);
break;
case 2:
- place_secret_door(y2 + 1, xval);
+ place_locked_door(y2 + 1, xval);
break;
case 3:
- place_secret_door(yval, x1 - 1);
+ place_locked_door(yval, x1 - 1);
break;
case 4:
- place_secret_door(yval, x2 + 1);
+ place_locked_door(yval, x2 + 1);
break;
}
@@ -2559,9 +2464,9 @@ static void build_type4(int by0, int bx0)
cave_set_feat(yval, xval - 5, feat_wall_inner);
cave_set_feat(yval, xval + 5, feat_wall_inner);
- /* Secret doors (random top/bottom) */
- place_secret_door(yval - 3 + (randint(2) * 2), xval - 3);
- place_secret_door(yval - 3 + (randint(2) * 2), xval + 3);
+ /* Locked doors (random top/bottom) */
+ place_locked_door(yval - 3 + (randint(2) * 2), xval - 3);
+ place_locked_door(yval - 3 + (randint(2) * 2), xval + 3);
/* Monsters */
vault_monsters(yval, xval - 2, randint(2));
@@ -2578,20 +2483,20 @@ static void build_type4(int by0, int bx0)
/* Maze inside. */
case 4:
{
- /* Place a secret door */
+ /* Place a locked door */
switch (randint(4))
{
case 1:
- place_secret_door(y1 - 1, xval);
+ place_locked_door(y1 - 1, xval);
break;
case 2:
- place_secret_door(y2 + 1, xval);
+ place_locked_door(y2 + 1, xval);
break;
case 3:
- place_secret_door(yval, x1 - 1);
+ place_locked_door(yval, x1 - 1);
break;
case 4:
- place_secret_door(yval, x2 + 1);
+ place_locked_door(yval, x2 + 1);
break;
}
@@ -2611,10 +2516,6 @@ static void build_type4(int by0, int bx0)
vault_monsters(yval, xval - 5, randint(3));
vault_monsters(yval, xval + 5, randint(3));
- /* Traps make them entertaining. */
- vault_traps(yval, xval - 3, 2, 8, randint(3));
- vault_traps(yval, xval + 3, 2, 8, randint(3));
-
/* Mazes should have some treasure too. */
vault_objects(yval, xval, 3);
@@ -2639,18 +2540,18 @@ static void build_type4(int by0, int bx0)
if (rand_int(100) < 50)
{
int i = randint(10);
- place_secret_door(y1 - 1, xval - i);
- place_secret_door(y1 - 1, xval + i);
- place_secret_door(y2 + 1, xval - i);
- place_secret_door(y2 + 1, xval + i);
+ place_locked_door(y1 - 1, xval - i);
+ place_locked_door(y1 - 1, xval + i);
+ place_locked_door(y2 + 1, xval - i);
+ place_locked_door(y2 + 1, xval + i);
}
else
{
int i = randint(3);
- place_secret_door(yval + i, x1 - 1);
- place_secret_door(yval - i, x1 - 1);
- place_secret_door(yval + i, x2 + 1);
- place_secret_door(yval - i, x2 + 1);
+ place_locked_door(yval + i, x1 - 1);
+ place_locked_door(yval - i, x1 - 1);
+ place_locked_door(yval + i, x2 + 1);
+ place_locked_door(yval - i, x2 + 1);
}
/* Treasure, centered at the center of the cross */
@@ -2689,13 +2590,15 @@ static void build_type4(int by0, int bx0)
*/
static bool_ vault_aux_jelly(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Also decline evil jellies (like death molds and shoggoths) */
- if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE);
+ if (r_ptr->flags & RF_EVIL) return (FALSE);
/* Require icky thing, jelly, mold, or mushroom */
if (!strchr("ijm,", r_ptr->d_char)) return (FALSE);
@@ -2710,13 +2613,15 @@ static bool_ vault_aux_jelly(int r_idx)
*/
static bool_ vault_aux_animal(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Require "animal" flag */
- if (!(r_ptr->flags3 & (RF3_ANIMAL))) return (FALSE);
+ if (!(r_ptr->flags & RF_ANIMAL)) return (FALSE);
/* Okay */
return (TRUE);
@@ -2728,13 +2633,15 @@ static bool_ vault_aux_animal(int r_idx)
*/
static bool_ vault_aux_undead(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Require Undead */
- if (!(r_ptr->flags3 & (RF3_UNDEAD))) return (FALSE);
+ if (!(r_ptr->flags & RF_UNDEAD)) return (FALSE);
/* Okay */
return (TRUE);
@@ -2746,10 +2653,12 @@ static bool_ vault_aux_undead(int r_idx)
*/
static bool_ vault_aux_chapel(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Require "priest" or Angel */
if (!((r_ptr->d_char == 'A') || strstr(r_ptr->name, "riest")))
@@ -2767,10 +2676,12 @@ static bool_ vault_aux_chapel(int r_idx)
*/
static bool_ vault_aux_kennel(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Require a Zephyr Hound or a dog */
return ((r_ptr->d_char == 'Z') || (r_ptr->d_char == 'C'));
@@ -2783,10 +2694,12 @@ static bool_ vault_aux_kennel(int r_idx)
*/
static bool_ vault_aux_treasure(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Require "priest" or Angel */
if (!((r_ptr->d_char == '!') || (r_ptr->d_char == '|') ||
@@ -2815,8 +2728,10 @@ static bool_ vault_aux_clone(int r_idx)
*/
static bool_ vault_aux_symbol(int r_idx)
{
+ auto const &r_info = game->edit_data.r_info;
+
return ((r_info[r_idx].d_char == (r_info[template_race].d_char))
- && !(r_info[r_idx].flags1 & RF1_UNIQUE));
+ && !(r_info[r_idx].flags & RF_UNIQUE));
}
@@ -2825,10 +2740,12 @@ static bool_ vault_aux_symbol(int r_idx)
*/
static bool_ vault_aux_orc(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Hack -- Require "o" monsters */
if (!strchr("o", r_ptr->d_char)) return (FALSE);
@@ -2844,10 +2761,12 @@ static bool_ vault_aux_orc(int r_idx)
*/
static bool_ vault_aux_troll(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Hack -- Require "T" monsters */
if (!strchr("T", r_ptr->d_char)) return (FALSE);
@@ -2862,10 +2781,12 @@ static bool_ vault_aux_troll(int r_idx)
*/
static bool_ vault_aux_giant(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Hack -- Require "P" monsters */
if (!strchr("P", r_ptr->d_char)) return (FALSE);
@@ -2876,41 +2797,16 @@ static bool_ vault_aux_giant(int r_idx)
/*
- * Hack -- breath type for "vault_aux_dragon()"
- */
-static u32b vault_aux_dragon_mask4;
-
-
-/*
- * Helper function for "monster pit (dragon)"
- */
-static bool_ vault_aux_dragon(int r_idx)
-{
- monster_race *r_ptr = &r_info[r_idx];
-
- /* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
-
- /* Hack -- Require "d" or "D" monsters */
- if (!strchr("Dd", r_ptr->d_char)) return (FALSE);
-
- /* Hack -- Require correct "breath attack" */
- if (r_ptr->flags4 != vault_aux_dragon_mask4) return (FALSE);
-
- /* Okay */
- return (TRUE);
-}
-
-
-/*
* Helper function for "monster pit (demon)"
*/
static bool_ vault_aux_demon(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Decline unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Hack -- Require "U" monsters */
if (!strchr("U", r_ptr->d_char)) return (FALSE);
@@ -2946,6 +2842,8 @@ static bool_ vault_aux_demon(int r_idx)
*/
static void build_type5(int by0, int bx0)
{
+ auto const &r_info = game->edit_data.r_info;
+
int y, x, y1, x1, y2, x2, xval, yval;
int tmp, i;
cptr name;
@@ -2984,20 +2882,20 @@ static void build_type5(int by0, int bx0)
/* The inner walls */
build_rectangle(y1 - 1, x1 - 1, y2 + 1, x2 + 1, feat_wall_inner, CAVE_ROOM);
- /* Place a secret door */
+ /* Place a locked door */
switch (randint(4))
{
case 1:
- place_secret_door(y1 - 1, xval);
+ place_locked_door(y1 - 1, xval);
break;
case 2:
- place_secret_door(y2 + 1, xval);
+ place_locked_door(y2 + 1, xval);
break;
case 3:
- place_secret_door(yval, x1 - 1);
+ place_locked_door(yval, x1 - 1);
break;
case 4:
- place_secret_door(yval, x2 + 1);
+ place_locked_door(yval, x2 + 1);
break;
}
@@ -3010,10 +2908,10 @@ static void build_type5(int by0, int bx0)
{
while (1)
{
- template_race = randint(max_r_idx - 2);
+ template_race = rand_int(r_info.size());
/* Reject uniques */
- if (r_info[template_race].flags1 & RF1_UNIQUE) continue;
+ if (r_info[template_race].flags & RF_UNIQUE) continue;
/* Reject OoD monsters in a loose fashion */
if (((r_info[template_race].level) + randint(5)) >
@@ -3109,7 +3007,7 @@ static void build_type5(int by0, int bx0)
if (empty) return;
/* Describe */
- if (cheat_room || p_ptr->precognition)
+ if (options->cheat_room || p_ptr->precognition)
{
/* Room type */
msg_format("Monster nest (%s)", name);
@@ -3132,7 +3030,7 @@ static void build_type5(int by0, int bx0)
int r_idx = what[rand_int(64)];
/* Place that "random" monster (no groups) */
- (void)place_monster_aux(y, x, r_idx, FALSE, FALSE, MSTATUS_ENEMY);
+ place_monster_aux(y, x, r_idx, FALSE, FALSE, MSTATUS_ENEMY);
}
}
}
@@ -3184,6 +3082,8 @@ static void build_type5(int by0, int bx0)
*/
static void build_type6(int by0, int bx0)
{
+ auto const &r_info = game->edit_data.r_info;
+
int tmp, what[16];
int i, j, y, x, y1, x1, y2, x2, xval, yval;
bool_ empty = FALSE;
@@ -3221,20 +3121,20 @@ static void build_type6(int by0, int bx0)
/* The inner walls */
build_rectangle(y1 - 1, x1 - 1, y2 + 1, x2 + 1, feat_wall_outer, CAVE_ROOM);
- /* Place a secret door */
+ /* Place a locked door */
switch (randint(4))
{
case 1:
- place_secret_door(y1 - 1, xval);
+ place_locked_door(y1 - 1, xval);
break;
case 2:
- place_secret_door(y2 + 1, xval);
+ place_locked_door(y2 + 1, xval);
break;
case 3:
- place_secret_door(yval, x1 - 1);
+ place_locked_door(yval, x1 - 1);
break;
case 4:
- place_secret_door(yval, x2 + 1);
+ place_locked_door(yval, x2 + 1);
break;
}
@@ -3282,9 +3182,9 @@ static void build_type6(int by0, int bx0)
do
{
- template_race = randint(max_r_idx - 2);
+ template_race = rand_int(r_info.size() - 1);
}
- while ((r_info[template_race].flags1 & RF1_UNIQUE)
+ while ((r_info[template_race].flags & RF_UNIQUE)
|| (((r_info[template_race].level) + randint(5)) >
(dun_level + randint(5))));
@@ -3302,93 +3202,73 @@ static void build_type6(int by0, int bx0)
/* Dragon pit */
else if (tmp < 80)
{
+ /* Hack - get_mon_num_hook needs a plain function */
+ static monster_spell_flag_set mask;
+
/* Pick dragon type */
switch (rand_int(6))
{
- /* Black */
case 0:
{
- /* Message */
name = "acid dragon";
-
- /* Restrict dragon breath type */
- vault_aux_dragon_mask4 = RF4_BR_ACID;
-
- /* Done */
+ mask = SF_BR_ACID;
break;
}
-
- /* Blue */
case 1:
{
- /* Message */
name = "electric dragon";
-
- /* Restrict dragon breath type */
- vault_aux_dragon_mask4 = RF4_BR_ELEC;
-
- /* Done */
+ mask = SF_BR_ELEC;
break;
}
- /* Red */
case 2:
{
- /* Message */
name = "fire dragon";
-
- /* Restrict dragon breath type */
- vault_aux_dragon_mask4 = RF4_BR_FIRE;
-
- /* Done */
+ mask = SF_BR_FIRE;
break;
}
- /* White */
case 3:
{
- /* Message */
name = "cold dragon";
-
- /* Restrict dragon breath type */
- vault_aux_dragon_mask4 = RF4_BR_COLD;
-
- /* Done */
+ mask = SF_BR_COLD;
break;
}
- /* Green */
case 4:
{
- /* Message */
name = "poison dragon";
-
- /* Restrict dragon breath type */
- vault_aux_dragon_mask4 = RF4_BR_POIS;
-
- /* Done */
+ mask = SF_BR_POIS;
break;
}
- /* Multi-hued */
default:
{
- /* Message */
name = "multi-hued dragon";
-
- /* Restrict dragon breath type */
- vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC |
- RF4_BR_FIRE | RF4_BR_COLD |
- RF4_BR_POIS);
-
- /* Done */
+ mask = SF_BR_ACID | SF_BR_ELEC | SF_BR_FIRE | SF_BR_COLD | SF_BR_POIS;
break;
}
}
/* Restrict monster selection */
- get_mon_num_hook = vault_aux_dragon;
+ get_mon_num_hook = [](int r_idx) -> bool_ {
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
+
+ /* Decline unique monsters */
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
+
+ /* Hack -- Require "d" or "D" monsters */
+ if (!strchr("Dd", r_ptr->d_char)) return (FALSE);
+
+ /* Hack -- Require correct "breath attack" */
+ if ((r_ptr->spells & mask) != mask) return (FALSE);
+
+ /* Okay */
+ return (TRUE);
+ };
}
/* Demon pit */
@@ -3454,12 +3334,12 @@ static void build_type6(int by0, int bx0)
}
/* Message */
- if (cheat_room || p_ptr->precognition)
+ if (options->cheat_room || p_ptr->precognition)
{
/* Room type */
msg_format("Monster pit (%s)", name);
- if (cheat_hear || p_ptr->precognition)
+ if (options->cheat_hear || p_ptr->precognition)
{
/* Contents */
for (i = 0; i < 8; i++)
@@ -3532,264 +3412,270 @@ static void build_type6(int by0, int bx0)
/*
* Hack -- fill in "vault" rooms
*/
-static void build_vault(int yval, int xval, int ymax, int xmax, cptr data)
+static void build_vault(int yval, int xval, int ymax, int xmax, std::string const &data)
{
- int dx, dy, x, y, bwy[8], bwx[8], i;
-
- cptr t;
-
- cave_type *c_ptr;
+ int bwy[8], bwx[8];
/* Clean the between gates arrays */
- for (i = 0; i < 8; i++)
+ for (std::size_t i = 0; i < 8; i++)
{
bwy[i] = bwx[i] = 9999;
}
/* Place dungeon features and objects */
- for (t = data, dy = 0; dy < ymax; dy++)
{
- for (dx = 0; dx < xmax; dx++, t++)
+ std::size_t t = 0;
+ for (int dy = 0; dy < ymax; dy++)
{
- /* Extract the location */
- x = xval - (xmax / 2) + dx;
- y = yval - (ymax / 2) + dy;
+ for (int dx = 0; dx < xmax; dx++, t++)
+ {
+ auto d = data[t];
- /* Hack -- skip "non-grids" */
- if (*t == ' ') continue;
+ /* Hack -- skip "non-grids" */
+ if (d == ' ') continue;
- /* Access the grid */
- c_ptr = &cave[y][x];
+ /* Extract the location */
+ int x = xval - (xmax / 2) + dx;
+ int y = yval - (ymax / 2) + dy;
- /* Lay down a floor */
- place_floor(y, x);
+ /* Access the grid */
+ auto c_ptr = &cave[y][x];
- /* Part of a vault */
- c_ptr->info |= (CAVE_ROOM | CAVE_ICKY);
+ /* Lay down a floor */
+ place_floor(y, x);
- /* Analyze the grid */
- switch (*t)
- {
- /* Granite wall (outer) */
- case '%':
- {
- cave_set_feat(y, x, FEAT_WALL_OUTER);
- break;
- }
+ /* Part of a vault */
+ c_ptr->info |= (CAVE_ROOM | CAVE_ICKY);
- /* Granite wall (inner) */
- case '#':
+ /* Analyze the grid */
+ switch (d)
{
- cave_set_feat(y, x, FEAT_WALL_INNER);
- break;
- }
+ /* Granite wall (outer) */
+ case '%':
+ {
+ cave_set_feat(y, x, FEAT_WALL_OUTER);
+ break;
+ }
- /* Permanent wall (inner) */
- case 'X':
- {
- cave_set_feat(y, x, FEAT_PERM_INNER);
- break;
- }
+ /* Granite wall (inner) */
+ case '#':
+ {
+ cave_set_feat(y, x, FEAT_WALL_INNER);
+ break;
+ }
- /* Treasure/trap */
- case '*':
- {
- if (rand_int(100) < 75)
+ /* Permanent wall (inner) */
+ case 'X':
{
- place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT);
+ cave_set_feat(y, x, FEAT_PERM_INNER);
+ break;
}
- else
+
+ /* Treasure/trap */
+ case '*':
{
- place_trap(y, x);
+ if (rand_int(100) < 75)
+ {
+ place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT);
+ }
+ else
+ {
+ /* Do nothing */
+ }
+ break;
}
- break;
- }
- /* Secret doors */
- case '+':
- {
- place_secret_door(y, x);
- break;
- }
+ /* locked doors */
+ case '+':
+ {
+ place_locked_door(y, x);
+ break;
+ }
- /* Trap */
- case '^':
- {
- place_trap(y, x);
- break;
- }
+ /* Trap */
+ case '^':
+ {
+ /* Do nothing */
+ break;
+ }
- /* Glass wall */
- case 'G':
- {
- cave_set_feat(y, x, FEAT_GLASS_WALL);
- break;
- }
+ /* Glass wall */
+ case 'G':
+ {
+ cave_set_feat(y, x, FEAT_GLASS_WALL);
+ break;
+ }
- /* Illusion wall */
- case 'I':
- {
- cave_set_feat(y, x, FEAT_ILLUS_WALL);
- break;
+ /* Illusion wall */
+ case 'I':
+ {
+ cave_set_feat(y, x, FEAT_ILLUS_WALL);
+ break;
+ }
}
}
}
}
/* Place dungeon monsters and objects */
- for (t = data, dy = 0; dy < ymax; dy++)
{
- for (dx = 0; dx < xmax; dx++, t++)
+ std::size_t t = 0;
+ for (int dy = 0; dy < ymax; dy++)
{
- /* Extract the grid */
- x = xval - (xmax / 2) + dx;
- y = yval - (ymax / 2) + dy;
-
- /* Hack -- skip "non-grids" */
- if (*t == ' ') continue;
-
- /* Access the grid */
- c_ptr = &cave[y][x];
-
- /* Analyze the symbol */
- switch (*t)
+ for (int dx = 0; dx < xmax; dx++, t++)
{
- /* Monster */
- case '&':
- {
- monster_level = dun_level + 5;
- place_monster(y, x, TRUE, TRUE);
- monster_level = dun_level;
- break;
- }
+ auto d = data[t];
- /* Meaner monster */
- case '@':
- {
- monster_level = dun_level + 11;
- place_monster(y, x, TRUE, TRUE);
- monster_level = dun_level;
- break;
- }
+ /* Hack -- skip "non-grids" */
+ if (d == ' ') continue;
- /* Meaner monster, plus treasure */
- case '9':
- {
- monster_level = dun_level + 9;
- place_monster(y, x, TRUE, TRUE);
- monster_level = dun_level;
- object_level = dun_level + 7;
- place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT);
- object_level = dun_level;
- break;
- }
+ /* Extract the grid */
+ int x = xval - (xmax / 2) + dx;
+ int y = yval - (ymax / 2) + dy;
- /* Nasty monster and treasure */
- case '8':
- {
- monster_level = dun_level + 40;
- place_monster(y, x, TRUE, TRUE);
- monster_level = dun_level;
- object_level = dun_level + 20;
- place_object(y, x, TRUE, TRUE, OBJ_FOUND_VAULT);
- object_level = dun_level;
- break;
- }
+ /* Access the grid */
+ auto c_ptr = &cave[y][x];
- /* Monster and/or object */
- case ',':
+ /* Analyze the symbol */
+ switch (d)
{
- if (rand_int(100) < 50)
+ /* Monster */
+ case '&':
{
- monster_level = dun_level + 3;
+ monster_level = dun_level + 5;
place_monster(y, x, TRUE, TRUE);
monster_level = dun_level;
+ break;
}
- if (rand_int(100) < 50)
+
+ /* Meaner monster */
+ case '@':
+ {
+ monster_level = dun_level + 11;
+ place_monster(y, x, TRUE, TRUE);
+ monster_level = dun_level;
+ break;
+ }
+
+ /* Meaner monster, plus treasure */
+ case '9':
{
+ monster_level = dun_level + 9;
+ place_monster(y, x, TRUE, TRUE);
+ monster_level = dun_level;
object_level = dun_level + 7;
- place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT);
+ place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT);
object_level = dun_level;
+ break;
}
- break;
- }
- case 'p':
- {
- cave_set_feat(y, x, FEAT_PATTERN_START);
- break;
- }
+ /* Nasty monster and treasure */
+ case '8':
+ {
+ monster_level = dun_level + 40;
+ place_monster(y, x, TRUE, TRUE);
+ monster_level = dun_level;
+ object_level = dun_level + 20;
+ place_object(y, x, TRUE, TRUE, OBJ_FOUND_VAULT);
+ object_level = dun_level;
+ break;
+ }
- case 'a':
- {
- cave_set_feat(y, x, FEAT_PATTERN_1);
- break;
- }
+ /* Monster and/or object */
+ case ',':
+ {
+ if (rand_int(100) < 50)
+ {
+ monster_level = dun_level + 3;
+ place_monster(y, x, TRUE, TRUE);
+ monster_level = dun_level;
+ }
+ if (rand_int(100) < 50)
+ {
+ object_level = dun_level + 7;
+ place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT);
+ object_level = dun_level;
+ }
+ break;
+ }
- case 'b':
- {
- cave_set_feat(y, x, FEAT_PATTERN_2);
- break;
- }
+ case 'p':
+ {
+ cave_set_feat(y, x, FEAT_PATTERN_START);
+ break;
+ }
- case 'c':
- {
- cave_set_feat(y, x, FEAT_PATTERN_3);
- break;
- }
+ case 'a':
+ {
+ cave_set_feat(y, x, FEAT_PATTERN_1);
+ break;
+ }
- case 'd':
- {
- cave_set_feat(y, x, FEAT_PATTERN_4);
- break;
- }
+ case 'b':
+ {
+ cave_set_feat(y, x, FEAT_PATTERN_2);
+ break;
+ }
- case 'P':
- {
- cave_set_feat(y, x, FEAT_PATTERN_END);
- break;
- }
+ case 'c':
+ {
+ cave_set_feat(y, x, FEAT_PATTERN_3);
+ break;
+ }
- case 'B':
- {
- cave_set_feat(y, x, FEAT_PATTERN_XTRA1);
- break;
- }
+ case 'd':
+ {
+ cave_set_feat(y, x, FEAT_PATTERN_4);
+ break;
+ }
- case 'A':
- {
- object_level = dun_level + 12;
- place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT);
- object_level = dun_level;
- break;
- }
+ case 'P':
+ {
+ cave_set_feat(y, x, FEAT_PATTERN_END);
+ break;
+ }
+ case 'B':
+ {
+ cave_set_feat(y, x, FEAT_PATTERN_XTRA1);
+ break;
+ }
- /* Between gates */
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- {
- /* Not found before */
- if (bwy[*t - '0'] == 9999)
+ case 'A':
{
- cave_set_feat(y, x, FEAT_BETWEEN);
- bwy[*t - '0'] = y;
- bwx[*t - '0'] = x;
+ object_level = dun_level + 12;
+ place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT);
+ object_level = dun_level;
+ break;
}
- /* The second time */
- else
+
+
+ /* Between gates */
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
{
- cave_set_feat(y, x, FEAT_BETWEEN);
- c_ptr->special = bwx[*t - '0'] + (bwy[*t - '0'] << 8);
- cave[bwy[*t - '0']][bwx[*t - '0']].special = x + (y << 8);
+ /* Not found before */
+ if (bwy[d - '0'] == 9999)
+ {
+ cave_set_feat(y, x, FEAT_BETWEEN);
+ bwy[d - '0'] = y;
+ bwx[d - '0'] = x;
+ }
+ /* The second time */
+ else
+ {
+ cave_set_feat(y, x, FEAT_BETWEEN);
+ c_ptr->special = bwx[d - '0'] + (bwy[d - '0'] << 8);
+ cave[bwy[d - '0']][bwx[d - '0']].special = x + (y << 8);
+ }
+ break;
}
- break;
}
}
}
@@ -3801,8 +3687,10 @@ static void build_vault(int yval, int xval, int ymax, int xmax, cptr data)
*/
static void build_type7(int by0, int bx0)
{
- vault_type *v_ptr = NULL;
- int dummy = 0, xval, yval;
+ auto const &v_info = game->edit_data.v_info;
+
+ auto v_ptr(v_info.end());
+ int dummy = 0;
/* Pick a lesser vault */
while (dummy < SAFE_MAX_ATTEMPTS)
@@ -3810,22 +3698,27 @@ static void build_type7(int by0, int bx0)
dummy++;
/* Access a random vault record */
- v_ptr = &v_info[rand_int(max_v_idx)];
+ v_ptr = uniform_element(v_info);
/* Accept the first lesser vault */
if (v_ptr->typ == 7) break;
}
/* Try to allocate space for room. If fails, exit */
+ int xval;
+ int yval;
if (!room_alloc(v_ptr->wid, v_ptr->hgt, FALSE, by0, bx0, &xval, &yval))
{
- if (cheat_room) msg_print("Could not allocate this vault here");
+ if (options->cheat_room)
+ {
+ msg_print("Could not allocate this vault here");
+ }
return;
}
if (dummy >= SAFE_MAX_ATTEMPTS)
{
- if (cheat_room)
+ if (options->cheat_room)
{
msg_print("Warning! Could not place lesser vault!");
}
@@ -3834,7 +3727,10 @@ static void build_type7(int by0, int bx0)
/* Message */
- if (cheat_room || p_ptr->precognition) msg_print("Lesser Vault");
+ if (options->cheat_room || p_ptr->precognition)
+ {
+ msg_print("Lesser Vault");
+ }
/* Boost the rating */
rating += v_ptr->rat;
@@ -3857,8 +3753,10 @@ static void build_type7(int by0, int bx0)
*/
static void build_type8(int by0, int bx0)
{
- vault_type *v_ptr = NULL;
- int dummy = 0, xval, yval;
+ auto const &v_info = game->edit_data.v_info;
+
+ auto v_ptr(v_info.end());
+ int dummy = 0;
/* Pick a lesser vault */
while (dummy < SAFE_MAX_ATTEMPTS)
@@ -3866,22 +3764,27 @@ static void build_type8(int by0, int bx0)
dummy++;
/* Access a random vault record */
- v_ptr = &v_info[rand_int(max_v_idx)];
+ v_ptr = uniform_element(v_info);
/* Accept the first greater vault */
if (v_ptr->typ == 8) break;
}
/* Try to allocate space for room. If fails, exit */
+ int xval;
+ int yval;
if (!room_alloc(v_ptr->wid, v_ptr->hgt, FALSE, by0, bx0, &xval, &yval))
{
- if (cheat_room) msg_print("Could not allocate this vault here");
+ if (options->cheat_room)
+ {
+ msg_print("Could not allocate this vault here");
+ }
return;
}
if (dummy >= SAFE_MAX_ATTEMPTS)
{
- if (cheat_room)
+ if (options->cheat_room)
{
msg_print("Warning! Could not place greater vault!");
}
@@ -3890,7 +3793,10 @@ static void build_type8(int by0, int bx0)
/* Message */
- if (cheat_room || p_ptr->precognition) msg_print("Greater Vault");
+ if (options->cheat_room || p_ptr->precognition)
+ {
+ msg_print("Greater Vault");
+ }
/* Boost the rating */
rating += v_ptr->rat;
@@ -4297,6 +4203,8 @@ static void fill_hack(int y0, int x0, int y, int x, int xsize, int ysize,
bool_ generate_fracave(int y0, int x0, int xsize, int ysize,
int cutoff, bool_ light, bool_ room)
{
+ auto const &f_info = game->edit_data.f_info;
+
int x, y, i, amount, xhsize, yhsize;
cave_type *c_ptr;
@@ -4469,7 +4377,7 @@ bool_ generate_fracave(int y0, int x0, int xsize, int ysize,
c_ptr = &cave[y + y0 - yhsize][x + x0 - xhsize];
/* A floor grid to be converted */
- if ((f_info[c_ptr->feat].flags1 & FF1_FLOOR) &&
+ if ((f_info[c_ptr->feat].flags & FF_FLOOR) &&
(c_ptr->info & CAVE_ICKY))
{
@@ -4527,7 +4435,7 @@ bool_ generate_fracave(int y0, int x0, int xsize, int ysize,
/*
* Makes a cave system in the center of the dungeon
*/
-static void build_cavern(void)
+static void build_cavern()
{
int grd, roug, cutoff, xsize, ysize, x0, y0;
bool_ done, light, room;
@@ -4627,30 +4535,30 @@ static void build_small_room(int x0, int y0)
{
build_rectangle(y0 - 1, x0 - 1, y0 + 1, x0 + 1, feat_wall_inner, CAVE_ROOM);
- /* Place a secret door on one side */
+ /* Place a locked door on one side */
switch (rand_int(4))
{
case 0:
{
- place_secret_door(y0, x0 - 1);
+ place_locked_door(y0, x0 - 1);
break;
}
case 1:
{
- place_secret_door(y0, x0 + 1);
+ place_locked_door(y0, x0 + 1);
break;
}
case 2:
{
- place_secret_door(y0 - 1, x0);
+ place_locked_door(y0 - 1, x0);
break;
}
case 3:
{
- place_secret_door(y0 + 1, x0);
+ place_locked_door(y0 + 1, x0);
break;
}
}
@@ -4686,8 +4594,8 @@ static void add_door(int x, int y)
(cave[y][x - 1].feat == feat_wall_outer) &&
(cave[y][x + 1].feat == feat_wall_outer))
{
- /* secret door */
- place_secret_door(y, x);
+ /* locked door */
+ place_locked_door(y, x);
/* set boundarys so don't get wide doors */
place_filler(y, x - 1);
@@ -4708,8 +4616,8 @@ static void add_door(int x, int y)
(cave[y + 1][x].feat == feat_wall_outer) &&
get_is_floor(x - 1, y) && get_is_floor(x + 1, y))
{
- /* secret door */
- place_secret_door(y, x);
+ /* locked door */
+ place_locked_door(y, x);
/* set boundarys so don't get wide doors */
place_filler(y - 1, x);
@@ -4798,18 +4706,13 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
{
place_object(y, x, FALSE, FALSE, OBJ_FOUND_FLOOR);
}
- else
- {
- place_trap(y, x);
- }
}
else if (value < 30)
{
- /* Monster and trap */
+ /* Monster */
monster_level = dun_level + 5;
place_monster(y, x, TRUE, TRUE);
monster_level = dun_level;
- place_trap(y, x);
}
else if (value < 40)
{
@@ -4829,8 +4732,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
}
else if (value < 50)
{
- /* Trap */
- place_trap(y, x);
+ /* Do nothing */
}
else
{
@@ -4843,7 +4745,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
}
else if (rand_int(100) < 50)
{
- place_trap(y, x);
+ /* Do nothing */
}
else if (rand_int(100) < 50)
{
@@ -4886,7 +4788,10 @@ static void build_bubble_vault(int x0, int y0, int xsize, int ysize)
int xhsize = xsize / 2;
int yhsize = ysize / 2;
- if (cheat_room) msg_print("Bubble Vault");
+ if (options->cheat_room)
+ {
+ msg_print("Bubble Vault");
+ }
/* Allocate center of bubbles */
center[0].x = randint(xsize - 3) + 1;
@@ -5088,7 +4993,10 @@ static void build_room_vault(int x0, int y0, int xsize, int ysize)
xhsize = xsize / 2;
yhsize = ysize / 2;
- if (cheat_room) msg_print("Room Vault");
+ if (options->cheat_room)
+ {
+ msg_print("Room Vault");
+ }
/* Fill area so don't get problems with arena levels */
for (x1 = 0; x1 <= xsize; x1++)
@@ -5146,7 +5054,10 @@ static void build_cave_vault(int x0, int y0, int xsiz, int ysiz)
xsize = xhsize * 2;
ysize = yhsize * 2;
- if (cheat_room) msg_print("Cave Vault");
+ if (options->cheat_room)
+ {
+ msg_print("Cave Vault");
+ }
light = done = FALSE;
room = TRUE;
@@ -5313,7 +5224,10 @@ static void build_maze_vault(int x0, int y0, int xsize, int ysize)
cave_type *c_ptr;
- if (cheat_room) msg_print("Maze Vault");
+ if (options->cheat_room)
+ {
+ msg_print("Maze Vault");
+ }
/* Choose lite or dark */
light = (dun_level <= randint(25));
@@ -5379,7 +5293,10 @@ static void build_mini_c_vault(int x0, int y0, int xsize, int ysize)
int y1, x1, y2, x2, y, x, total;
int m, n, num_vertices;
- if (cheat_room) msg_print("Mini Checker Board Vault");
+ if (options->cheat_room)
+ {
+ msg_print("Mini Checker Board Vault");
+ }
/* Pick a random room size */
dy = ysize / 2 - 1;
@@ -5685,7 +5602,10 @@ static void build_castle_vault(int x0, int y0, int xsize, int ysize)
y2 = y0 + dy;
x2 = x0 + dx;
- if (cheat_room) msg_print("Castle Vault");
+ if (options->cheat_room)
+ {
+ msg_print("Castle Vault");
+ }
/* Generate the room */
for (y = y1 - 1; y <= y2 + 1; y++)
@@ -5809,7 +5729,10 @@ static void build_target_vault(int x0, int y0, int xsize, int ysize)
h3 = randint(32);
h4 = randint(32) - 16;
- if (cheat_room) msg_print("Target Vault");
+ if (options->cheat_room)
+ {
+ msg_print("Target Vault");
+ }
/* Work out outer radius */
if (xsize > ysize)
@@ -6099,9 +6022,6 @@ static void build_type12(int by0, int bx0)
/* Let's guard the treasure well */
vault_monsters(y0, x0, rand_int(2) + 3);
-
- /* Traps naturally */
- vault_traps(y0, x0, 4, 4, rand_int(3) + 2);
}
}
@@ -6142,6 +6062,8 @@ static void build_type12(int by0, int bx0)
*/
static void build_tunnel(int row1, int col1, int row2, int col2, bool_ water)
{
+ auto const &d_info = game->edit_data.d_info;
+
int i, y, x;
int tmp_row, tmp_col;
int row_dir, col_dir;
@@ -6373,7 +6295,7 @@ static void build_tunnel(int row1, int col1, int row2, int col2, bool_ water)
place_floor(y, x);
/* Occasional doorway */
- if (!(dungeon_flags1 & DF1_NO_DOORS) &&
+ if (!(dungeon_flags & DF_NO_DOORS) &&
(rand_int(100) < DUN_TUN_PEN))
{
/* Place a random door */
@@ -6396,6 +6318,8 @@ static void build_tunnel(int row1, int col1, int row2, int col2, bool_ water)
*/
static int next_to_corr(int y1, int x1)
{
+ auto const &d_info = game->edit_data.d_info;
+
int i, y, x, k = 0;
cave_type *c_ptr;
@@ -6441,19 +6365,21 @@ static int next_to_corr(int y1, int x1)
*/
static bool_ possible_doorway(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
/* Count the adjacent corridors */
if (next_to_corr(y, x) >= 2)
{
/* Check Vertical */
- if ((f_info[cave[y - 1][x].feat].flags1 & FF1_WALL) &&
- (f_info[cave[y + 1][x].feat].flags1 & FF1_WALL))
+ if ((f_info[cave[y - 1][x].feat].flags & FF_WALL) &&
+ (f_info[cave[y + 1][x].feat].flags & FF_WALL))
{
return (TRUE);
}
/* Check Horizontal */
- if ((f_info[cave[y][x - 1].feat].flags1 & FF1_WALL) &&
- (f_info[cave[y][x + 1].feat].flags1 & FF1_WALL))
+ if ((f_info[cave[y][x - 1].feat].flags & FF_WALL) &&
+ (f_info[cave[y][x + 1].feat].flags & FF_WALL))
{
return (TRUE);
}
@@ -6469,6 +6395,8 @@ static bool_ possible_doorway(int y, int x)
*/
static void try_doors(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
bool_ dir_ok[4];
int i, k, n;
int yy, xx;
@@ -6477,7 +6405,7 @@ static void try_doors(int y, int x)
/* if (!in_bounds(y, x)) return; */
/* Some dungeons don't have doors at all */
- if (dungeon_flags1 & (DF1_NO_DOORS)) return;
+ if (dungeon_flags & DF_NO_DOORS) return;
/* Reset tally */
n = 0;
@@ -6496,7 +6424,7 @@ static void try_doors(int y, int x)
if (!in_bounds(yy, xx)) continue;
/* Ignore walls */
- if (f_info[cave[yy][xx].feat].flags1 & (FF1_WALL)) continue;
+ if (f_info[cave[yy][xx].feat].flags & FF_WALL) continue;
/* Ignore room grids */
if (cave[yy][xx].info & (CAVE_ROOM)) continue;
@@ -6541,7 +6469,7 @@ static void try_doors(int y, int x)
/* Clear OK flags XXX */
for (i = 0; i < 4; i++) dir_ok[i] = FALSE;
- /* Put one or two secret doors */
+ /* Put one or two locked doors */
dir_ok[rand_int(4)] = TRUE;
dir_ok[rand_int(4)] = TRUE;
}
@@ -6559,7 +6487,7 @@ static void try_doors(int y, int x)
}
}
- /* Place secret door(s) */
+ /* Place locked door(s) */
for (i = 0; i < 4; i++)
{
/* Bad location */
@@ -6569,8 +6497,8 @@ static void try_doors(int y, int x)
yy = y + ddy_ddd[i];
xx = x + ddx_ddd[i];
- /* Place a secret door */
- place_secret_door(yy, xx);
+ /* Place a locked door */
+ place_locked_door(yy, xx);
}
}
}
@@ -6585,7 +6513,7 @@ static void try_doors(int y, int x)
static bool_ room_build(int y, int x, int typ)
{
/* Restrict level */
- if ((dun_level < roomdep[typ]) && !ironman_rooms) return (FALSE);
+ if ((dun_level < roomdep[typ]) && !options->ironman_rooms) return (FALSE);
/* Restrict "crowded" rooms */
if (dun->crowded && ((typ == 5) || (typ == 6))) return (FALSE);
@@ -6700,8 +6628,10 @@ static void fill_level(bool_ use_floor, byte smooth);
*/
bool_ level_generate_dungeon()
{
+ auto const &d_info = game->edit_data.d_info;
+
int i, k, y, x, y1, x1, branch = get_branch();
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto d_ptr = &d_info[dungeon_type];
int max_vault_ok = 2;
@@ -6717,12 +6647,12 @@ bool_ level_generate_dungeon()
}
/* Check for arena level */
- if ((dungeon_flags1 & (DF1_EMPTY)) ||
- (empty_levels && (rand_int(EMPTY_LEVEL) == 0)))
+ if ((dungeon_flags & DF_EMPTY) ||
+ (options->empty_levels && (rand_int(EMPTY_LEVEL) == 0)))
{
empty_level = TRUE;
- if (cheat_room || p_ptr->precognition)
+ if (options->cheat_room || p_ptr->precognition)
{
msg_print("Arena level.");
}
@@ -6732,12 +6662,12 @@ bool_ level_generate_dungeon()
}
/* Possible cavern */
- if ((dungeon_flags1 & DF1_CAVERN) && (rand_int(dun_level / 2) > DUN_CAVERN))
+ if ((dungeon_flags & DF_CAVERN) && (rand_int(dun_level / 2) > DUN_CAVERN))
{
cavern = TRUE;
/* Make a large fractal cave in the middle of the dungeon */
- if (cheat_room)
+ if (options->cheat_room)
{
msg_print("Cavern on level.");
}
@@ -6758,7 +6688,7 @@ bool_ level_generate_dungeon()
if ((cur_wid != MAX_WID) || (cur_hgt != MAX_HGT)) destroyed = FALSE;
/* Hack -- No destroyed levels */
- if (dungeon_flags1 & DF1_NO_DESTROY) destroyed = FALSE;
+ if (dungeon_flags & DF_NO_DESTROY) destroyed = FALSE;
/* Actual maximum number of rooms on this level */
dun->row_rooms = cur_hgt / BLOCK_HGT;
@@ -6785,7 +6715,7 @@ bool_ level_generate_dungeon()
x = rand_int(dun->col_rooms);
/* Align dungeon rooms */
- if (dungeon_align)
+ if (options->dungeon_align)
{
/* Slide some rooms right */
if ((x % 3) == 0) x++;
@@ -6808,7 +6738,7 @@ bool_ level_generate_dungeon()
x = rand_int(dun->col_rooms);
/* Align dungeon rooms */
- if (dungeon_align)
+ if (options->dungeon_align)
{
/* Slide some rooms right */
if ((x % 3) == 0) x++;
@@ -6833,7 +6763,7 @@ bool_ level_generate_dungeon()
else
{
/* Attempt a "trivial" room */
- if ((dungeon_flags1 & DF1_CIRCULAR_ROOMS) &&
+ if ((dungeon_flags & DF_CIRCULAR_ROOMS) &&
room_build(y, x, 9))
{
continue;
@@ -6847,13 +6777,13 @@ bool_ level_generate_dungeon()
/* Attempt an "unusual" room -- no vaults on town levels */
if (!town_level &&
- (ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level)))
+ (options->ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level)))
{
/* Roll for room type */
- k = (ironman_rooms ? 0 : rand_int(100));
+ k = (options->ironman_rooms ? 0 : rand_int(100));
/* Attempt a very unusual room */ /* test hack */
- if (ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level))
+ if (options->ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level))
{
/* Type 8 -- Greater vault (10%) */
if (k < 10)
@@ -6864,7 +6794,10 @@ bool_ level_generate_dungeon()
}
else
{
- if (cheat_room) msg_print("Refusing a greater vault.");
+ if (options->cheat_room)
+ {
+ msg_print("Refusing a greater vault.");
+ }
}
}
@@ -6877,7 +6810,10 @@ bool_ level_generate_dungeon()
}
else
{
- if (cheat_room) msg_print("Refusing a lesser vault.");
+ if (options->cheat_room)
+ {
+ msg_print("Refusing a lesser vault.");
+ }
}
}
@@ -6908,7 +6844,7 @@ bool_ level_generate_dungeon()
/* Hack - build standard rectangular rooms if needed */
if (k < 90)
{
- if ((dungeon_flags1 & DF1_CIRCULAR_ROOMS) && room_build(y, x, 1)) continue;
+ if ((dungeon_flags & DF_CIRCULAR_ROOMS) && room_build(y, x, 1)) continue;
else if (room_build(y, x, 9)) continue;
}
@@ -6917,13 +6853,13 @@ bool_ level_generate_dungeon()
}
/* Attempt a trivial room */
- if (dungeon_flags1 & DF1_CAVE)
+ if (dungeon_flags & DF_CAVE)
{
if (room_build(y, x, 10)) continue;
}
else
{
- if ((dungeon_flags1 & DF1_CIRCULAR_ROOMS) && room_build(y, x, 9)) continue;
+ if ((dungeon_flags & DF_CIRCULAR_ROOMS) && room_build(y, x, 9)) continue;
else if (room_build(y, x, 1)) continue;
}
}
@@ -6932,7 +6868,7 @@ bool_ level_generate_dungeon()
while (dun->cent_n == 0)
{
/* ...force the creation of a small rectangular room */
- (void)room_build(0, 0, 1);
+ room_build(0, 0, 1);
}
/* Hack -- Scramble the room order */
@@ -7007,9 +6943,12 @@ bool_ level_generate_dungeon()
}
/* Add some sand streamers */
- if ((dungeon_flags1 & DF1_SAND_VEIN) && !rand_int(4))
+ if ((dungeon_flags & DF_SAND_VEIN) && !rand_int(4))
{
- if ((cheat_room) || (p_ptr->precognition)) msg_print("Sand vein.");
+ if (options->cheat_room || p_ptr->precognition)
+ {
+ msg_print("Sand vein.");
+ }
build_streamer(FEAT_SANDWALL, DUN_STR_SC);
}
@@ -7023,18 +6962,24 @@ bool_ level_generate_dungeon()
}
/* Hack -- Add some rivers if requested */
- if ((dungeon_flags1 & DF1_WATER_RIVER) && !rand_int(4))
+ if ((dungeon_flags & DF_WATER_RIVER) && !rand_int(4))
{
- if (cheat_room || p_ptr->precognition) msg_print("River of water.");
+ if (options->cheat_room || p_ptr->precognition)
+ {
+ msg_print("River of water.");
+ }
add_river(FEAT_DEEP_WATER, FEAT_SHAL_WATER);
}
- if ((dungeon_flags1 & DF1_LAVA_RIVER) && !rand_int(4))
+ if ((dungeon_flags & DF_LAVA_RIVER) && !rand_int(4))
{
- if ((cheat_room) || (p_ptr->precognition)) msg_print("River of lava.");
+ if (options->cheat_room || p_ptr->precognition)
+ {
+ msg_print("River of lava.");
+ }
add_river(FEAT_DEEP_LAVA, FEAT_SHAL_LAVA);
}
- if (dungeon_flags1 & DF1_WATER_RIVERS)
+ if (dungeon_flags & DF_WATER_RIVERS)
{
int max = 3 + rand_int(2);
bool_ said = FALSE;
@@ -7044,13 +6989,16 @@ bool_ level_generate_dungeon()
if (rand_int(3) == 0)
{
add_river(FEAT_DEEP_WATER, FEAT_SHAL_WATER);
- if (!said && ((cheat_room) || (p_ptr->precognition))) msg_print("Rivers of water.");
+ if (!said && (options->cheat_room || p_ptr->precognition))
+ {
+ msg_print("Rivers of water.");
+ }
said = TRUE;
}
}
}
- if (dungeon_flags1 & DF1_LAVA_RIVERS)
+ if (dungeon_flags & DF_LAVA_RIVERS)
{
int max = 2 + rand_int(2);
bool_ said = FALSE;
@@ -7060,14 +7008,17 @@ bool_ level_generate_dungeon()
if (rand_int(3) == 0)
{
add_river(FEAT_DEEP_LAVA, FEAT_SHAL_LAVA);
- if (!said && ((cheat_room) || (p_ptr->precognition))) msg_print("Rivers of lava.");
+ if (!said && (options->cheat_room || p_ptr->precognition))
+ {
+ msg_print("Rivers of lava.");
+ }
said = TRUE;
}
}
}
/* Add streamers of trees, water, or lava -KMW- */
- if (!(dungeon_flags1 & DF1_NO_STREAMERS))
+ if (!(dungeon_flags & DF_NO_STREAMERS))
{
int num;
@@ -7076,7 +7027,7 @@ bool_ level_generate_dungeon()
*
* Small trees (penetrate walls)
*/
- if ((dungeon_flags1 & DF1_FLAT) && (randint(20) > 15))
+ if ((dungeon_flags & DF_FLAT) && (randint(20) > 15))
{
num = randint(DUN_STR_QUA);
@@ -7233,9 +7184,11 @@ static void save_all_friends()
* *hint* *hint* with this made extern, and we no longer have to
* store fill_type and floor_type in the savefile...
*/
-static void init_feat_info(void)
+static void init_feat_info()
{
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto const &d_info = game->edit_data.d_info;
+
+ auto d_ptr = &d_info[dungeon_type];
int i;
int cur_depth, max_depth;
int p1, p2;
@@ -7341,6 +7294,8 @@ static void init_feat_info(void)
static void fill_level(bool_ use_floor, byte smooth)
{
+ auto const &d_info = game->edit_data.d_info;
+
int y, x;
int step;
int shift;
@@ -7591,9 +7546,15 @@ static void supersize_grid_tile(int sy, int sx, int ty, int tx)
*
* Note that "dun_body" adds about 4000 bytes of memory to the stack.
*/
-static bool_ cave_gen(void)
+static bool_ cave_gen()
{
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto const &d_info = game->edit_data.d_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &a_info = game->edit_data.a_info;
+ auto &k_info = game->edit_data.k_info;
+ auto &alloc = game->alloc;
+
+ auto d_ptr = &d_info[dungeon_type];
int max_vault_ok = 2;
@@ -7606,14 +7567,16 @@ static bool_ cave_gen(void)
char generator_name[100];
if (!get_dungeon_generator(generator_name))
- strnfmt(generator_name, 99, "%s", d_ptr->generator);
+ {
+ strnfmt(generator_name, sizeof(generator_name)-1, "%s", d_ptr->generator.c_str());
+ }
/*
* We generate a double dungeon. First we should halve the desired
* width/height, generate the dungeon normally, then double it
* in both directions
*/
- if (dungeon_flags1 & DF1_DOUBLE)
+ if (dungeon_flags & DF_DOUBLE)
{
cur_wid /= 2;
cur_hgt /= 2;
@@ -7676,22 +7639,22 @@ static bool_ cave_gen(void)
alloc_stairs(FEAT_LESS, 5, 3, branch);
}
- if ((dun_level < d_ptr->maxdepth) || ((dun_level == d_ptr->maxdepth) && (dungeon_flags1 & DF1_FORCE_DOWN)))
+ if ((dun_level < d_ptr->maxdepth) || ((dun_level == d_ptr->maxdepth) && (dungeon_flags & DF_FORCE_DOWN)))
{
/* Place 3 or 4 down stairs near some walls */
- alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_MORE, rand_range(3, 4), 3, 0);
+ alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_MORE, rand_range(3, 4), 3, 0);
/* Place 0 or 1 down shafts near some walls */
- if (!(dungeon_flags2 & DF2_NO_SHAFT)) alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN, rand_range(0, 1), 3, 0);
+ if (!(dungeon_flags & DF_NO_SHAFT)) alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN, rand_range(0, 1), 3, 0);
}
- if ((dun_level > d_ptr->mindepth) || ((dun_level == d_ptr->mindepth) && (!(dungeon_flags1 & DF1_NO_UP))))
+ if ((dun_level > d_ptr->mindepth) || ((dun_level == d_ptr->mindepth) && (!(dungeon_flags & DF_NO_UP))))
{
/* Place 1 or 2 up stairs near some walls */
- alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_LESS, rand_range(1, 2), 3, 0);
+ alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_LESS, rand_range(1, 2), 3, 0);
/* Place 0 or 1 up shafts near some walls */
- if (!(dungeon_flags2 & DF2_NO_SHAFT)) alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP, rand_range(0, 1), 3, 0);
+ if (!(dungeon_flags & DF_NO_SHAFT)) alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP, rand_range(0, 1), 3, 0);
}
}
@@ -7719,8 +7682,11 @@ static bool_ cave_gen(void)
i = (i * cur_wid) / MAX_WID;
i += 1;
- if (i > small_tester) i = small_tester;
- else if (cheat_hear)
+ if (i > small_tester)
+ {
+ i = small_tester;
+ }
+ else if (options->cheat_hear)
{
msg_format("Reduced monsters base from %d to %d", small_tester, i);
}
@@ -7731,7 +7697,7 @@ static bool_ cave_gen(void)
/* Put some monsters in the dungeon */
for (i = i + k; i > 0; i--)
{
- (void)alloc_monster(0, TRUE);
+ alloc_monster(0, TRUE);
}
}
@@ -7818,7 +7784,7 @@ static bool_ cave_gen(void)
get_obj_num_hook = kind_is_legal;
/* Invalidate the allocation table */
- alloc_kind_table_valid = FALSE;
+ alloc.kind_table_valid = false;
/* Get a local object */
q_ptr = &forge;
@@ -7839,7 +7805,7 @@ static bool_ cave_gen(void)
/* Grant a normal artefact */
else if (a_info[fates[i].a_idx].cur_num == 0)
{
- artifact_type *a_ptr = &a_info[fates[i].a_idx];
+ auto a_ptr = &a_info[fates[i].a_idx];
s16b I_kind;
/* Get local object */
@@ -7881,20 +7847,14 @@ static bool_ cave_gen(void)
}
case FATE_FIND_R:
{
- if ((r_info[fates[i].r_idx].cur_num == 1) && (r_info[fates[i].r_idx].flags1 & RF1_UNIQUE)) fates[i].icky = TRUE;
+ if ((r_info[fates[i].r_idx].cur_num == 1) && (r_info[fates[i].r_idx].flags & RF_UNIQUE)) fates[i].icky = TRUE;
break;
}
}
}
- /* Place traps and rubble */
- {
- /* Place some traps in the dungeon */
- alloc_object(ALLOC_SET_BOTH, ALLOC_TYP_TRAP, randint(k * 2));
-
- /* Put some rubble in corridors */
- alloc_object(ALLOC_SET_CORR, ALLOC_TYP_RUBBLE, randint(k));
- }
+ /* Put some rubble in corridors */
+ alloc_object(ALLOC_SET_CORR, ALLOC_TYP_RUBBLE, randint(k));
/* Place objects and treasure */
{
@@ -7956,7 +7916,7 @@ static bool_ cave_gen(void)
if (m_idx && d_ptr->final_artifact &&
(a_info[d_ptr->final_artifact].cur_num == 0))
{
- artifact_type *a_ptr = &a_info[d_ptr->final_artifact];
+ auto a_ptr = &a_info[d_ptr->final_artifact];
object_type *q_ptr, forge, *o_ptr;
int I_kind, o_idx;
@@ -8065,7 +8025,7 @@ static bool_ cave_gen(void)
wiz_lite();
/* Now double the generated dungeon */
- if (dungeon_flags1 & DF1_DOUBLE)
+ if (dungeon_flags & DF_DOUBLE)
{
/*
* We begin at the bottom-right corner and move upwards
@@ -8107,18 +8067,30 @@ static bool_ cave_gen(void)
/* Mega-Hack */
#define REGEN_HACK 0x02
-bool_ build_special_level(void)
+bool_ build_special_level()
{
- char buf[80];
- int y, x, ystart = 2, xstart = 2;
- s16b level;
+ auto const &d_info = game->edit_data.d_info;
+ auto &level_markers = game->level_markers;
/* No special levels on the surface */
- if (!dun_level) return FALSE;
+ if (!dun_level)
+ {
+ return FALSE;
+ }
+
+ auto const level = dun_level - d_info[dungeon_type].mindepth;
+
+ char buf[80];
+
+ if ((!get_dungeon_save(buf)) && !is_normal_level(level_markers[level][dungeon_type]))
+ {
+ return FALSE;
+ }
- level = dun_level - d_info[dungeon_type].mindepth;
- if ((!get_dungeon_save(buf)) && (special_lvl[level][dungeon_type])) return FALSE;
- if (!get_dungeon_special(buf)) return FALSE;
+ if (!get_dungeon_special(buf))
+ {
+ return FALSE;
+ }
/* Big town */
cur_hgt = MAX_HGT;
@@ -8133,9 +8105,9 @@ bool_ build_special_level(void)
panel_col_min = max_panel_cols * (SCREEN_WID / 2);
/* Start with perm walls */
- for (y = 0; y < cur_hgt; y++)
+ for (int y = 0; y < cur_hgt; y++)
{
- for (x = 0; x < cur_wid; x++)
+ for (int x = 0; x < cur_wid; x++)
{
cave_set_feat(y, x, FEAT_PERM_SOLID);
}
@@ -8147,10 +8119,12 @@ bool_ build_special_level(void)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON | INIT_POSITION;
+ int ystart = 2;
+ int xstart = 2;
process_dungeon_file(buf, &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
- special_lvl[level][dungeon_type] = REGEN_HACK;
- generate_special_feeling = TRUE;
+ game->level_markers[level][dungeon_type] = level_marker::REGENERATE;
+ game->generate_special_feeling = true;
/* Special feeling because it's special */
good_item_flag = TRUE;
@@ -8168,53 +8142,77 @@ bool_ build_special_level(void)
* Prepare regeneration of a special level, which should not happen,
* but just in case...
*/
-static void wipe_special_level(void)
+static void wipe_special_level()
{
- s16b level;
- char buf[80];
+ auto const &d_info = game->edit_data.d_info;
+ auto &level_markers = game->level_markers;
/* No special levels on the surface */
- if (!dun_level) return;
+ if (!dun_level)
+ {
+ return;
+ }
+ /* Fire off hooks */
process_hooks_new(HOOK_LEVEL_REGEN, NULL, NULL);
/* Calculate relative depth */
- level = dun_level - d_info[dungeon_type].mindepth;
+ auto const level = dun_level - d_info[dungeon_type].mindepth;
- /* No special level at this depth */
- if ((!get_dungeon_save(buf)) &&
- special_lvl[level][dungeon_type]) return;
- if (!get_dungeon_special(buf)) return;
+ /* No special level at this depth? */
+ char buf[80];
+ if ((!get_dungeon_save(buf)) && !is_normal_level(level_markers[level][dungeon_type]))
+ {
+ return;
+ }
+ if (!get_dungeon_special(buf))
+ {
+ return;
+ }
/* Clear the Mega-Hack flag */
- if (special_lvl[level][dungeon_type] == REGEN_HACK)
- special_lvl[level][dungeon_type] = FALSE;
+ if (level_markers[level][dungeon_type] == level_marker::REGENERATE)
+ {
+ level_markers[level][dungeon_type] = level_marker::NORMAL;
+ }
}
/*
* Finalise generation of a special level
*/
-static void finalise_special_level(void)
+static void finalise_special_level()
{
- s16b level;
- char buf[80];
+ auto const &d_info = game->edit_data.d_info;
+ auto &level_markers = game->level_markers;
/* No special levels on the surface */
- if (!dun_level) return;
+ if (!dun_level)
+ {
+ return;
+ }
+ /* Fire hooks */
process_hooks_new(HOOK_LEVEL_END_GEN, NULL, NULL);
/* Calculate relative depth */
- level = dun_level - d_info[dungeon_type].mindepth;
+ auto const level = dun_level - d_info[dungeon_type].mindepth;
- /* No special level at this depth */
- if ((!get_dungeon_save(buf)) &&
- special_lvl[level][dungeon_type]) return;
- if (!get_dungeon_special(buf)) return;
+ /* No special level at this depth? */
+ char buf[80];
+ if ((!get_dungeon_save(buf)) && !is_normal_level(level_markers[level][dungeon_type]))
+ {
+ return;
+ }
+ if (!get_dungeon_special(buf))
+ {
+ return;
+ }
/* Set the "generated" flag */
- if (special_lvl[level][dungeon_type] == REGEN_HACK)
- special_lvl[level][dungeon_type] = TRUE;
+ if (level_markers[level][dungeon_type] == level_marker::REGENERATE)
+ {
+ level_markers[level][dungeon_type] = level_marker::SPECIAL;
+ }
}
/*
@@ -8229,7 +8227,7 @@ static void generate_grid_mana()
{
xtra_magic = TRUE;
- if (cheat_room || p_ptr->precognition)
+ if (options->cheat_room || p_ptr->precognition)
{
msg_print("Magical level");
}
@@ -8264,9 +8262,13 @@ static void generate_grid_mana()
*
* Hack -- allow auto-scumming via a gameplay option.
*/
-void generate_cave(void)
+void generate_cave()
{
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto const &d_info = game->edit_data.d_info;
+ auto &a_info = game->edit_data.a_info;
+ auto const &level_markers = game->level_markers;
+
+ auto d_ptr = &d_info[dungeon_type];
int tester_1, tester_2;
int y, x, num, i;
bool_ loaded = FALSE;
@@ -8275,18 +8277,16 @@ void generate_cave(void)
/* The dungeon is not ready */
character_dungeon = FALSE;
- generate_special_feeling = FALSE;
+ game->generate_special_feeling = false;
/* Initialize the flags with the basic dungeon flags */
if (!dun_level)
{
- dungeon_flags1 = d_info[DUNGEON_WILDERNESS].flags1;
- dungeon_flags2 = d_info[DUNGEON_WILDERNESS].flags2;
+ dungeon_flags = d_info[DUNGEON_WILDERNESS].flags;
}
else
{
- dungeon_flags1 = d_ptr->flags1;
- dungeon_flags2 = d_ptr->flags2;
+ dungeon_flags = d_ptr->flags;
}
/* Is it a town level ? */
@@ -8302,8 +8302,7 @@ void generate_cave(void)
/* Seed the RNG if appropriate */
if (town_level)
{
- Rand_quick = TRUE;
- Rand_value = town_info[town_level].seed;
+ set_quick_rng(town_info[town_level].seed);
}
process_hooks_new(HOOK_GEN_LEVEL_BEGIN, NULL, NULL);
@@ -8336,8 +8335,8 @@ void generate_cave(void)
/* No saved level -- generate new one */
if (!loaded)
{
- if (!get_dungeon_special(buf) ||
- !special_lvl[dun_level - d_info[dungeon_type].mindepth][dungeon_type])
+ auto const level = dun_level - d_info[dungeon_type].mindepth;
+ if (!get_dungeon_special(buf) || is_normal_level(level_markers[level][dungeon_type]))
{
get_level_flags();
}
@@ -8454,7 +8453,7 @@ void generate_cave(void)
/* Requested size level */
if (d_ptr->size_x != -1)
{
- if (cheat_room || p_ptr->precognition)
+ if (options->cheat_room || p_ptr->precognition)
{
msg_print ("A 'size' dungeon level.");
}
@@ -8470,16 +8469,16 @@ void generate_cave(void)
panel_row_min = max_panel_rows * (SCREEN_HGT / 2);
panel_col_min = max_panel_cols * (SCREEN_WID / 2);
- if (cheat_room)
+ if (options->cheat_room)
{
msg_format("X:%d, Y:%d.", max_panel_cols, max_panel_rows);
}
}
/* Very small (1 x 1 panel) level */
- else if (!(dungeon_flags1 & DF1_BIG) &&
- (dungeon_flags1 & DF1_SMALLEST))
+ else if (!(dungeon_flags & DF_BIG) &&
+ (dungeon_flags & DF_SMALLEST))
{
- if (cheat_room || p_ptr->precognition)
+ if (options->cheat_room || p_ptr->precognition)
{
msg_print ("A 'small' dungeon level.");
}
@@ -8495,19 +8494,19 @@ void generate_cave(void)
panel_row_min = max_panel_rows * (SCREEN_HGT / 2);
panel_col_min = max_panel_cols * (SCREEN_WID / 2);
- if (cheat_room)
+ if (options->cheat_room)
{
msg_format("X:1, Y:1.");
}
}
/* Small level */
- else if (!(dungeon_flags1 & DF1_BIG) &&
- (always_small_level ||
- (dungeon_flags1 & DF1_SMALL) ||
- (small_levels && rand_int(SMALL_LEVEL) == 0)))
+ else if (!(dungeon_flags & DF_BIG) &&
+ (options->always_small_level ||
+ (dungeon_flags & DF_SMALL) ||
+ (options->small_levels && rand_int(SMALL_LEVEL) == 0)))
{
- if (cheat_room || p_ptr->precognition)
+ if (options->cheat_room || p_ptr->precognition)
{
msg_print ("A 'small' dungeon level.");
}
@@ -8526,7 +8525,7 @@ void generate_cave(void)
panel_row_min = max_panel_rows * (SCREEN_HGT / 2);
panel_col_min = max_panel_cols * (SCREEN_WID / 2);
- if (cheat_room)
+ if (options->cheat_room)
{
msg_format("X:%d, Y:%d.", max_panel_cols, max_panel_rows);
}
@@ -8568,7 +8567,7 @@ void generate_cave(void)
else feeling = 10;
/* Hack -- Have a special feeling sometimes */
- if (good_item_flag && !p_ptr->preserve) feeling = 1;
+ if (good_item_flag && !options->preserve) feeling = 1;
/* It takes 1000 game turns for "feelings" to recharge */
if ((turn - old_turn) < 1000) feeling = 0;
@@ -8598,7 +8597,7 @@ void generate_cave(void)
}
/* Mega-Hack -- "auto-scum" */
- if (auto_scum && (num < 100) && !p_ptr->inside_quest && dun_level)
+ if (options->auto_scum && (num < 100) && !p_ptr->inside_quest && dun_level)
{
/* Require "goodness" */
if ((feeling > 9) ||
@@ -8608,8 +8607,8 @@ void generate_cave(void)
((dun_level >= 40) && (feeling > 5)))
{
/* Give message to cheaters */
- if (cheat_room || cheat_hear ||
- cheat_peek || cheat_xtra || p_ptr->precognition)
+ if (options->cheat_room || options->cheat_hear ||
+ options->cheat_peek || options->cheat_xtra || p_ptr->precognition)
{
/* Message */
why = "boring level";
diff --git a/src/generate.hpp b/src/generate.hpp
index d09907b5..a21ba069 100644
--- a/src/generate.hpp
+++ b/src/generate.hpp
@@ -2,11 +2,11 @@
#include "h-basic.h"
-extern bool_ new_player_spot(int branch);
-extern void add_level_generator(cptr name, bool_ (*generator)());
-extern bool_ level_generate_dungeon();
-extern bool_ generate_fracave(int y0, int x0,int xsize,int ysize,int cutoff,bool_ light,bool_ room);
-extern void generate_hmap(int y0, int x0,int xsiz,int ysiz,int grd,int roug,int cutoff);
-extern bool_ room_alloc(int x,int y,bool_ crowded,int by0,int bx0,int *xx,int *yy);
-extern void generate_cave(void);
-extern void build_rectangle(int y1, int x1, int y2, int x2, int feat, int info);
+bool_ new_player_spot(int branch);
+void add_level_generator(cptr name, bool_ (*generator)());
+bool_ level_generate_dungeon();
+bool_ generate_fracave(int y0, int x0,int xsize,int ysize,int cutoff,bool_ light,bool_ room);
+void generate_hmap(int y0, int x0,int xsiz,int ysiz,int grd,int roug,int cutoff);
+bool_ room_alloc(int x,int y,bool_ crowded,int by0,int bx0,int *xx,int *yy);
+void generate_cave();
+void build_rectangle(int y1, int x1, int y2, int x2, int feat, int info);
diff --git a/src/gods.cc b/src/gods.cc
index 1163e9b6..82d8d300 100644
--- a/src/gods.cc
+++ b/src/gods.cc
@@ -7,6 +7,7 @@
*/
#include "gods.hpp"
+#include "game.hpp"
#include "player_type.hpp"
#include "skills.hpp"
#include "skill_type.hpp"
@@ -79,6 +80,8 @@ static bool_ may_follow_god(int god)
*/
void follow_god(int god, bool_ silent)
{
+ auto &s_info = game->s_info;
+
/* Poor unbelievers, i'm so mean ... BOUHAHAHA */
if (get_skill(SKILL_ANTIMAGIC))
{
@@ -97,8 +100,11 @@ void follow_god(int god, bool_ silent)
/* Melkor offer Udun magic */
if (p_ptr->pgod == GOD_MELKOR)
{
- s_info[SKILL_UDUN].hidden = FALSE;
- if (!silent) msg_print("You feel the dark powers of Melkor in you. You can now use the Udun skill.");
+ s_info[SKILL_UDUN].hidden = false;
+ if (!silent)
+ {
+ msg_print("You feel the dark powers of Melkor in you. You can now use the Udun skill.");
+ }
}
}
}
@@ -159,7 +165,6 @@ int wisdom_scale(int max)
*/
deity_type *god_at(byte god_idx)
{
- assert(god_idx >= 0);
assert(god_idx < MAX_GODS);
if (god_idx == 0)
diff --git a/src/gods.hpp b/src/gods.hpp
index 7035dd14..2a5f2bb5 100644
--- a/src/gods.hpp
+++ b/src/gods.hpp
@@ -2,12 +2,12 @@
#include "h-basic.h"
-extern void inc_piety(int god, s32b amt);
-extern void abandon_god(int god);
-extern int wisdom_scale(int max);
-extern int find_god(cptr name);
-extern void follow_god(int god, bool_ silent);
-extern bool_ god_enabled(struct deity_type *deity);
-extern deity_type *god_at(byte god_idx);
-extern bool_ show_god_info();
-extern bool praying_to(int god);
+void inc_piety(int god, s32b amt);
+void abandon_god(int god);
+int wisdom_scale(int max);
+int find_god(cptr name);
+void follow_god(int god, bool_ silent);
+bool_ god_enabled(struct deity_type *deity);
+deity_type *god_at(byte god_idx);
+bool_ show_god_info();
+bool praying_to(int god);
diff --git a/src/grid.hpp b/src/grid.hpp
new file mode 100644
index 00000000..4708811d
--- /dev/null
+++ b/src/grid.hpp
@@ -0,0 +1,72 @@
+#pragma once
+
+#include <boost/multi_array.hpp>
+
+/**
+ * 2D grid of T's.
+ */
+template <typename T>
+struct grid {
+
+private:
+ boost::multi_array<T, 2> impl;
+
+public:
+ /**
+ * Get reference to tile.
+ */
+ T &operator ()(std::size_t x, std::size_t y)
+ {
+ return impl[y][x];
+ }
+
+ /**
+ * Get const reference to tile.
+ */
+ T const &operator ()(std::size_t x, std::size_t y) const
+ {
+ return impl[y][x];
+ }
+
+ /**
+ * Resize grid. There is no guarantee whether
+ * existing elements will be preserved or not.
+ */
+ void resize(std::size_t width, std::size_t height)
+ {
+ impl.resize(boost::extents[height][width]);
+ }
+
+ /**
+ * Get current width.
+ */
+ std::size_t width() const
+ {
+ return impl.shape()[1];
+ }
+
+ /**
+ * Get current height.
+ */
+ std::size_t height() const
+ {
+ return impl.shape()[0];
+ }
+
+ /**
+ * Set width. Same caveats apply as for resize().
+ */
+ void width(std::size_t width)
+ {
+ resize(width, height());
+ }
+
+ /**
+ * Set height. Same caveats apply as for resize().
+ */
+ void height(std::size_t height)
+ {
+ resize(width(), height);
+ }
+
+};
diff --git a/src/help.cc b/src/help.cc
index a6d83079..08956f70 100644
--- a/src/help.cc
+++ b/src/help.cc
@@ -16,6 +16,7 @@
#include "hook_move_in.hpp"
#include "hooks.hpp"
#include "object1.hpp"
+#include "object_flag.hpp"
#include "options.hpp"
#include "player_type.hpp"
#include "skills.hpp"
@@ -23,26 +24,24 @@
#include "variable.hpp"
#define DESC_MAX 14
-#define TRIGGERED_HELP_MAX 18
+#define TRIGGERED_HELP_MAX 16
#define HELP_VOID_JUMPGATE 0
#define HELP_FOUNTAIN 1
#define HELP_FOUND_OBJECT 2
#define HELP_FOUND_ALTAR 3
#define HELP_FOUND_STAIR 4
-#define HELP_GET_RUNE 5
-#define HELP_GET_ROD 6
-#define HELP_GET_ROD_TIP 7
-#define HELP_GET_TRAP_KIT 8
-#define HELP_GET_DEVICE 9
-#define HELP_WILDERNESS 10
-#define HELP_GAME_TOME 11
-#define HELP_GAME_THEME 12
-#define HELP_1ST_LEVEL 13
-#define HELP_20TH_LEVEL 14
-#define HELP_ID_SPELL_ITM 15
-#define HELP_MELEE_SKILLS 16
-#define HELP_MON_ASK_HELP 17
+#define HELP_GET_ROD 5
+#define HELP_GET_ROD_TIP 6
+#define HELP_GET_DEVICE 7
+#define HELP_WILDERNESS 8
+#define HELP_GAME_TOME 9
+#define HELP_GAME_THEME 10
+#define HELP_1ST_LEVEL 11
+#define HELP_20TH_LEVEL 12
+#define HELP_ID_SPELL_ITM 13
+#define HELP_MELEE_SKILLS 14
+#define HELP_MON_ASK_HELP 15
/**
* Game started?
@@ -179,7 +178,6 @@ context_help_type class_table[] =
{ "Priest(Manwe)", "c_pr_man.txt", 0 },
{ "Ranger", "c_ranger.txt", 0 },
{ "Rogue", "c_rogue.txt", 0 },
- { "Runecrafter", "c_runecr.txt", 0 },
{ "Sorceror", "c_sorcer.txt", 0 },
{ "Summoner", "c_summon.txt", 0 },
{ "Swordmaster", "c_swordm.txt", 0 },
@@ -199,7 +197,6 @@ context_help_type class_table[] =
{ "Priest(Varda)", "c_pr_varda.txt", 0 },
{ "Sniper", "c_sniper.txt", 0 },
{ "Stonewright", "c_stonewr.txt", 0 },
- { "Trapper", "c_trapper.txt", 0 },
{ "Wainrider", "c_wainrid.txt", 0 },
{ "War-mage", "c_warmage.txt", 0 },
/* End of list */
@@ -268,7 +265,6 @@ context_help_type skill_table[] =
{ "Polearm-mastery", "skills.txt", 7 },
{ "Possession", "skills.txt", 45 },
{ "Prayer", "skills.txt", 39 },
- { "Runecraft", "skills.txt", 36 },
{ "Sling-mastery", "skills.txt", 9 },
{ "Sneakiness", "skills.txt", 14 },
{ "Spell-power", "skills.txt", 22 },
@@ -301,7 +297,6 @@ context_help_type ability_table[] =
{ "Ammo creation", "ability.txt", 7 },
{ "Touch of death", "ability.txt", 8 },
{ "Far reaching attack", "ability.txt", 10 },
- { "Trapping", "ability.txt", 11 },
{ "Undead Form", "ability.txt", 12 },
{ NULL, NULL, 0 },
};
@@ -335,12 +330,6 @@ static bool_ trigger_found_stairs(void *in, void *out) {
return (cave[p->y][p->x].feat == FEAT_MORE);
}
-static bool_ trigger_get_rune(void *in, void *out) {
- hook_get_in *g = (hook_get_in *) in;
- return ((g->o_ptr->tval == TV_RUNE1) ||
- (g->o_ptr->tval == TV_RUNE2));
-}
-
static bool_ trigger_get_rod(void *in, void *out) {
hook_get_in *g = (hook_get_in *) in;
return (g->o_ptr->tval == TV_ROD_MAIN);
@@ -351,11 +340,6 @@ static bool_ trigger_get_rod_tip(void *in, void *out) {
return (g->o_ptr->tval == TV_ROD);
}
-static bool_ trigger_get_trap_kit(void *in, void *out) {
- hook_get_in *g = (hook_get_in *) in;
- return (g->o_ptr->tval == TV_TRAPKIT);
-}
-
static bool_ trigger_get_magic_device(void *in, void *out) {
hook_get_in *g = (hook_get_in *) in;
return ((g->o_ptr->tval == TV_WAND) ||
@@ -389,9 +373,8 @@ static bool_ trigger_identify_spell_item(void *in_, void *out) {
if (in->mode == IDENT_FULL)
{
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(in->o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f5 & TR5_SPELL_CONTAIN)
+ auto const f = object_flags(in->o_ptr);
+ if (f & TR_SPELL_CONTAIN)
{
return TRUE;
}
@@ -452,14 +435,6 @@ static triggered_help_type triggered_help[TRIGGERED_HELP_MAX] =
"But be ready to fight what lies within, for it might not be too friendly.",
NULL }
},
- { HELP_GET_RUNE,
- HOOK_GET,
- trigger_get_rune,
- { "Ah, a rune! Runes are used with the Runecraft skill to allow you to",
- "create spells on your own.",
- NULL
- }
- },
{ HELP_GET_ROD,
HOOK_GET,
trigger_get_rod,
@@ -479,16 +454,6 @@ static triggered_help_type triggered_help[TRIGGERED_HELP_MAX] =
NULL
}
},
- { HELP_GET_TRAP_KIT,
- HOOK_GET,
- trigger_get_trap_kit,
- { "Ooooh, a trapping kit. If you have ability in the trapping skill,",
- "you can lay this trap (via the 'm' key) to harm unsuspecting foes.",
- "You'll generally need either some ammo or magic device depending",
- "on the exact type of trap kit.",
- NULL
- }
- },
{ HELP_GET_DEVICE,
HOOK_GET,
trigger_get_magic_device,
@@ -593,33 +558,31 @@ static triggered_help_type triggered_help[TRIGGERED_HELP_MAX] =
}
};
-static bool_ triggered_help_hook(void *data, void *in, void *out)
+static bool triggered_help_hook(void *data, void *in, void *out)
{
triggered_help_type *triggered_help = (triggered_help_type *) data;
/* Not triggered before and trigger now? */
- if ((option_ingame_help) &&
+ if (options->ingame_help &&
(!p_ptr->help.activated[triggered_help->help_index]) &&
triggered_help->trigger_func(in,out))
{
- int i;
-
/* Triggered */
- p_ptr->help.activated[triggered_help->help_index] = TRUE;
+ p_ptr->help.activated[triggered_help->help_index] = true;
/* Show the description */
- for (i = 0; (i < DESC_MAX) && (triggered_help->desc[i] != NULL); i++)
+ for (std::size_t i = 0; (i < DESC_MAX) && (triggered_help->desc[i] != NULL); i++)
{
cmsg_print(TERM_YELLOW, triggered_help->desc[i]);
}
}
/* Don't stop processing */
- return FALSE;
+ return false;
}
-static bool_ hook_game_start(void *data, void *in, void *out)
+static bool hook_game_start(void *data, void *in, void *out)
{
game_started = TRUE;
- return FALSE;
+ return false;
}
static void setup_triggered_help_hook(int i)
@@ -674,7 +637,7 @@ static void show_context_help(context_help_type *context_help)
screen_save();
- show_file(context_help->file_name, 0, -context_help->anchor, 0);
+ show_file(context_help->file_name, 0, -context_help->anchor);
screen_load();
}
@@ -705,19 +668,19 @@ static context_help_type *find_context_help(context_help_type table[], cptr key)
/*
* Racial help
*/
-void help_race(cptr race)
+void help_race(std::string const &race)
{
- show_context_help(find_context_help(race_table, race));
+ show_context_help(find_context_help(race_table, race.c_str()));
}
-void help_subrace(cptr subrace)
+void help_subrace(std::string const &subrace)
{
- show_context_help(find_context_help(subrace_table, subrace));
+ show_context_help(find_context_help(subrace_table, subrace.c_str()));
}
-void help_class(cptr klass)
+void help_class(std::string const &klass)
{
- show_context_help(find_context_help(class_table, klass));
+ show_context_help(find_context_help(class_table, klass.c_str()));
}
void help_god(cptr god)
@@ -731,12 +694,12 @@ void help_god(cptr god)
}
}
-void help_skill(cptr skill)
+void help_skill(const std::string &skill)
{
- show_context_help(find_context_help(skill_table, skill));
+ show_context_help(find_context_help(skill_table, skill.c_str()));
}
-void help_ability(cptr ability)
+void help_ability(std::string const &ability)
{
- show_context_help(find_context_help(ability_table, ability));
+ show_context_help(find_context_help(ability_table, ability.c_str()));
}
diff --git a/src/help.hpp b/src/help.hpp
index 7c057a01..a805a62b 100644
--- a/src/help.hpp
+++ b/src/help.hpp
@@ -2,10 +2,12 @@
#include "h-basic.h"
-extern void init_hooks_help();
-extern void help_race(cptr race);
-extern void help_subrace(cptr subrace);
-extern void help_class(cptr klass);
-extern void help_god(cptr god);
-extern void help_skill(cptr skill);
-extern void help_ability(cptr ability);
+#include <string>
+
+void init_hooks_help();
+void help_race(std::string const &race);
+void help_subrace(std::string const &subrace);
+void help_class(std::string const &klass);
+void help_god(cptr god);
+void help_skill(std::string const &skill);
+void help_ability(std::string const &ability);
diff --git a/src/help_info.hpp b/src/help_info.hpp
index ea440bb9..1b4a3757 100644
--- a/src/help_info.hpp
+++ b/src/help_info.hpp
@@ -12,6 +12,6 @@ constexpr int HELP_MAX = 64;
*/
struct help_info
{
- bool_ enabled; /* ingame help enabled */
- bool_ activated[HELP_MAX]; /* help item #i activated? */
+ bool enabled = false; /* ingame help enabled */
+ bool activated[HELP_MAX] = { false }; /* help item #i activated? */
};
diff --git a/src/hiscore.hpp b/src/hiscore.hpp
index 0b1b713d..990c91aa 100644
--- a/src/hiscore.hpp
+++ b/src/hiscore.hpp
@@ -36,7 +36,6 @@ struct high_score
char unused_1[8]; /* Kept for compatibility only */
- char sex[2]; /* Player Sex (string) */
char p_r[3]; /* Player Race (number) */
char p_s[3]; /* Player Subrace (number) */
char p_c[3]; /* Player Class (number) */
diff --git a/src/hist_type.hpp b/src/hist_type.hpp
deleted file mode 100644
index 2da47b7c..00000000
--- a/src/hist_type.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-
-/**
- * Player background descriptor.
- */
-struct hist_type
-{
- char *info; /* Textual History */
-
- byte roll; /* Frequency of this entry */
- s16b chart; /* Chart index */
- s16b next; /* Next chart index */
- byte bonus; /* Social Class Bonus + 50 */
-};
diff --git a/src/hist_type_fwd.hpp b/src/hist_type_fwd.hpp
deleted file mode 100644
index d1cbce91..00000000
--- a/src/hist_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct hist_type;
diff --git a/src/hooks.cc b/src/hooks.cc
index 4fcc39d3..bd2ea905 100644
--- a/src/hooks.cc
+++ b/src/hooks.cc
@@ -81,7 +81,7 @@ void del_hook_new(int h_idx, hook_func_t hook_func)
}
}
-bool_ process_hooks_new(int h_idx, void *in, void *out)
+bool process_hooks_new(int h_idx, void *in, void *out)
{
auto const &hooks = hooks_instance()[h_idx];
@@ -94,7 +94,7 @@ bool_ process_hooks_new(int h_idx, void *in, void *out)
returns TRUE */
if (hook_data.invoke(in, out))
{
- return TRUE;
+ return true;
}
/* Should we restart processing at the beginning? */
@@ -109,5 +109,5 @@ bool_ process_hooks_new(int h_idx, void *in, void *out)
}
}
- return FALSE;
+ return false;
}
diff --git a/src/hooks.hpp b/src/hooks.hpp
index b6124e6a..7cf4285b 100644
--- a/src/hooks.hpp
+++ b/src/hooks.hpp
@@ -2,9 +2,9 @@
#include "h-basic.h"
-typedef bool_ (*hook_func_t)(void *, void *, void *);
+typedef bool (*hook_func_t)(void *, void *, void *);
-extern void add_hook_new(int h_idx, hook_func_t hook_func, cptr name, void *data);
-extern void del_hook_new(int h_idx, hook_func_t hook_func);
+void add_hook_new(int h_idx, hook_func_t hook_func, cptr name, void *data);
+void del_hook_new(int h_idx, hook_func_t hook_func);
extern int process_hooks_restart;
-extern bool_ process_hooks_new(int h_idx, void *in, void *out);
+bool process_hooks_new(int h_idx, void *in, void *out);
diff --git a/src/include/tome/enum_string_map.hpp b/src/include/tome/enum_string_map.hpp
index 8ae1e115..814827fe 100644
--- a/src/include/tome/enum_string_map.hpp
+++ b/src/include/tome/enum_string_map.hpp
@@ -29,20 +29,20 @@ public:
assert(bimap.size() == in.size());
}
- const char *stringify(E e) {
+ const char *stringify(E e) const {
auto i = bimap.left.find(e);
assert(i != bimap.left.end() && "Missing mapping for enumerated value");
return i->second.c_str();
}
- E parse(const char *s) {
+ E parse(const char *s) const {
E e;
bool result = parse(s, &e);
assert(result && "Missing string->enum mapping");
return e;
}
- bool parse(const char *s, E *e) {
+ bool parse(const char *s, E *e) const {
auto i = bimap.right.find(s);
if (i == bimap.right.end())
{
diff --git a/src/include/tome/pp/global_constexpr.hpp b/src/include/tome/pp/global_constexpr.hpp
new file mode 100644
index 00000000..83168c59
--- /dev/null
+++ b/src/include/tome/pp/global_constexpr.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+/**
+ * Macro for declaring a global constexpr variable without
+ * violating the ODR and without running into the SIOF.
+ *
+ * Shamelessly cribbed from http://stackoverflow.com/a/20374473
+ */
+#define PP_GLOBAL_CONSTEXPR_CONST(type, var, value) \
+namespace global_constexpr { namespace var { \
+template<class = void> \
+struct wrapper \
+{ \
+ static constexpr type var = value; \
+}; \
+template<class T> \
+constexpr type wrapper<T>::var; \
+} } \
+namespace { \
+auto const& var = global_constexpr::var::wrapper<>::var; \
+}
diff --git a/src/include/tome/squelch/automatizer.hpp b/src/include/tome/squelch/automatizer.hpp
index 786ca1ae..833b5648 100644
--- a/src/include/tome/squelch/automatizer.hpp
+++ b/src/include/tome/squelch/automatizer.hpp
@@ -2,8 +2,8 @@
#include <boost/noncopyable.hpp>
#include <memory>
+#include <jsoncons/json.hpp>
#include <vector>
-#include <jansson.h>
#include "tome/squelch/rule_fwd.hpp"
#include "tome/squelch/cursor_fwd.hpp"
@@ -44,15 +44,14 @@ public:
bool apply_rules(object_type *o_ptr, int item_idx) const;
/**
- * Build a JSON data structure to represent
- * all the rules.
+ * Build a JSON document to represent all the rules.
*/
- std::shared_ptr<json_t> to_json() const;
+ jsoncons::json to_json() const;
/**
- * Load rules from a JSON data structure.
+ * Load rules from a JSON document.
*/
- void load_json(json_t *json);
+ void load_json(jsoncons::json const &);
/**
* Remove currently selected condition or rule.
@@ -115,10 +114,9 @@ public:
void add_new_condition(std::function<std::shared_ptr<Condition> ()> factory);
/**
- * Get rule names. The names are not stable across multiple
- * calls to methods on this class.
+ * Get rule names.
*/
- void get_rule_names(std::vector<const char *> *names) const;
+ std::vector<std::string> get_rule_names() const;
/**
* Get current number of rules.
diff --git a/src/include/tome/squelch/condition.hpp b/src/include/tome/squelch/condition.hpp
index 5d1240f5..584ecb0e 100644
--- a/src/include/tome/squelch/condition.hpp
+++ b/src/include/tome/squelch/condition.hpp
@@ -3,10 +3,10 @@
#include "tome/squelch/condition_fwd.hpp"
#include <boost/noncopyable.hpp>
+#include <cstdint>
#include <functional>
#include <memory>
-#include <cstdint>
-#include <jansson.h>
+#include <jsoncons/json.hpp>
#include "tome/squelch/cursor_fwd.hpp"
#include "tome/squelch/tree_printer_fwd.hpp"
@@ -60,7 +60,7 @@ public:
}
public:
- json_t *to_json() const;
+ jsoncons::json to_json() const;
virtual void add_child(ConditionFactory const &factory) {
// Default is to not support children.
@@ -88,16 +88,16 @@ public:
/**
* Parse condition from JSON
*/
- static std::shared_ptr<Condition> parse_condition(json_t *);
+ static std::shared_ptr<Condition> parse_condition(jsoncons::json const &);
/**
* Convert an (optional) condition to JSON.
*/
- static json_t *optional_to_json(std::shared_ptr<Condition> condition);
+ static jsoncons::json optional_to_json(std::shared_ptr<Condition> condition);
protected:
virtual void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const = 0;
- virtual void to_json(json_t *) const = 0;
+ virtual void to_json(jsoncons::json &) const = 0;
// What do we want to match?
match_type match;
@@ -116,12 +116,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
uint8_t m_tval;
@@ -140,12 +140,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
std::string m_name;
@@ -164,12 +164,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
std::string m_contain;
@@ -189,12 +189,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
uint8_t m_min;
@@ -228,10 +228,10 @@ public:
virtual std::shared_ptr<Condition> next_child(Condition *current) override;
// Parse a list of conditions from JSON property
- static std::vector< std::shared_ptr<Condition> > parse_conditions(json_t *);
+ static std::vector< std::shared_ptr<Condition> > parse_conditions(jsoncons::json const &);
protected:
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
protected:
std::vector< std::shared_ptr<Condition> > m_conditions;
@@ -248,7 +248,7 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
@@ -265,7 +265,7 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
@@ -285,12 +285,12 @@ public:
public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
status_type m_status;
@@ -309,12 +309,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
std::string m_race;
@@ -333,12 +333,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
std::string m_subrace;
@@ -357,12 +357,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
std::string m_class;
@@ -381,12 +381,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
std::string m_inscription;
@@ -406,12 +406,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
int m_min;
@@ -432,12 +432,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
int m_min;
@@ -459,12 +459,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
uint16_t m_skill_idx;
@@ -485,12 +485,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
identification_state m_state;
@@ -509,12 +509,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
char m_symbol;
@@ -533,12 +533,12 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
private:
uint16_t m_ability_idx;
@@ -563,10 +563,10 @@ public:
virtual std::shared_ptr<Condition> first_child() override;
protected:
- void to_json(json_t *) const override;
+ void to_json(jsoncons::json &) const override;
static std::shared_ptr<Condition> parse_single_subcondition(
- json_t *condition_json);
+ jsoncons::json const &condition_json);
protected:
std::shared_ptr<Condition> m_subcondition;
@@ -584,7 +584,7 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
@@ -603,7 +603,7 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
@@ -623,7 +623,7 @@ public:
bool is_match(object_type *) const override;
- static std::shared_ptr<Condition> from_json(json_t *);
+ static std::shared_ptr<Condition> from_json(jsoncons::json const &);
protected:
void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override;
diff --git a/src/include/tome/squelch/rule.hpp b/src/include/tome/squelch/rule.hpp
index 63f1b6c0..af86dfc8 100644
--- a/src/include/tome/squelch/rule.hpp
+++ b/src/include/tome/squelch/rule.hpp
@@ -1,7 +1,7 @@
#pragma once
-#include <jansson.h>
#include <memory>
+#include <jsoncons/json.hpp>
#include "tome/squelch/condition_fwd.hpp"
#include "tome/squelch/cursor_fwd.hpp"
@@ -40,12 +40,12 @@ public:
/**
* Set the name of the rule
*/
- void set_name(const char *new_name);
+ void set_name(const std::string &new_name);
/**
* Get the name of the rule
*/
- const char *get_name() const;
+ std::string get_name() const;
/**
* Get condition
@@ -75,14 +75,14 @@ public:
bool apply_rule(object_type *o_ptr, int item_idx) const;
/**
- * Convert rule to JSON
+ * Convert rule to JSON.
*/
- virtual json_t *to_json() const;
+ virtual jsoncons::json to_json() const;
/**
* Parse rule from JSON
*/
- static std::shared_ptr<Rule> parse_rule(json_t *);
+ static std::shared_ptr<Rule> parse_rule(jsoncons::json const &);
protected:
virtual bool do_apply_rule(object_type *, int) const = 0;
@@ -148,7 +148,7 @@ public:
, m_inscription(inscription) {
}
- json_t *to_json() const override;
+ jsoncons::json to_json() const override;
protected:
virtual void do_write_tree(TreePrinter *p) const override;
diff --git a/src/include/tome/squelch/tree_printer.hpp b/src/include/tome/squelch/tree_printer.hpp
index e8ee1e56..c9e79af2 100644
--- a/src/include/tome/squelch/tree_printer.hpp
+++ b/src/include/tome/squelch/tree_printer.hpp
@@ -3,6 +3,7 @@
#include <boost/noncopyable.hpp>
#include <cstdint>
+#include <string>
namespace squelch {
@@ -30,7 +31,8 @@ public:
void scroll_right();
- void write(uint8_t color, const char *line);
+ void write(uint8_t color, const char *);
+ void write(uint8_t color, std::string const &);
private:
int m_indent;
diff --git a/src/init1.cc b/src/init1.cc
index 7083a5f3..e367f603 100644
--- a/src/init1.cc
+++ b/src/init1.cc
@@ -5,53 +5,69 @@
#include "cave.hpp"
#include "cave_type.hpp"
#include "dungeon_info_type.hpp"
+#include "dungeon_flag.hpp"
+#include "ego_flag.hpp"
#include "ego_item_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "gods.hpp"
-#include "hist_type.hpp"
#include "init2.hpp"
-#include "meta_class_type.hpp"
#include "monster2.hpp"
#include "monster_ego.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
+#include "object_flag_meta.hpp"
#include "object_kind.hpp"
-#include "owner_type.hpp"
#include "player_class.hpp"
#include "player_race.hpp"
+#include "player_race_flag.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
-#include "randart_gen_type.hpp"
-#include "randart_part_type.hpp"
#include "set_type.hpp"
+#include "skill_flag.hpp"
#include "skill_type.hpp"
#include "skills.hpp"
#include "spells5.hpp"
-#include "store_action_type.hpp"
+#include "store_flag.hpp"
#include "store_info_type.hpp"
-#include "store_type.hpp"
#include "tables.hpp"
#include "town_type.hpp"
-#include "trap_type.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
#include "variable.hpp"
-#include "vault_type.hpp"
-#include "wilderness_map.hpp"
#include "wilderness_type_info.hpp"
#include "z-rand.hpp"
#include <boost/algorithm/string/predicate.hpp>
+#include <boost/algorithm/string/classification.hpp>
+#include <boost/algorithm/string/split.hpp>
using boost::algorithm::iequals;
using boost::algorithm::ends_with;
+/**
+ * Expand vector such that it has room for an item at index i.
+ * If the vector is already large enough, nothing happens.
+ */
+template <class T> typename std::vector<T>::reference expand_to_fit_index(std::vector<T> &v, std::size_t i)
+{
+ if (v.size() < i + 1)
+ {
+ v.resize(i + 1);
+ }
+ return v[i];
+}
+
+
/*
* This file is used to initialize various variables and arrays for the
* Angband game. Note the use of "fd_read()" and "fd_write()" to bypass
@@ -151,981 +167,77 @@ static cptr r_info_blow_effect[] =
/*
- * Monster race flags
- */
-static cptr r_info_flags1[] =
-{
- "UNIQUE",
- "QUESTOR",
- "MALE",
- "FEMALE",
- "CHAR_CLEAR",
- "CHAR_MULTI",
- "ATTR_CLEAR",
- "ATTR_MULTI",
- "FORCE_DEPTH",
- "FORCE_MAXHP",
- "FORCE_SLEEP",
- "FORCE_EXTRA",
- "FRIEND",
- "FRIENDS",
- "ESCORT",
- "ESCORTS",
- "NEVER_BLOW",
- "NEVER_MOVE",
- "RAND_25",
- "RAND_50",
- "ONLY_GOLD",
- "ONLY_ITEM",
- "DROP_60",
- "DROP_90",
- "DROP_1D2",
- "DROP_2D2",
- "DROP_3D2",
- "DROP_4D2",
- "DROP_GOOD",
- "DROP_GREAT",
- "DROP_USEFUL",
- "DROP_CHOSEN"
-};
-
-/*
- * Monster race flags
- */
-static cptr r_info_flags2[] =
-{
- "STUPID",
- "SMART",
- "CAN_SPEAK",
- "REFLECTING",
- "INVISIBLE",
- "COLD_BLOOD",
- "EMPTY_MIND",
- "WEIRD_MIND",
- "DEATH_ORB",
- "REGENERATE",
- "SHAPECHANGER",
- "ATTR_ANY",
- "POWERFUL",
- "ELDRITCH_HORROR",
- "AURA_FIRE",
- "AURA_ELEC",
- "OPEN_DOOR",
- "BASH_DOOR",
- "PASS_WALL",
- "KILL_WALL",
- "MOVE_BODY",
- "KILL_BODY",
- "TAKE_ITEM",
- "KILL_ITEM",
- "BRAIN_1",
- "BRAIN_2",
- "BRAIN_3",
- "BRAIN_4",
- "BRAIN_5",
- "BRAIN_6",
- "BRAIN_7",
- "BRAIN_8"
-};
-
-/*
- * Monster race flags
- */
-static cptr r_info_flags3[] =
-{
- "ORC",
- "TROLL",
- "GIANT",
- "DRAGON",
- "DEMON",
- "UNDEAD",
- "EVIL",
- "ANIMAL",
- "THUNDERLORD",
- "GOOD",
- "AURA_COLD", /* TODO: Implement aura_cold */
- "NONLIVING",
- "HURT_LITE",
- "HURT_ROCK",
- "SUSCEP_FIRE",
- "SUSCEP_COLD",
- "IM_ACID",
- "IM_ELEC",
- "IM_FIRE",
- "IM_COLD",
- "IM_POIS",
- "RES_TELE",
- "RES_NETH",
- "RES_WATE",
- "RES_PLAS",
- "RES_NEXU",
- "RES_DISE",
- "UNIQUE_4",
- "NO_FEAR",
- "NO_STUN",
- "NO_CONF",
- "NO_SLEEP"
-};
-
-/*
- * Monster race flags
- */
-static cptr r_info_flags4[] =
-{
- "SHRIEK",
- "MULTIPLY",
- "S_ANIMAL",
- "ROCKET",
- "ARROW_1",
- "ARROW_2",
- "ARROW_3",
- "ARROW_4",
- "BR_ACID",
- "BR_ELEC",
- "BR_FIRE",
- "BR_COLD",
- "BR_POIS",
- "BR_NETH",
- "BR_LITE",
- "BR_DARK",
- "BR_CONF",
- "BR_SOUN",
- "BR_CHAO",
- "BR_DISE",
- "BR_NEXU",
- "BR_TIME",
- "BR_INER",
- "BR_GRAV",
- "BR_SHAR",
- "BR_PLAS",
- "BR_WALL",
- "BR_MANA",
- "BA_NUKE",
- "BR_NUKE",
- "BA_CHAO",
- "BR_DISI",
-};
-
-/*
- * Monster race flags
- */
-static cptr r_info_flags5[] =
-{
- "BA_ACID",
- "BA_ELEC",
- "BA_FIRE",
- "BA_COLD",
- "BA_POIS",
- "BA_NETH",
- "BA_WATE",
- "BA_MANA",
- "BA_DARK",
- "DRAIN_MANA",
- "MIND_BLAST",
- "BRAIN_SMASH",
- "CAUSE_1",
- "CAUSE_2",
- "CAUSE_3",
- "CAUSE_4",
- "BO_ACID",
- "BO_ELEC",
- "BO_FIRE",
- "BO_COLD",
- "BO_POIS",
- "BO_NETH",
- "BO_WATE",
- "BO_MANA",
- "BO_PLAS",
- "BO_ICEE",
- "MISSILE",
- "SCARE",
- "BLIND",
- "CONF",
- "SLOW",
- "HOLD"
-};
-
-/*
- * Monster race flags
- */
-static cptr r_info_flags6[] =
-{
- "HASTE",
- "HAND_DOOM",
- "HEAL",
- "S_ANIMALS",
- "BLINK",
- "TPORT",
- "TELE_TO",
- "TELE_AWAY",
- "TELE_LEVEL",
- "DARKNESS",
- "TRAPS",
- "FORGET",
- "ANIM_DEAD", /* ToDo: Implement ANIM_DEAD */
- "S_BUG",
- "S_RNG",
- "S_THUNDERLORD", /* DG : Summon Thunderlord */
- "S_KIN",
- "S_HI_DEMON",
- "S_MONSTER",
- "S_MONSTERS",
- "S_ANT",
- "S_SPIDER",
- "S_HOUND",
- "S_HYDRA",
- "S_ANGEL",
- "S_DEMON",
- "S_UNDEAD",
- "S_DRAGON",
- "S_HI_UNDEAD",
- "S_HI_DRAGON",
- "S_WRAITH",
- "S_UNIQUE"
-};
-
-
-/*
- * Monster race flags
- */
-static cptr r_info_flags7[] =
-{
- "AQUATIC",
- "CAN_SWIM",
- "CAN_FLY",
- "FRIENDLY",
- "PET",
- "MORTAL",
- "SPIDER",
- "NAZGUL",
- "DG_CURSE",
- "POSSESSOR",
- "NO_DEATH",
- "NO_TARGET",
- "AI_ANNOY",
- "AI_SPECIAL",
- "NEUTRAL",
- "DROP_ART",
- "DROP_RANDART",
- "AI_PLAYER",
- "NO_THEFT",
- "SPIRIT",
- "XXX7X20",
- "XXX7X21",
- "XXX7X22",
- "XXX7X23",
- "XXX7X24",
- "XXX7X25",
- "XXX7X26",
- "XXX7X27",
- "XXX7X28",
- "XXX7X29",
- "XXX7X30",
- "XXX7X31",
-};
-
-/*
- * Monster race flags
- */
-static cptr r_info_flags8[] =
-{
- "WILD_ONLY",
- "WILD_TOWN",
- "XXX8X02",
- "WILD_SHORE",
- "WILD_OCEAN",
- "WILD_WASTE",
- "WILD_WOOD",
- "WILD_VOLCANO",
- "XXX8X08",
- "WILD_MOUNTAIN",
- "WILD_GRASS",
- "NO_CUT",
- "CTHANGBAND",
- "XXX8X13",
- "ZANGBAND",
- "JOKEANGBAND",
- "BASEANGBAND",
- "XXX8X17",
- "XXX8X18",
- "XXX8X19",
- "XXX8X20",
- "XXX8X21",
- "XXX8X22",
- "XXX8X23",
- "XXX8X24",
- "XXX8X25",
- "XXX8X26",
- "XXX8X27",
- "XXX8X28",
- "XXX8X29",
- "WILD_SWAMP", /* ToDo: Implement Swamp */
- "WILD_TOO",
-};
-
-
-/*
- * Monster race flags - Drops
- */
-static cptr r_info_flags9[] =
-{
- "DROP_CORPSE",
- "DROP_SKELETON",
- "HAS_LITE",
- "MIMIC",
- "HAS_EGG",
- "IMPRESED",
- "SUSCEP_ACID",
- "SUSCEP_ELEC",
- "SUSCEP_POIS",
- "KILL_TREES",
- "WYRM_PROTECT",
- "DOPPLEGANGER",
- "ONLY_DEPTH",
- "SPECIAL_GENE",
- "NEVER_GENE",
- "XXX9X15",
- "XXX9X16",
- "XXX9X17",
- "XXX9X18",
- "XXX9X19",
- "XXX9X20",
- "XXX9X21",
- "XXX9X22",
- "XXX9X23",
- "XXX9X24",
- "XXX9X25",
- "XXX9X26",
- "XXX9X27",
- "XXX9X28",
- "XXX9X29",
- "XXX9X30",
- "XXX9X31",
-};
-
-
-/*
- * Object flags
+ * Helpers for looking up flags in the above arrays
+ * and extracting "bitmasks" from them.
*/
-cptr k_info_flags1[] =
-{
- "STR",
- "INT",
- "WIS",
- "DEX",
- "CON",
- "CHR",
- "MANA",
- "SPELL",
- "STEALTH",
- "SEARCH",
- "INFRA",
- "TUNNEL",
- "SPEED",
- "BLOWS",
- "CHAOTIC",
- "VAMPIRIC",
- "SLAY_ANIMAL",
- "SLAY_EVIL",
- "SLAY_UNDEAD",
- "SLAY_DEMON",
- "SLAY_ORC",
- "SLAY_TROLL",
- "SLAY_GIANT",
- "SLAY_DRAGON",
- "KILL_DRAGON",
- "VORPAL",
- "IMPACT",
- "BRAND_POIS",
- "BRAND_ACID",
- "BRAND_ELEC",
- "BRAND_FIRE",
- "BRAND_COLD"
-};
-/*
- * Object flags
- */
-cptr k_info_flags2[] =
-{
- "SUST_STR",
- "SUST_INT",
- "SUST_WIS",
- "SUST_DEX",
- "SUST_CON",
- "SUST_CHR",
- "INVIS",
- "LIFE",
- "IM_ACID",
- "IM_ELEC",
- "IM_FIRE",
- "IM_COLD",
- "SENS_FIRE",
- "REFLECT",
- "FREE_ACT",
- "HOLD_LIFE",
- "RES_ACID",
- "RES_ELEC",
- "RES_FIRE",
- "RES_COLD",
- "RES_POIS",
- "RES_FEAR",
- "RES_LITE",
- "RES_DARK",
- "RES_BLIND",
- "RES_CONF",
- "RES_SOUND",
- "RES_SHARDS",
- "RES_NETHER",
- "RES_NEXUS",
- "RES_CHAOS",
- "RES_DISEN"
-};
+namespace { // anonymous
-/*
- * Trap flags
- */
-cptr k_info_flags2_trap[] =
-{
- "AUTOMATIC_5",
- "AUTOMATIC_99",
- "KILL_GHOST",
- "TELEPORT_TO",
- "ONLY_DRAGON",
- "ONLY_DEMON",
- "XXX3",
- "XXX3",
- "ONLY_ANIMAL",
- "ONLY_UNDEAD",
- "ONLY_EVIL",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
-};
+namespace detail {
-
-/*
- * Object flags
- */
-cptr k_info_flags3[] =
-{
- "SH_FIRE",
- "SH_ELEC",
- "AUTO_CURSE",
- "DECAY",
- "NO_TELE",
- "NO_MAGIC",
- "WRAITH",
- "TY_CURSE",
- "EASY_KNOW",
- "HIDE_TYPE",
- "SHOW_MODS",
- "INSTA_ART",
- "FEATHER",
- "LITE1",
- "SEE_INVIS",
- "NORM_ART",
- "SLOW_DIGEST",
- "REGEN",
- "XTRA_MIGHT",
- "XTRA_SHOTS",
- "IGNORE_ACID",
- "IGNORE_ELEC",
- "IGNORE_FIRE",
- "IGNORE_COLD",
- "ACTIVATE",
- "DRAIN_EXP",
- "TELEPORT",
- "AGGRAVATE",
- "BLESSED",
- "CURSED",
- "HEAVY_CURSE",
- "PERMA_CURSE"
-};
-
-/*
- * Object flags
- */
-cptr k_info_flags4[] =
-{
- "NEVER_BLOW",
- "PRECOGNITION",
- "BLACK_BREATH",
- "RECHARGE",
- "FLY",
- "DG_CURSE",
- "COULD2H",
- "MUST2H",
- "LEVELS",
- "CLONE",
- "SPECIAL_GENE",
- "CLIMB",
- "FAST_CAST",
- "CAPACITY",
- "CHARGING",
- "CHEAPNESS",
- "FOUNTAIN",
- "ANTIMAGIC_50",
- "XXX5",
- "XXX5",
- "XXX5",
- "EASY_USE",
- "IM_NETHER",
- "RECHARGED",
- "ULTIMATE",
- "AUTO_ID",
- "LITE2",
- "LITE3",
- "FUEL_LITE",
- "XXX5",
- "CURSE_NO_DROP",
- "NO_RECHARGE"
-};
-
-/*
- * Object flags
- */
-cptr k_info_flags5[] =
-{
- "TEMPORARY",
- "DRAIN_MANA",
- "DRAIN_HP",
- "KILL_DEMON",
- "KILL_UNDEAD",
- "CRIT",
- "ATTR_MULTI",
- "WOUNDING",
- "FULL_NAME",
- "LUCK",
- "IMMOVABLE",
- "SPELL_CONTAIN",
- "RES_MORGUL",
- "ACTIVATE_NO_WIELD",
- "MAGIC_BREATH",
- "WATER_BREATH",
- "WIELD_CAST",
- "XXX8X17",
- "XXX8X18",
- "XXX8X19",
- "XXX8X20",
- "XXX8X21",
- "XXX8X22",
- "XXX8X23",
- "XXX8X24",
- "XXX8X25",
- "XXX8X26",
- "XXX8X27",
- "XXX8X28",
- "XXX8X29",
- "XXX8X02",
- "XXX8X22",
-};
-
-/*
- * ESP flags
+/**
+ * A "tie" (see e.g. std::tuple) between a "flags" value pointer and its
+ * corresponding array of text strings. Implementation detail.
*/
-cptr esp_flags[] =
-{
- "ESP_ORC",
- "ESP_TROLL",
- "ESP_DRAGON",
- "ESP_GIANT",
- "ESP_DEMON",
- "ESP_UNDEAD",
- "ESP_EVIL",
- "ESP_ANIMAL",
- "ESP_THUNDERLORD",
- "ESP_GOOD",
- "ESP_NONLIVING",
- "ESP_UNIQUE",
- "ESP_SPIDER",
- "XXX8X02",
- "XXX8X02",
- "XXX8X02",
- "XXX8X02",
- "XXX8X17",
- "XXX8X18",
- "XXX8X19",
- "XXX8X20",
- "XXX8X21",
- "XXX8X22",
- "XXX8X23",
- "XXX8X24",
- "XXX8X25",
- "XXX8X26",
- "XXX8X27",
- "XXX8X28",
- "XXX8X29",
- "XXX8X02",
- "ESP_ALL",
-};
-
-/* Specially handled properties for ego-items */
+template <size_t N> struct flag_tie_impl {
+private:
+ u32b *m_mask;
+ cptr (&m_flags)[N];
+public:
+ flag_tie_impl(u32b *mask, cptr (&flags)[N]): m_mask(mask), m_flags(flags) {
+ // Empty
+ }
-static cptr ego_flags[] =
-{
- "SUSTAIN",
- "OLD_RESIST",
- "ABILITY",
- "R_ELEM",
- "R_LOW",
- "R_HIGH",
- "R_ANY",
- "R_DRAGON",
- "SLAY_WEAP",
- "DAM_DIE",
- "DAM_SIZE",
- "PVAL_M1",
- "PVAL_M2",
- "PVAL_M3",
- "PVAL_M5",
- "AC_M1",
- "AC_M2",
- "AC_M3",
- "AC_M5",
- "TH_M1",
- "TH_M2",
- "TH_M3",
- "TH_M5",
- "TD_M1",
- "TD_M2",
- "TD_M3",
- "TD_M5",
- "R_P_ABILITY",
- "R_STAT",
- "R_STAT_SUST",
- "R_IMMUNITY",
- "LIMIT_BLOWS"
+ bool match(cptr flag) {
+ for (unsigned int i = 0; i < N; i++)
+ {
+ if (streq(flag, m_flags[i]))
+ {
+ *m_mask |= (1L << i);
+ return true;
+ }
+ }
+ return false;
+ }
};
-/*
- * Feature flags
- */
-static cptr f_info_flags1[] =
-{
- "NO_WALK",
- "NO_VISION",
- "CAN_LEVITATE",
- "CAN_PASS",
- "FLOOR",
- "WALL",
- "PERMANENT",
- "CAN_FLY",
- "REMEMBER",
- "NOTICE",
- "DONT_NOTICE_RUNNING",
- "CAN_RUN",
- "DOOR",
- "SUPPORT_LIGHT",
- "CAN_CLIMB",
- "TUNNELABLE",
- "WEB",
- "ATTR_MULTI",
- "SUPPORT_GROWTH",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1"
-};
+} // namespace detail
-/*
- * Dungeon flags
+/**
+ * Tie a flags value pointer and its corresponding array
+ * of text strings.
*/
-static cptr d_info_flags1[] =
-{
- "PRINCIPAL",
- "MAZE",
- "SMALLEST",
- "SMALL",
- "BIG",
- "NO_DOORS",
- "WATER_RIVER",
- "LAVA_RIVER",
- "WATER_RIVERS",
- "LAVA_RIVERS",
- "CAVE",
- "CAVERN",
- "NO_UP",
- "HOT",
- "COLD",
- "FORCE_DOWN",
- "FORGET",
- "NO_DESTROY",
- "SAND_VEIN",
- "CIRCULAR_ROOMS",
- "EMPTY",
- "DAMAGE_FEAT",
- "FLAT",
- "TOWER",
- "RANDOM_TOWNS",
- "DOUBLE",
- "LIFE_LEVEL",
- "EVOLVE",
- "ADJUST_LEVEL_1",
- "ADJUST_LEVEL_2",
- "NO_RECALL",
- "NO_STREAMERS"
-};
-
-static cptr d_info_flags2[] =
-{
- "ADJUST_LEVEL_1_2",
- "NO_SHAFT",
- "ADJUST_LEVEL_PLAYER",
- "NO_TELEPORT",
- "ASK_LEAVE",
- "NO_STAIR",
- "SPECIAL",
- "NO_NEW_MONSTER",
- "DESC",
- "NO_GENO",
- "NO_BREATH",
- "WATER_BREATH",
- "ELVEN",
- "DWARVEN",
- "NO_EASY_MOVE",
- "NO_RECALL_OUT",
- "DESC_ALWAYS",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1"
-};
+template<size_t N> detail::flag_tie_impl<N> flag_tie(u32b *mask, cptr (&flags)[N]) {
+ static_assert(N <= 32, "Array too large to represent result");
+ return detail::flag_tie_impl<N>(mask, flags);
+}
-/*
- * Trap flags
+/**
+ * Look up flag in array of flags.
*/
-static cptr t_info_flags[] =
+template<size_t N> bool lookup_flags(cptr)
{
- "CHEST",
- "DOOR",
- "FLOOR",
- "XXX4",
- "XXX5",
- "XXX6",
- "XXX7",
- "XXX8",
- "XXX9",
- "XXX10",
- "XXX11",
- "XXX12",
- "XXX13",
- "XXX14",
- "XXX15",
- "XXX16",
- "LEVEL1",
- "LEVEL2",
- "LEVEL3",
- "LEVEL4",
- "XXX21",
- "XXX22",
- "XXX23",
- "XXX24",
- "XXX25",
- "XXX26",
- "XXX27",
- "XXX28",
- "XXX29",
- "XXX30",
- "XXX31",
- "XXX32"
-};
+ // Base case: No match
+ return false;
+}
-/*
- * Stores flags
+/**
+ * Look up flag in array of flags.
*/
-static cptr st_info_flags1[] =
-{
- "DEPEND_LEVEL",
- "SHALLOW_LEVEL",
- "MEDIUM_LEVEL",
- "DEEP_LEVEL",
- "RARE",
- "VERY_RARE",
- "COMMON",
- "ALL_ITEM",
- "RANDOM",
- "FORCE_LEVEL",
- "MUSEUM",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1"
-};
+template<size_t N, typename... Pairs> bool lookup_flags(cptr flag, detail::flag_tie_impl<N> tie, Pairs&&...rest) {
+ // Inductive case: Check against current "tie"
+ if (tie.match(flag)) {
+ // Match
+ return true;
+ } else {
+ // No match; check against rest of the array of flags
+ return lookup_flags<N>(flag, rest...);
+ }
+}
-/*
- * Race flags
- */
-cptr rp_info_flags1[] =
-{
- "EXPERIMENTAL",
- "XXX",
- "RESIST_BLACK_BREATH",
- "NO_STUN",
- "XTRA_MIGHT_BOW",
- "XTRA_MIGHT_XBOW",
- "XTRA_MIGHT_SLING",
- "AC_LEVEL",
- "HURT_LITE",
- "VAMPIRE",
- "UNDEAD",
- "NO_CUT",
- "CORRUPT",
- "NO_FOOD",
- "NO_GOD",
- "XXX",
- "ELF",
- "SEMI_WRAITH",
- "NO_SUBRACE_CHANGE",
- "XXX",
- "XXX",
- "MOLD_FRIEND",
- "GOD_FRIEND",
- "XXX",
- "INNATE_SPELLS",
- "XXX",
- "XXX",
- "EASE_STEAL",
- "XXX",
- "XXX",
- "XXX",
- "XXX"
-};
+} // namespace anonymous
-/*
- * Race flags
- */
-cptr rp_info_flags2[] =
-{
- "XXX",
- "ASTRAL",
- "XXX",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1"
-};
-/* Skill flags */
-static cptr s_info_flags1[] =
-{
- "HIDDEN",
- "AUTO_HIDE",
- "RANDOM_GAIN",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1",
- "XXX1"
-};
/*
* Dungeon effect types (used in E:damage:frequency:type entry in d_info.txt)
@@ -1527,13 +639,12 @@ static void strappend(char **s, const char *t)
static bool_ unknown_shut_up = FALSE;
static errr grab_one_class_flag(u32b *choice, cptr what)
{
- int i;
- cptr s;
+ auto const &class_info = game->edit_data.class_info;
/* Scan classes flags */
- for (i = 0; i < max_c_idx && (s = class_info[i].title); i++)
+ for (std::size_t i = 0; i < class_info.size(); i++)
{
- if (streq(what, s))
+ if (class_info[i].title == what)
{
(choice[i / 32]) |= (1L << i);
return (0);
@@ -1546,15 +657,15 @@ static errr grab_one_class_flag(u32b *choice, cptr what)
/* Failure */
return (1);
}
+
static errr grab_one_race_allow_flag(u32b *choice, cptr what)
{
- int i;
- cptr s;
+ auto const &race_info = game->edit_data.race_info;
/* Scan classes flags */
- for (i = 0; i < max_rp_idx && (s = race_info[i].title); i++)
+ for (std::size_t i = 0; i < race_info.size(); i++)
{
- if (streq(what, s))
+ if (race_info[i].title == what)
{
(choice[i / 32]) |= (1L << i);
return (0);
@@ -1571,19 +682,16 @@ static errr grab_one_race_allow_flag(u32b *choice, cptr what)
/*
* Grab one flag from a textual string
*/
-static errr grab_one_skill_flag(u32b *f1, cptr what)
+static errr grab_one_skill_flag(skill_flag_set *flags, cptr what)
{
- int i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, s_info_flags1[i]))
- {
- (*f1) |= (1L << i);
- return (0);
- }
- }
+#define SKF(tier, index, name) \
+ if (streq(what, #name)) \
+ { \
+ *flags |= BOOST_PP_CAT(SKF_,name); \
+ return 0; \
+ };
+#include "skill_flag_list.hpp"
+#undef SKF
/* Oops */
msg_format("(2)Unknown skill flag '%s'.", what);
@@ -1594,29 +702,16 @@ static errr grab_one_skill_flag(u32b *f1, cptr what)
/*
* Grab one flag from a textual string
*/
-static errr grab_one_player_race_flag(u32b *f1, u32b *f2, cptr what)
+static errr grab_one_player_race_flag(player_race_flag_set *flags, cptr what)
{
- int i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, rp_info_flags1[i]))
- {
- (*f1) |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, rp_info_flags2[i]))
- {
- (*f2) |= (1L << i);
- return (0);
- }
- }
+#define PR(tier, index, name) \
+ if (streq(what, #name)) \
+ { \
+ *flags |= BOOST_PP_CAT(PR_,name); \
+ return 0; \
+ };
+#include "player_race_flag_list.hpp"
+#undef PR
/* Oops */
msg_format("(2)Unknown race flag '%s'.", what);
@@ -1642,109 +737,159 @@ static int get_activation(char *activation)
}
/*
- * Grab one flag in an object_kind from a textual string
+ * Convert string to object_flag_set value
*/
-static errr grab_one_race_kind_flag(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp, cptr what)
+static object_flag_set object_flag_set_from_string(cptr what)
{
- int i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
+ for (auto const flag_meta: object_flags_meta())
{
- if (streq(what, k_info_flags1[i]))
+ if (streq(what, flag_meta->e_name))
{
- (*f1) |= (1L << i);
- return (0);
- }
+ return flag_meta->flag_set;
+ };
}
- /* Check flags2 */
- for (i = 0; i < 32; i++)
+ return object_flag_set();
+}
+
+/*
+ * Grab one flag in an object_kind from a textual string
+ */
+static errr grab_object_flag(object_flag_set *flags, cptr what)
+{
+ if (object_flag_set f = object_flag_set_from_string(what))
{
- if (streq(what, k_info_flags2[i]))
- {
- (*f2) |= (1L << i);
- return (0);
- }
+ *flags |= f;
+ return 0;
}
- /* Check flags2 -- traps*/
- for (i = 0; i < 32; i++)
+ /* Oops */
+ msg_format("Unknown object flag '%s'.", what);
+
+ /* Error */
+ return (1);
+}
+
+/*
+ * Read skill values
+ */
+static int read_skill_modifiers(skill_modifiers *skill_modifiers, cptr buf)
+{
+ long val, mod;
+ char v, m;
+ char name[200];
+
+ if (5 != sscanf(buf, "%c%ld:%c%ld:%s", &v, &val, &m, &mod, name))
{
- if (streq(what, k_info_flags2_trap[i]))
- {
- (*f3) |= (1L << i);
- return (0);
- }
+ return 1;
}
- /* Check flags3 */
- for (i = 0; i < 32; i++)
+ long i;
+ if ((i = find_skill(name)) == -1)
{
- if (streq(what, k_info_flags3[i]))
- {
- (*f3) |= (1L << i);
- return (0);
- }
+ return 1;
}
- /* Check flags4 */
- for (i = 0; i < 32; i++)
+ auto s = &expand_to_fit_index(skill_modifiers->modifiers, i);
+
+ s->basem = monster_ego_modify(v);
+ s->base = val;
+ s->modm = monster_ego_modify(m);
+ s->mod = mod;
+
+ return 0;
+}
+
+
+/*
+ * Read prototype objects
+ */
+static int read_proto_object(std::vector<object_proto> *protos, cptr buf)
+{
+ int s0, s1, s2, s3, s4;
+
+ if (5 != sscanf(buf, "%d:%d:%d:%dd%d", &s0, &s1, &s4, &s2, &s3))
{
- if (streq(what, k_info_flags4[i]))
+ s4 = 0;
+
+ if (4 != sscanf(buf, "%d:%d:%dd%d", &s0, &s1, &s2, &s3))
{
- (*f4) |= (1L << i);
- return (0);
+ return 1;
}
}
- /* Check flags5 */
- for (i = 0; i < 32; i++)
+ object_proto proto;
+ proto.pval = s4;
+ proto.tval = s0;
+ proto.sval = s1;
+ proto.dd = s2;
+ proto.ds = s3;
+
+ protos->emplace_back(proto);
+
+ return 0;
+}
+
+
+/*
+ * Read an ability assignment
+ */
+static int read_ability(std::vector<player_race_ability_type> *abilities, char *buf)
+{
+ int level = 0;
+ char *name = nullptr;
+
+ // Find the ':' separator
+ if (!(name = strchr(buf, ':')))
{
- if (streq(what, k_info_flags5[i]))
- {
- (*f5) |= (1L << i);
- return (0);
- }
+ return 1;
}
- /* Check esp_flags */
- for (i = 0; i < 32; i++)
+ // Split the buffer there and advance to point at the ability name
+ name++;
+
+ // Extract the level
+ if (1 != sscanf(buf, "%d:", &level))
{
- if (streq(what, esp_flags[i]))
- {
- (*esp) |= (1L << i);
- return (0);
- }
+ return 1;
}
- /* Oops */
- msg_format("Unknown object flag '%s'.", what);
+ // Try to find the ability by name
+ int idx = find_ability(name);
+ if (idx < 0)
+ {
+ return 1;
+ }
- /* Error */
- return (1);
+ // Insert
+ player_race_ability_type ability;
+ ability.ability = idx;
+ ability.level = level;
+ abilities->emplace_back(ability);
+
+ return 0;
}
+
/*
* Initialize the "player" arrays, by parsing an ascii "template" file
*/
errr init_player_info_txt(FILE *fp)
{
- int i = 0, z;
- int powers = 0;
+ auto &class_info = game->edit_data.class_info;
+ auto &race_info = game->edit_data.race_info;
+ auto &race_mod_info = game->edit_data.race_mod_info;
+ auto &gen_skill = game->edit_data.gen_skill;
+
int lev = 1;
int tit_idx = 0;
- int spec_idx = 0;
- int cur_ab = -1;
char buf[1024];
- char *s, *t;
/* Current entry */
player_race *rp_ptr = NULL;
player_race_mod *rmp_ptr = NULL;
player_class *c_ptr = NULL;
player_spec *s_ptr = NULL;
- meta_class_type *mc_ptr = NULL;
/* Just before the first record */
@@ -1753,15 +898,6 @@ errr init_player_info_txt(FILE *fp)
/* Just before the first line */
error_line = -1;
- /* Init general skills */
- for (z = 0; z < MAX_SKILLS; z++)
- {
- gen_skill_basem[z] = 0;
- gen_skill_base[z] = 0;
- gen_skill_modm[z] = 0;
- gen_skill_mod[z] = 0;
- }
-
/* Parse */
while (0 == my_fgets(fp, buf, 1024))
{
@@ -1781,44 +917,13 @@ errr init_player_info_txt(FILE *fp)
continue;
}
- /* Process 'H' for "History" */
- if (buf[0] == 'H')
- {
- int idx;
- char *zz[6];
-
- /* Scan for the values */
- if (tokenize(buf + 2, 6, zz, ':', ':') != 6) return (1);
-
- idx = atoi(zz[0]);
- bg[idx].roll = atoi(zz[1]);
- bg[idx].chart = atoi(zz[2]);
- bg[idx].next = atoi(zz[3]);
- bg[idx].bonus = atoi(zz[4]);
-
- /* Copy text */
- assert(!bg[idx].info);
- bg[idx].info = my_strdup(zz[5]);
-
- /* Next... */
- continue;
- }
-
/* Process 'G:k' for "General skills" */
if ((buf[0] == 'G') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- gen_skill_basem[i] = monster_ego_modify(v);
- gen_skill_base[i] = val;
- gen_skill_modm[i] = monster_ego_modify(m);
- gen_skill_mod[i] = mod;
+ if (read_skill_modifiers(&gen_skill, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -1828,7 +933,7 @@ errr init_player_info_txt(FILE *fp)
if ((buf[0] == 'R') && (buf[2] == 'N'))
{
/* Find the colon before the name */
- s = strchr(buf + 4, ':');
+ char *s = strchr(buf + 4, ':');
/* Verify that colon */
if (!s) return (1);
@@ -1840,31 +945,23 @@ errr init_player_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 4);
+ int i = atoi(buf + 4);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_rp_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- rp_ptr = &race_info[i];
+ rp_ptr = &expand_to_fit_index(race_info, i);
+ assert(rp_ptr->title.empty());
/* Copy title */
- assert(!rp_ptr->title);
- rp_ptr->title = my_strdup(s);
+ rp_ptr->title = s;
/* Initialize */
- rp_ptr->powers[0] = rp_ptr->powers[1] = rp_ptr->powers[2] = rp_ptr->powers[3] = -1;
- powers = 0;
lev = 1;
- cur_ab = 0;
- for (z = 0; z < 10; z++)
- rp_ptr->abilities[z].level = -1;
/* Next... */
continue;
@@ -1873,18 +970,15 @@ errr init_player_info_txt(FILE *fp)
/* Process 'D' for "Description" */
if ((buf[0] == 'R') && (buf[2] == 'D'))
{
- /* Acquire the text */
- s = buf + 4;
-
- if (!rp_ptr->desc)
+ // Need newline?
+ if (!rp_ptr->desc.empty())
{
- rp_ptr->desc = my_strdup(s);
- }
- else
- {
- strappend(&rp_ptr->desc, format("\n%s", s));
+ rp_ptr->desc += '\n';
}
+ // Append
+ rp_ptr->desc += (buf + 4);
+
/* Next... */
continue;
}
@@ -1915,7 +1009,7 @@ errr init_player_info_txt(FILE *fp)
&s[0], &s[1])) return (1);
lev = s[0];
- rp_ptr->opval[lev] = s[1];
+ rp_ptr->lflags[lev].pval = s[1];
/* Next... */
continue;
@@ -1932,7 +1026,9 @@ errr init_player_info_txt(FILE *fp)
rp_ptr->luck = s[6];
for (z = 0; z < 6; z++)
- rp_ptr->r_adj[z] = s[z];
+ {
+ rp_ptr->ps.adj[z] = s[z];
+ }
/* Next... */
continue;
@@ -1941,12 +1037,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'Z' for "powers" */
if ((buf[0] == 'R') && (buf[2] == 'Z'))
{
- int i;
-
/* Acquire the text */
- s = buf + 4;
+ char const *s = buf + 4;
/* Find it in the list */
+ int i;
for (i = 0; i < POWER_MAX; i++)
{
if (iequals(s, powers_type[i].name)) break;
@@ -1954,29 +1049,7 @@ errr init_player_info_txt(FILE *fp)
if (i == POWER_MAX) return (6);
- rp_ptr->powers[powers++] = i;
-
- /* Next... */
- continue;
- }
-
- /* Process 'K' for "sKills" */
- if ((buf[0] == 'R') && (buf[2] == 'K'))
- {
- int s[8];
-
- /* Scan for the values */
- if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d",
- &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1);
-
- rp_ptr->r_dis = s[0];
- rp_ptr->r_dev = s[1];
- rp_ptr->r_sav = s[2];
- rp_ptr->r_stl = s[3];
- rp_ptr->r_srh = s[4];
- rp_ptr->r_fos = s[5];
- rp_ptr->r_thn = s[6];
- rp_ptr->r_thb = s[7];
+ rp_ptr->ps.powers.push_back(i);
/* Next... */
continue;
@@ -1985,18 +1058,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if ((buf[0] == 'R') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- rp_ptr->skill_basem[i] = monster_ego_modify(v);
- rp_ptr->skill_base[i] = val;
- rp_ptr->skill_modm[i] = monster_ego_modify(m);
- rp_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&rp_ptr->skill_modifiers, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -2005,46 +1070,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'b' for "abilities" */
if ((buf[0] == 'R') && (buf[2] == 'b'))
{
- char *sec;
-
- /* Scan for the values */
- if (NULL == (sec = strchr(buf + 4, ':')))
+ if (read_ability(&rp_ptr->abilities, buf + 4))
{
- return (1);
+ return 1;
}
- *sec = '\0';
- sec++;
- if (!*sec) return (1);
-
- if ((i = find_ability(sec)) == -1) return (1);
-
- rp_ptr->abilities[cur_ab].ability = i;
- rp_ptr->abilities[cur_ab].level = atoi(buf + 4);
- cur_ab++;
-
- /* Next... */
- continue;
- }
-
- /* Process 'M' for "Mods" */
- if ((buf[0] == 'R') && (buf[2] == 'M'))
- {
- int s[10];
-
- /* Scan for the values */
- if (10 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7], &s[8], &s[9])) return (1);
-
- rp_ptr->b_age = s[0];
- rp_ptr->m_age = s[1];
- rp_ptr->m_b_ht = s[2];
- rp_ptr->m_m_ht = s[3];
- rp_ptr->m_b_wt = s[4];
- rp_ptr->m_m_wt = s[5];
- rp_ptr->f_b_ht = s[6];
- rp_ptr->f_m_ht = s[7];
- rp_ptr->f_b_wt = s[8];
- rp_ptr->f_m_wt = s[9];
/* Next... */
continue;
@@ -2053,16 +1082,15 @@ errr init_player_info_txt(FILE *fp)
/* Process 'P' for "xtra" */
if ((buf[0] == 'R') && (buf[2] == 'P'))
{
- int s[4];
+ int s[3];
/* Scan for the values */
- if (4 != sscanf(buf + 4, "%d:%d:%d:%d",
- &s[0], &s[1], &s[2], &s[3])) return (1);
+ if (3 != sscanf(buf + 4, "%d:%d:%d",
+ &s[0], &s[1], &s[2])) return (1);
- rp_ptr->r_mhp = s[0];
- rp_ptr->r_exp = s[1];
+ rp_ptr->ps.mhp = s[0];
+ rp_ptr->ps.exp = s[1];
rp_ptr->infra = s[2];
- rp_ptr->chart = s[3];
/* Next... */
continue;
@@ -2071,24 +1099,9 @@ errr init_player_info_txt(FILE *fp)
/* Process 'G' for "Player flags" (multiple lines) */
if ((buf[0] == 'R') && (buf[2] == 'G'))
{
- /* Parse every entry */
- for (s = buf + 4; *s; )
+ if (0 != grab_one_player_race_flag(&rp_ptr->flags, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_player_race_flag(&rp_ptr->flags1, &rp_ptr->flags2, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -2098,24 +1111,9 @@ errr init_player_info_txt(FILE *fp)
/* Process 'F' for "level Flags" (multiple lines) */
if ((buf[0] == 'R') && (buf[2] == 'F'))
{
- /* Parse every entry */
- for (s = buf + 4; *s; )
+ if (grab_object_flag(&rp_ptr->lflags[lev].oflags, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_race_kind_flag(&rp_ptr->oflags1[lev], &rp_ptr->oflags2[lev], &rp_ptr->oflags3[lev], &rp_ptr->oflags4[lev], &rp_ptr->oflags5[lev], &rp_ptr->oesp[lev], s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -2125,27 +1123,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'O' for "Object birth" */
if ((buf[0] == 'R') && (buf[2] == 'O'))
{
- int s[5];
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%d:%d:%d:%dd%d",
- &s[0], &s[1], &s[4], &s[2], &s[3]))
+ if (read_proto_object(&rp_ptr->object_protos, buf + 4))
{
- s[4] = 0;
-
- if (4 != sscanf(buf + 4, "%d:%d:%dd%d",
- &s[0], &s[1], &s[2], &s[3]))
- {
- return (1);
- }
+ return 1;
}
- rp_ptr->obj_pval[rp_ptr->obj_num] = s[4];
- rp_ptr->obj_tval[rp_ptr->obj_num] = s[0];
- rp_ptr->obj_sval[rp_ptr->obj_num] = s[1];
- rp_ptr->obj_dd[rp_ptr->obj_num] = s[2];
- rp_ptr->obj_ds[rp_ptr->obj_num++] = s[3];
-
/* Next... */
continue;
}
@@ -2153,24 +1135,9 @@ errr init_player_info_txt(FILE *fp)
/* Process 'C' for "Class choice flags" (multiple lines) */
if ((buf[0] == 'R') && (buf[2] == 'C'))
{
- /* Parse every entry */
- for (s = buf + 4; *s; )
+ if (0 != grab_one_class_flag(rp_ptr->choice, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_class_flag(rp_ptr->choice, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -2181,7 +1148,7 @@ errr init_player_info_txt(FILE *fp)
if ((buf[0] == 'S') && (buf[2] == 'N'))
{
/* Find the colon before the name */
- s = strchr(buf + 4, ':');
+ char *s = strchr(buf + 4, ':');
/* Verify that colon */
if (!s) return (1);
@@ -2193,31 +1160,23 @@ errr init_player_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 4);
+ int i = atoi(buf + 4);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_rmp_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- rmp_ptr = &race_mod_info[i];
+ rmp_ptr = &expand_to_fit_index(race_mod_info, i);
+ assert(rmp_ptr->title.empty());
/* Copy title */
- assert(!rmp_ptr->title);
- rmp_ptr->title = my_strdup(s);
+ rmp_ptr->title = s;
/* Initialize */
- rmp_ptr->powers[0] = rmp_ptr->powers[1] = rmp_ptr->powers[2] = rmp_ptr->powers[3] = -1;
- powers = 0;
lev = 1;
- cur_ab = 0;
- for (z = 0; z < 10; z++)
- rmp_ptr->abilities[z].level = -1;
/* Next... */
continue;
@@ -2227,7 +1186,7 @@ errr init_player_info_txt(FILE *fp)
if ((buf[0] == 'S') && (buf[2] == 'D'))
{
/* Acquire the text */
- s = buf + 6;
+ char const *s = buf + 6;
/* Place */
if (buf[4] == 'A')
@@ -2240,15 +1199,11 @@ errr init_player_info_txt(FILE *fp)
}
/* Description */
- if (!rmp_ptr->desc)
- {
- rmp_ptr->desc = my_strdup(s);
- }
- else
+ if (!rmp_ptr->description.empty())
{
- /* Append chars to the name */
- strappend(&rmp_ptr->desc, format("\n%s", s));
+ rmp_ptr->description += '\n';
}
+ rmp_ptr->description += s;
/* Next... */
continue;
@@ -2280,7 +1235,7 @@ errr init_player_info_txt(FILE *fp)
&s[0], &s[1])) return (1);
lev = s[0];
- rmp_ptr->opval[lev] = s[1];
+ rmp_ptr->lflags[lev].pval = s[1];
/* Next... */
continue;
@@ -2298,7 +1253,9 @@ errr init_player_info_txt(FILE *fp)
rmp_ptr->mana = s[7];
rmp_ptr->luck = s[6];
for (z = 0; z < 6; z++)
- rmp_ptr->r_adj[z] = s[z];
+ {
+ rmp_ptr->ps.adj[z] = s[z];
+ }
/* Next... */
continue;
@@ -2307,12 +1264,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'Z' for "powers" */
if ((buf[0] == 'S') && (buf[2] == 'Z'))
{
- int i;
-
/* Acquire the text */
- s = buf + 4;
+ char const *s = buf + 4;
/* Find it in the list */
+ int i;
for (i = 0; i < POWER_MAX; i++)
{
if (iequals(s, powers_type[i].name)) break;
@@ -2320,7 +1276,7 @@ errr init_player_info_txt(FILE *fp)
if (i == POWER_MAX) return (6);
- rmp_ptr->powers[powers++] = i;
+ rmp_ptr->ps.powers.push_back(i);
/* Next... */
continue;
@@ -2329,18 +1285,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if ((buf[0] == 'S') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- rmp_ptr->skill_basem[i] = monster_ego_modify(v);
- rmp_ptr->skill_base[i] = val;
- rmp_ptr->skill_modm[i] = monster_ego_modify(m);
- rmp_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&rmp_ptr->skill_modifiers, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -2349,70 +1297,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'b' for "abilities" */
if ((buf[0] == 'S') && (buf[2] == 'b'))
{
- char *sec;
-
- /* Scan for the values */
- if (NULL == (sec = strchr(buf + 4, ':')))
+ if (read_ability(&rmp_ptr->abilities, buf + 4))
{
return (1);
}
- *sec = '\0';
- sec++;
- if (!*sec) return (1);
-
- if ((i = find_ability(sec)) == -1) return (1);
- rmp_ptr->abilities[cur_ab].ability = i;
- rmp_ptr->abilities[cur_ab].level = atoi(buf + 4);
- cur_ab++;
-
- /* Next... */
- continue;
- }
-
- /* Process 'K' for "sKills" */
- if ((buf[0] == 'S') && (buf[2] == 'K'))
- {
- int s[8];
-
- /* Scan for the values */
- if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d",
- &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1);
-
- rmp_ptr->r_dis = s[0];
- rmp_ptr->r_dev = s[1];
- rmp_ptr->r_sav = s[2];
- rmp_ptr->r_stl = s[3];
- rmp_ptr->r_srh = s[4];
- rmp_ptr->r_fos = s[5];
- rmp_ptr->r_thn = s[6];
- rmp_ptr->r_thb = s[7];
-
- /* Next... */
- continue;
- }
-
- /* Process 'M' for "Mods" */
- if ((buf[0] == 'S') && (buf[2] == 'M'))
- {
- int s[10];
-
- /* Scan for the values */
- if (10 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7], &s[8], &s[9])) return (1);
-
- rmp_ptr->b_age = s[0];
- rmp_ptr->m_age = s[1];
- rmp_ptr->m_b_ht = s[2];
- rmp_ptr->m_m_ht = s[3];
- rmp_ptr->m_b_wt = s[4];
- rmp_ptr->m_m_wt = s[5];
- rmp_ptr->f_b_ht = s[6];
- rmp_ptr->f_m_ht = s[7];
- rmp_ptr->f_b_wt = s[8];
- rmp_ptr->f_m_wt = s[9];
-
- /* Next... */
continue;
}
@@ -2425,8 +1314,8 @@ errr init_player_info_txt(FILE *fp)
if (3 != sscanf(buf + 4, "%d:%d:%d",
&s[0], &s[1], &s[2])) return (1);
- rmp_ptr->r_mhp = s[0];
- rmp_ptr->r_exp = s[1];
+ rmp_ptr->ps.mhp = s[0];
+ rmp_ptr->ps.exp = s[1];
rmp_ptr->infra = s[2];
/* Next... */
@@ -2436,24 +1325,9 @@ errr init_player_info_txt(FILE *fp)
/* Process 'G' for "Player flags" (multiple lines) */
if ((buf[0] == 'S') && (buf[2] == 'G'))
{
- /* Parse every entry */
- for (s = buf + 4; *s; )
+ if (0 != grab_one_player_race_flag(&rmp_ptr->flags, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_player_race_flag(&rmp_ptr->flags1, &rmp_ptr->flags2, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -2463,24 +1337,9 @@ errr init_player_info_txt(FILE *fp)
/* Process 'F' for "level Flags" (multiple lines) */
if ((buf[0] == 'S') && (buf[2] == 'F'))
{
- /* Parse every entry */
- for (s = buf + 4; *s; )
+ if (0 != grab_object_flag(&rmp_ptr->lflags[lev].oflags, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_race_kind_flag(&rmp_ptr->oflags1[lev], &rmp_ptr->oflags2[lev], &rmp_ptr->oflags3[lev], &rmp_ptr->oflags4[lev], &rmp_ptr->oflags5[lev], &rmp_ptr->oesp[lev], s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -2490,27 +1349,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'O' for "Object birth" */
if ((buf[0] == 'S') && (buf[2] == 'O'))
{
- int s[5];
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%d:%d:%d:%dd%d",
- &s[0], &s[1], &s[4], &s[2], &s[3]))
+ if (read_proto_object(&rmp_ptr->object_protos, buf + 4))
{
- s[4] = 0;
-
- if (4 != sscanf(buf + 4, "%d:%d:%dd%d",
- &s[0], &s[1], &s[2], &s[3]))
- {
- return (1);
- }
+ return 1;
}
- rmp_ptr->obj_pval[rmp_ptr->obj_num] = s[4];
- rmp_ptr->obj_tval[rmp_ptr->obj_num] = s[0];
- rmp_ptr->obj_sval[rmp_ptr->obj_num] = s[1];
- rmp_ptr->obj_dd[rmp_ptr->obj_num] = s[2];
- rmp_ptr->obj_ds[rmp_ptr->obj_num++] = s[3];
-
/* Next... */
continue;
}
@@ -2518,24 +1361,9 @@ errr init_player_info_txt(FILE *fp)
/* Process 'A' for "Allowed races" (multiple lines) */
if ((buf[0] == 'S') && (buf[2] == 'A'))
{
- /* Parse every entry */
- for (s = buf + 4; *s; )
+ if (0 != grab_one_race_allow_flag(rmp_ptr->choice, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_race_allow_flag(rmp_ptr->choice, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -2545,32 +1373,23 @@ errr init_player_info_txt(FILE *fp)
/* Process 'C' for "Class choice flags" (multiple lines) */
if ((buf[0] == 'S') && (buf[2] == 'C'))
{
- u32b choice[2] = {0, 0}, z;
-
- /* Parse every entry */
- for (s = buf + 6; *s; )
+ u32b choice[2] = {0, 0};
+ if (0 != grab_one_class_flag(choice, buf + 6))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_class_flag(choice, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
- for (z = 0; z < 2; z++)
+ /* Combine into the class flags */
+ for (int z = 0; z < 2; z++)
{
- if (buf[4] == 'A') rmp_ptr->pclass[z] |= choice[z];
- else rmp_ptr->mclass[z] |= choice[z];
+ if (buf[4] == 'A')
+ {
+ rmp_ptr->pclass[z] |= choice[z];
+ }
+ else
+ {
+ rmp_ptr->mclass[z] |= choice[z];
+ }
}
/* Next... */
@@ -2580,51 +1399,41 @@ errr init_player_info_txt(FILE *fp)
/* Process 'N' for "New/Number/Name" */
if ((buf[0] == 'C') && (buf[2] == 'N'))
{
- int z;
-
- /* Find the colon before the name */
- s = strchr(buf + 4, ':');
+ /* Advance beyond prefix */
+ char *s = strchr(buf + 4, ':');
/* Verify that colon */
if (!s) return (1);
- /* Nuke the colon, advance to the name */
- *s++ = '\0';
+ /* Extract the suffix */
+ std::string suffix(s + 1);
+ if (suffix.empty()) return (1);
- /* Paranoia -- require a name */
- if (!*s) return (1);
+ /* Split suffix into fields */
+ std::vector<std::string> fields;
+ boost::algorithm::split(fields, suffix, boost::is_any_of(":"));
- /* Get the index */
- i = atoi(buf + 4);
+ /* Make sure we have two fields */
+ if (fields.size() < 2) return (1);
- /* Verify information */
+ /* Get the entry index */
+ int i = atoi(buf + 4);
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_c_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- c_ptr = &class_info[i];
+ c_ptr = &expand_to_fit_index(class_info, i);
+ assert(c_ptr->title.empty());
- /* Copy name */
- assert(!c_ptr->title);
- c_ptr->title = my_strdup(s);
+ /* Initialize */
+ c_ptr->display_order_idx = std::stoi(fields[0]);
+ c_ptr->title = fields[1];
/* Initialize */
- c_ptr->powers[0] = c_ptr->powers[1] = c_ptr->powers[2] = c_ptr->powers[3] = -1;
- powers = 0;
lev = 1;
- for (z = 0; z < 10; z++)
- c_ptr->abilities[z].level = -1;
- cur_ab = 0;
- c_ptr->obj_num = 0;
tit_idx = 0;
- spec_idx = -1;
- for (z = 0; z < MAX_SPEC; z++)
- c_ptr->spec[z].title = 0;
/* Next... */
continue;
@@ -2634,20 +1443,18 @@ errr init_player_info_txt(FILE *fp)
if ((buf[0] == 'C') && (buf[2] == 'D'))
{
/* Acquire the text */
- s = buf + 6;
+ char const *s = buf + 6;
switch (buf[4])
{
case '0': /* Class description */
- if (!c_ptr->desc)
+ // Need newline?
+ if (!c_ptr->desc.empty())
{
-
- c_ptr->desc = my_strdup(s);
- }
- else
- {
- strappend(&c_ptr->desc, format("\n%s", s));
+ c_ptr->desc += '\n';
}
+ // Append
+ c_ptr->desc += s;
break;
case '1': /* Class title */
@@ -2672,27 +1479,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'O' for "Object birth" */
if ((buf[0] == 'C') && (buf[2] == 'O'))
{
- int s[5];
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%d:%d:%d:%dd%d",
- &s[0], &s[1], &s[4], &s[2], &s[3]))
+ if (read_proto_object(&c_ptr->object_protos, buf + 4))
{
- s[4] = 0;
-
- if (4 != sscanf(buf + 4, "%d:%d:%dd%d",
- &s[0], &s[1], &s[2], &s[3]))
- {
- return (1);
- }
+ return 1;
}
- c_ptr->obj_pval[c_ptr->obj_num] = s[4];
- c_ptr->obj_tval[c_ptr->obj_num] = s[0];
- c_ptr->obj_sval[c_ptr->obj_num] = s[1];
- c_ptr->obj_dd[c_ptr->obj_num] = s[2];
- c_ptr->obj_ds[c_ptr->obj_num++] = s[3];
-
/* Next... */
continue;
}
@@ -2723,7 +1514,7 @@ errr init_player_info_txt(FILE *fp)
&s[0], &s[1])) return (1);
lev = s[0];
- c_ptr->opval[lev] = s[1];
+ c_ptr->lflags[lev].pval = s[1];
/* Next... */
continue;
@@ -2741,7 +1532,9 @@ errr init_player_info_txt(FILE *fp)
c_ptr->mana = s[6];
c_ptr->extra_blows = s[7];
for (z = 0; z < 6; z++)
- c_ptr->c_adj[z] = s[z];
+ {
+ c_ptr->ps.adj[z] = s[z];
+ }
/* Next... */
continue;
@@ -2750,18 +1543,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if ((buf[0] == 'C') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- c_ptr->skill_basem[i] = monster_ego_modify(v);
- c_ptr->skill_base[i] = val;
- c_ptr->skill_modm[i] = monster_ego_modify(m);
- c_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&c_ptr->skill_modifiers, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -2770,22 +1555,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'b' for "abilities" */
if ((buf[0] == 'C') && (buf[2] == 'b'))
{
- char *sec;
-
- /* Scan for the values */
- if (NULL == (sec = strchr(buf + 4, ':')))
+ if (read_ability(&c_ptr->abilities, buf + 4))
{
- return (1);
+ return 1;
}
- *sec = '\0';
- sec++;
- if (!*sec) return (1);
-
- if ((i = find_ability(sec)) == -1) return (1);
-
- c_ptr->abilities[cur_ab].ability = i;
- c_ptr->abilities[cur_ab].level = atoi(buf + 4);
- cur_ab++;
/* Next... */
continue;
@@ -2811,12 +1584,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'Z' for "powers" */
if ((buf[0] == 'C') && (buf[2] == 'Z'))
{
- int i;
-
/* Acquire the text */
- s = buf + 4;
+ char const *s = buf + 4;
/* Find it in the list */
+ int i;
for (i = 0; i < POWER_MAX; i++)
{
if (iequals(s, powers_type[i].name)) break;
@@ -2824,51 +1596,7 @@ errr init_player_info_txt(FILE *fp)
if (i == POWER_MAX) return (6);
- c_ptr->powers[powers++] = i;
-
- /* Next... */
- continue;
- }
-
- /* Process 'K' for "sKills" */
- if ((buf[0] == 'C') && (buf[2] == 'K'))
- {
- int s[8];
-
- /* Scan for the values */
- if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d",
- &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1);
-
- c_ptr->c_dis = s[0];
- c_ptr->c_dev = s[1];
- c_ptr->c_sav = s[2];
- c_ptr->c_stl = s[3];
- c_ptr->c_srh = s[4];
- c_ptr->c_fos = s[5];
- c_ptr->c_thn = s[6];
- c_ptr->c_thb = s[7];
-
- /* Next... */
- continue;
- }
-
- /* Process 'x' for "Xtra skills" */
- if ((buf[0] == 'C') && (buf[2] == 'X'))
- {
- int s[8];
-
- /* Scan for the values */
- if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d",
- &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1);
-
- c_ptr->x_dis = s[0];
- c_ptr->x_dev = s[1];
- c_ptr->x_sav = s[2];
- c_ptr->x_stl = s[3];
- c_ptr->x_srh = s[4];
- c_ptr->x_fos = s[5];
- c_ptr->x_thn = s[6];
- c_ptr->x_thb = s[7];
+ c_ptr->ps.powers.push_back(i);
/* Next... */
continue;
@@ -2883,28 +1611,8 @@ errr init_player_info_txt(FILE *fp)
if (2 != sscanf(buf + 4, "%d:%d",
&s[0], &s[1])) return (1);
- c_ptr->c_mhp = s[0];
- c_ptr->c_exp = s[1];
-
- /* Next... */
- continue;
- }
-
- /* Process 'C' for "sensing" */
- if ((buf[0] == 'C') && (buf[2] == 'C'))
- {
- long int s[3];
- char h, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c:%c:%ld:%ld:%ld",
- &h, &m, &s[0], &s[1], &s[2])) return (1);
-
- c_ptr->sense_heavy = (h == 'H') ? TRUE : FALSE;
- c_ptr->sense_heavy_magic = (m == 'H') ? TRUE : FALSE;
- c_ptr->sense_base = s[0];
- c_ptr->sense_pl = s[1];
- c_ptr->sense_plus = s[2];
+ c_ptr->ps.mhp = s[0];
+ c_ptr->ps.exp = s[1];
/* Next... */
continue;
@@ -2930,24 +1638,9 @@ errr init_player_info_txt(FILE *fp)
/* Process 'G' for "Player flags" (multiple lines) */
if ((buf[0] == 'C') && (buf[2] == 'G'))
{
- /* Parse every entry */
- for (s = buf + 4; *s; )
+ if (0 != grab_one_player_race_flag(&c_ptr->flags, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_player_race_flag(&c_ptr->flags1, &c_ptr->flags2, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -2958,8 +1651,10 @@ errr init_player_info_txt(FILE *fp)
if ((buf[0] == 'C') && (buf[2] == 'F'))
{
/* Parse every entry */
- for (s = buf + 4; *s; )
+ for (char *s = buf + 4; *s; )
{
+ char *t;
+
/* Find the end of this entry */
for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
@@ -2971,7 +1666,10 @@ errr init_player_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_race_kind_flag(&c_ptr->oflags1[lev], &c_ptr->oflags2[lev], &c_ptr->oflags3[lev], &c_ptr->oflags4[lev], &c_ptr->oflags5[lev], &c_ptr->oesp[lev], s)) return (5);
+ if (0 != grab_object_flag(&c_ptr->lflags[lev].oflags, s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -2988,29 +1686,18 @@ errr init_player_info_txt(FILE *fp)
if (buf[4] == 'N')
{
/* Find the colon before the name */
- s = buf + 6;
+ char const *s = buf + 6;
/* Paranoia -- require a name */
if (!*s) return (1);
- /* Get the index */
- spec_idx++;
- /* Verify information */
- if (spec_idx >= MAX_SPEC) return (2);
+ /* Create the spec entry */
+ c_ptr->spec.emplace_back(player_spec());
- /* Point at the "info" */
- s_ptr = &c_ptr->spec[spec_idx];
-
- /* Copy title */
- assert(!s_ptr->title);
+ /* Fill in initial values */
+ s_ptr = &c_ptr->spec.back();
s_ptr->title = my_strdup(s);
- /* Initialize */
- s_ptr->obj_num = 0;
- cur_ab = 0;
- for (z = 0; z < 10; z++)
- s_ptr->abilities[z].level = -1;
-
/* Next... */
continue;
}
@@ -3019,7 +1706,7 @@ errr init_player_info_txt(FILE *fp)
if (buf[4] == 'D')
{
/* Acquire the text */
- s = buf + 6;
+ char const *s = buf + 6;
if (!s_ptr->desc)
{
@@ -3037,27 +1724,11 @@ errr init_player_info_txt(FILE *fp)
/* Process 'O' for "Object birth" */
if (buf[4] == 'O')
{
- int s[5];
-
- /* Scan for the values */
- if (5 != sscanf(buf + 6, "%d:%d:%d:%dd%d",
- &s[0], &s[1], &s[4], &s[2], &s[3]))
+ if (read_proto_object(&s_ptr->object_protos, buf + 6))
{
- s[4] = 0;
-
- if (4 != sscanf(buf + 6, "%d:%d:%dd%d",
- &s[0], &s[1], &s[2], &s[3]))
- {
- return (1);
- }
+ return 1;
}
- s_ptr->obj_pval[s_ptr->obj_num] = s[4];
- s_ptr->obj_tval[s_ptr->obj_num] = s[0];
- s_ptr->obj_sval[s_ptr->obj_num] = s[1];
- s_ptr->obj_dd[s_ptr->obj_num] = s[2];
- s_ptr->obj_ds[s_ptr->obj_num++] = s[3];
-
/* Next... */
continue;
}
@@ -3082,18 +1753,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if (buf[4] == 'k')
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 6, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- s_ptr->skill_basem[i] = monster_ego_modify(v);
- s_ptr->skill_base[i] = val;
- s_ptr->skill_modm[i] = monster_ego_modify(m);
- s_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&s_ptr->skill_modifiers, buf + 6))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -3102,22 +1765,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'b' for "abilities" */
if (buf[4] == 'b')
{
- char *sec;
-
- /* Scan for the values */
- if (NULL == (sec = strchr(buf + 6, ':')))
+ if (read_ability(&s_ptr->abilities, buf + 6))
{
- return (1);
+ return 1;
}
- *sec = '\0';
- sec++;
- if (!*sec) return (1);
-
- if ((i = find_ability(sec)) == -1) return (1);
-
- s_ptr->abilities[cur_ab].ability = i;
- s_ptr->abilities[cur_ab].level = atoi(buf + 6);
- cur_ab++;
/* Next... */
continue;
@@ -3127,8 +1778,10 @@ errr init_player_info_txt(FILE *fp)
if (buf[4] == 'G')
{
/* Parse every entry */
- for (s = buf + 6; *s; )
+ for (char *s = buf + 6; *s; )
{
+ char *t;
+
/* Find the end of this entry */
for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
@@ -3140,7 +1793,10 @@ errr init_player_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_player_race_flag(&s_ptr->flags1, &s_ptr->flags2, s)) return (5);
+ if (0 != grab_one_player_race_flag(&s_ptr->flags, s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -3149,90 +1805,6 @@ errr init_player_info_txt(FILE *fp)
/* Next... */
continue;
}
-
-
- /* Process 'K' for "desired skills" */
- if (buf[4] == 'K')
- {
- long val;
- char name[200];
-
- /* Scan for the values */
- if (2 != sscanf(buf + 6, "%ld:%s",
- &val, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- s_ptr->skill_ideal[i] = val;
-
- /* Next... */
- continue;
- }
- }
-
- /* Process 'N' for "New/Number/Name" */
- if ((buf[0] == 'M') && (buf[2] == 'N'))
- {
- /* Find the colon before the name */
- s = strchr(buf + 4, ':');
-
- /* Verify that colon */
- if (!s) return (1);
-
- /* Nuke the colon, advance to the name */
- *s++ = '\0';
-
- /* Paranoia -- require a name */
- if (!*s) return (1);
-
- /* Get the index */
- i = atoi(buf + 4);
-
- /* Verify information */
- if (i < error_idx) return (4);
-
- /* Verify information */
- if (i >= max_mc_idx) return (2);
-
- /* Save the index */
- error_idx = i;
-
- /* Point at the "info" */
- mc_ptr = &meta_class_info[i];
-
- /* Append chars to the name */
- strcpy(mc_ptr->name, s + 2);
- mc_ptr->color = color_char_to_attr(s[0]);
- for (powers = 0; powers < max_c_idx; powers++)
- mc_ptr->classes[powers] = -1;
- powers = 0;
-
- /* Next... */
- continue;
- }
-
- /* Process 'C' for "Classes" */
- if ((buf[0] == 'M') && (buf[2] == 'C'))
- {
- int i;
-
- /* Acquire the text */
- s = buf + 4;
-
- /* Find it in the list */
- for (i = 0; i < max_c_idx; i++)
- {
- if (class_info[i].title && iequals(s, class_info[i].title))
- {
- break;
- }
- }
-
- if (i == max_c_idx) return (6);
-
- mc_ptr->classes[powers++] = i;
-
- /* Next... */
- continue;
}
/* Oops */
@@ -3249,12 +1821,12 @@ errr init_player_info_txt(FILE *fp)
*/
errr init_v_info_txt(FILE *fp)
{
- int i;
char buf[1024];
- char *s;
+
+ auto &v_info = game->edit_data.v_info;
/* Current entry */
- vault_type *v_ptr = NULL;
+ vault_type *v_ptr = nullptr;
/* Just before the first record */
error_idx = -1;
@@ -3279,7 +1851,7 @@ errr init_v_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -3291,23 +1863,16 @@ errr init_v_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i <= error_idx) return (4);
- /* Verify information */
- if (i >= max_v_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- v_ptr = &v_info[i];
-
- /* Initialize data -- we ignore the name, it's not
- * used for anything */
- v_ptr->data = my_strdup("");
+ v_ptr = &expand_to_fit_index(v_info, i);
/* Next... */
continue;
@@ -3320,10 +1885,10 @@ errr init_v_info_txt(FILE *fp)
if (buf[0] == 'D')
{
/* Acquire the text */
- s = buf + 2;
+ cptr s = buf + 2;
/* Append data */
- strappend(&v_ptr->data, s);
+ v_ptr->data += s;
/* Next... */
continue;
@@ -3398,22 +1963,19 @@ errr init_v_info_txt(FILE *fp)
/*
* Grab one flag in an feature_type from a textual string
*/
-static errr grab_one_feature_flag(feature_type *f_ptr, cptr what)
+static int grab_one_feature_flag(cptr what, feature_flag_set *flags)
{
- int i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, f_info_flags1[i]))
- {
- f_ptr->flags1 |= (1L << i);
- return (0);
- }
- }
+#define FF(tier, index, name) \
+ if (streq(what, #name)) \
+ { \
+ *flags |= BOOST_PP_CAT(FF_,name); \
+ return 0; \
+ };
+#include "feature_flag_list.hpp"
+#undef FF
/* Oops */
- msg_format("Unknown object flag '%s'.", what);
+ msg_format("Unknown feature flag '%s'.", what);
/* Error */
return (1);
@@ -3425,9 +1987,9 @@ static errr grab_one_feature_flag(feature_type *f_ptr, cptr what)
*/
errr init_f_info_txt(FILE *fp)
{
- int i;
+ auto &f_info = game->edit_data.f_info;
+
char buf[1024];
- char *s, *t;
/* Current entry */
feature_type *f_ptr = NULL;
@@ -3454,7 +2016,7 @@ errr init_f_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -3466,19 +2028,16 @@ errr init_f_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i <= error_idx) return (4);
- /* Verify information */
- if (i >= max_f_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- f_ptr = &f_info[i];
+ f_ptr = &expand_to_fit_index(f_info, i);
/* Copy name */
assert(!f_ptr->name);
@@ -3502,7 +2061,7 @@ errr init_f_info_txt(FILE *fp)
if (buf[0] == 'D')
{
/* Acquire the text */
- s = buf + 4;
+ const char *s = buf + 4;
switch (buf[2])
{
@@ -3595,6 +2154,7 @@ errr init_f_info_txt(FILE *fp)
{
int side, dice, freq, type;
cptr tmp;
+ int i;
/* Find the next empty blow slot (if any) */
for (i = 0; i < 4; i++) if ((!f_ptr->d_side[i]) &&
@@ -3648,32 +2208,15 @@ errr init_f_info_txt(FILE *fp)
/* Hack -- Process 'F' for flags */
if (buf[0] == 'F')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (0 != grab_one_feature_flag(buf + 2, &f_ptr->flags))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_feature_flag(f_ptr, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
continue;
}
-
-
/* Oops */
return (6);
}
@@ -3684,115 +2227,12 @@ errr init_f_info_txt(FILE *fp)
/*
- * Grab one flag in an object_kind from a textual string
- */
-static errr grab_one_kind_flag(object_kind *k_ptr, cptr what, bool_ obvious)
-{
- int i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags1[i]))
- {
- if (obvious)
- k_ptr->oflags1 |= (1L << i);
- else
- k_ptr->flags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2[i]))
- {
- if (obvious)
- k_ptr->oflags2 |= (1L << i);
- else
- k_ptr->flags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 -- traps*/
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2_trap[i]))
- {
- if (obvious)
- k_ptr->oflags2 |= (1L << i);
- else
- k_ptr->flags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags3[i]))
- {
- if (obvious)
- k_ptr->oflags3 |= (1L << i);
- else
- k_ptr->flags3 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags4 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags4[i]))
- {
- if (obvious)
- k_ptr->oflags4 |= (1L << i);
- else
- k_ptr->flags4 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags5 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags5[i]))
- {
- if (obvious)
- k_ptr->oflags5 |= (1L << i);
- else
- k_ptr->flags5 |= (1L << i);
- return (0);
- }
- }
-
- /* Check esp_flags */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, esp_flags[i]))
- {
- if (obvious)
- k_ptr->oesp |= (1L << i);
- else
- k_ptr->esp |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown object flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-/*
* Initialize the "k_info" array, by parsing an ascii "template" file
*/
errr init_k_info_txt(FILE *fp)
{
+ auto &k_info = game->edit_data.k_info;
+
int i;
char buf[1024];
char *s, *t;
@@ -3842,14 +2282,11 @@ errr init_k_info_txt(FILE *fp)
/* Verify information */
if (i <= error_idx) return (4);
- /* Verify information */
- if (i >= max_k_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- k_ptr = &k_info[i];
+ k_ptr = &expand_to_fit_index(k_info, i);
/* Advance and Save the name index */
assert(!k_ptr->name);
@@ -3859,7 +2296,6 @@ errr init_k_info_txt(FILE *fp)
k_ptr->text = my_strdup("");
/* Needed hack */
- k_ptr->esp = 0;
k_ptr->power = -1;
/* Next... */
@@ -3875,8 +2311,14 @@ errr init_k_info_txt(FILE *fp)
/* Acquire the text */
s = buf + 2;
- /* Append description */
- strappend(&k_ptr->text, s);
+ if (!k_ptr->text)
+ {
+ k_ptr->text = my_strdup(s);
+ }
+ else
+ {
+ strappend(&k_ptr->text, format("\n%s", s));
+ }
/* Next... */
continue;
@@ -4079,24 +2521,9 @@ errr init_k_info_txt(FILE *fp)
/* Hack -- Process 'F' for flags */
if (buf[0] == 'F')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (0 != grab_object_flag(&k_ptr->flags, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_kind_flag(k_ptr, s, FALSE)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -4106,24 +2533,9 @@ errr init_k_info_txt(FILE *fp)
/* Hack -- Process 'f' for obvious flags */
if (buf[0] == 'f')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (0 != grab_object_flag(&k_ptr->oflags, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_kind_flag(k_ptr, s, TRUE)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -4139,112 +2551,6 @@ errr init_k_info_txt(FILE *fp)
return (0);
}
-/*
- * Grab one flag in an artifact_type from a textual string
- */
-static errr grab_one_artifact_flag(artifact_type *a_ptr, cptr what, bool_ obvious)
-{
- int i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags1[i]))
- {
- if (obvious)
- a_ptr->oflags1 |= (1L << i);
- else
- a_ptr->flags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2[i]))
- {
- if (obvious)
- a_ptr->oflags2 |= (1L << i);
- else
- a_ptr->flags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 -- traps*/
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2_trap[i]))
- {
- if (obvious)
- a_ptr->oflags2 |= (1L << i);
- else
- a_ptr->flags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags3[i]))
- {
- if (obvious)
- a_ptr->oflags3 |= (1L << i);
- else
- a_ptr->flags3 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags4 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags4[i]))
- {
- if (obvious)
- a_ptr->oflags4 |= (1L << i);
- else
- a_ptr->flags4 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags5 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags5[i]))
- {
- if (obvious)
- a_ptr->oflags5 |= (1L << i);
- else
- a_ptr->flags5 |= (1L << i);
- return (0);
- }
- }
-
- /* Check esp_flags */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, esp_flags[i]))
- {
- if (obvious)
- a_ptr->oesp |= (1L << i);
- else
- a_ptr->esp |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown artifact flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-
/*
@@ -4252,9 +2558,11 @@ static errr grab_one_artifact_flag(artifact_type *a_ptr, cptr what, bool_ obviou
*/
errr init_a_info_txt(FILE *fp)
{
+ auto &a_info = game->edit_data.a_info;
+
int i;
char buf[1024];
- char *s, *t;
+ char *s;
/* Current entry */
artifact_type *a_ptr = NULL;
@@ -4300,14 +2608,11 @@ errr init_a_info_txt(FILE *fp)
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_a_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- a_ptr = &a_info[i];
+ a_ptr = &expand_to_fit_index(a_info, i);
/* Copy name */
assert(!a_ptr->name);
@@ -4317,17 +2622,16 @@ errr init_a_info_txt(FILE *fp)
a_ptr->text = my_strdup("");
/* Ignore everything */
- a_ptr->flags3 |= (TR3_IGNORE_ACID);
- a_ptr->flags3 |= (TR3_IGNORE_ELEC);
- a_ptr->flags3 |= (TR3_IGNORE_FIRE);
- a_ptr->flags3 |= (TR3_IGNORE_COLD);
+ a_ptr->flags |= TR_IGNORE_ACID |
+ TR_IGNORE_ELEC |
+ TR_IGNORE_FIRE |
+ TR_IGNORE_COLD;
/* Needed hack */
- a_ptr->esp = 0;
a_ptr->power = -1;
/*Require activating artifacts to have a activation type */
- if (a_ptr && a_ptr->flags3 & TR3_ACTIVATE && !a_ptr->activate)
+ if (a_ptr && (a_ptr->flags & TR_ACTIVATE) && !a_ptr->activate)
{
msg_print("Activate flag without activate type");
return 1;
@@ -4447,24 +2751,9 @@ errr init_a_info_txt(FILE *fp)
/* Hack -- Process 'F' for flags */
if (buf[0] == 'F')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (grab_object_flag(&a_ptr->flags, buf+2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_artifact_flag(a_ptr, s, FALSE)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -4474,24 +2763,9 @@ errr init_a_info_txt(FILE *fp)
/* Hack -- Process 'f' for obvious flags */
if (buf[0] == 'f')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (grab_object_flag(&a_ptr->oflags, buf+2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_artifact_flag(a_ptr, s, TRUE)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -4525,12 +2799,11 @@ errr init_a_info_txt(FILE *fp)
*/
errr init_set_info_txt(FILE *fp)
{
- int i;
+ auto &set_info = game->edit_data.set_info;
+
int cur_art = 0, cur_num = 0;
char buf[1024];
- char *s, *t;
-
/* Current entry */
set_type *set_ptr = NULL;
@@ -4557,10 +2830,8 @@ errr init_set_info_txt(FILE *fp)
/* Process 'N' for "New/Number/Name" */
if (buf[0] == 'N')
{
- int z, y;
-
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -4572,42 +2843,20 @@ errr init_set_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_set_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- set_ptr = &set_info[i];
+ set_ptr = &expand_to_fit_index(set_info, i);
+ assert(set_ptr->name.empty());
/* Copy name */
- assert(!set_ptr->name);
- set_ptr->name = my_strdup(s);
-
- /* Initialize */
- set_ptr->num = 0;
- set_ptr->num_use = 0;
- for (z = 0; z < 6; z++)
- {
- set_ptr->arts[z].a_idx = 0;
- set_ptr->arts[z].present = FALSE;
- for (y = 0; y < 6; y++)
- {
- set_ptr->arts[z].flags1[y] = 0;
- set_ptr->arts[z].flags2[y] = 0;
- set_ptr->arts[z].flags3[y] = 0;
- set_ptr->arts[z].flags4[y] = 0;
- set_ptr->arts[z].flags5[y] = 0;
- set_ptr->arts[z].esp[y] = 0;
- set_ptr->arts[z].pval[y] = 0;
- }
- }
+ set_ptr->name = s;
/* Next... */
continue;
@@ -4619,11 +2868,14 @@ errr init_set_info_txt(FILE *fp)
/* Process 'D' for "Description" */
if (buf[0] == 'D')
{
- /* Acquire the text */
- s = buf + 2;
+ /* Need newline? */
+ if (!set_ptr->desc.empty())
+ {
+ set_ptr->desc += '\n';
+ }
- /* Append chars to the description */
- strappend(&set_ptr->desc, s);
+ /* Append */
+ set_ptr->desc += (buf + 2);
/* Next... */
continue;
@@ -4662,30 +2914,9 @@ errr init_set_info_txt(FILE *fp)
/* Process 'F' for flags */
if (buf[0] == 'F')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (grab_object_flag(&set_ptr->arts[cur_art].flags[cur_num], buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_race_kind_flag(&set_ptr->arts[cur_art].flags1[cur_num],
- &set_ptr->arts[cur_art].flags2[cur_num],
- &set_ptr->arts[cur_art].flags3[cur_num],
- &set_ptr->arts[cur_art].flags4[cur_num],
- &set_ptr->arts[cur_art].flags5[cur_num],
- &set_ptr->arts[cur_art].esp[cur_num],
- s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -4707,12 +2938,14 @@ errr init_set_info_txt(FILE *fp)
*/
errr init_s_info_txt(FILE *fp)
{
- int i, z, order = 1;
+ auto &s_descriptors = game->edit_data.s_descriptors;
+ auto &s_info = game->s_info;
+
+ int order = 1;
char buf[1024];
- char *s;
/* Current entry */
- skill_type *s_ptr = NULL;
+ skill_descriptor *s_ptr = NULL;
/* Just before the first record */
@@ -4753,8 +2986,8 @@ errr init_s_info_txt(FILE *fp)
s2 = find_skill(sec);
if (s2 == -1) return (1);
- s_info[s2].father = s1;
- s_info[s2].order = order++;
+ s_descriptors[s2].father = s1;
+ s_descriptors[s2].order = order++;
/* Next... */
continue;
@@ -4779,46 +3012,17 @@ errr init_s_info_txt(FILE *fp)
s2 = find_skill(sec);
if ((s1 == -1) || (s2 == -1)) return (1);
- s_info[s1].action[s2] = SKILL_EXCLUSIVE;
- s_info[s2].action[s1] = SKILL_EXCLUSIVE;
+ // The "exclusive" relation is symmetric, so
+ // add summetrically so we don't have to specify
+ // twice in data files.
+ s_descriptors[s1].excludes.push_back(s2);
+ s_descriptors[s2].excludes.push_back(s1);
/* Next... */
continue;
}
- /* Process 'O' for "Opposite" */
- if (buf[0] == 'O')
- {
- char *sec, *cval;
- s16b s1, s2;
-
- /* Scan for the values */
- if (NULL == (sec = strchr(buf + 2, ':')))
- {
- return (1);
- }
- *sec = '\0';
- sec++;
- if (!*sec) return (1);
- if (NULL == (cval = strchr(sec, '%')))
- {
- return (1);
- }
- *cval = '\0';
- cval++;
- if (!*cval) return (1);
-
- s1 = find_skill(buf + 2);
- s2 = find_skill(sec);
- if ((s1 == -1) || (s2 == -1)) return (1);
-
- s_info[s1].action[s2] = -atoi(cval);
-
- /* Next... */
- continue;
- }
-
/* Process 'A' for "Amical/friendly" */
if (buf[0] == 'f')
{
@@ -4845,7 +3049,8 @@ errr init_s_info_txt(FILE *fp)
s2 = find_skill(sec);
if ((s1 == -1) || (s2 == -1)) return (1);
- s_info[s1].action[s2] = atoi(cval);
+ s_descriptors[s1].increases.emplace_back(
+ std::make_tuple(s2, atoi(cval)));
/* Next... */
continue;
@@ -4855,7 +3060,7 @@ errr init_s_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -4867,30 +3072,21 @@ errr init_s_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
-
- /* Verify information */
- if (i >= max_s_idx) return (2);
+ int i = atoi(buf + 2);
/* Save the index */
error_idx = i;
/* Point at the "info" */
- s_ptr = &s_info[i];
+ s_ptr = &expand_to_fit_index(s_descriptors, i);
+ assert(s_ptr->name.empty());
+
+ /* Make sure s_info also expands appropriately */
+ expand_to_fit_index(s_info, i);
/* Copy name */
- assert(!s_ptr->name);
s_ptr->name = my_strdup(s);
- /* Init */
- s_ptr->action_mkey = 0;
- s_ptr->dev = FALSE;
- s_ptr->random_gain_chance = 100;
- for (z = 0; z < max_s_idx; z++)
- {
- s_ptr->action[z] = 0;
- }
-
/* Next... */
continue;
}
@@ -4901,19 +3097,15 @@ errr init_s_info_txt(FILE *fp)
/* Process 'D' for "Description" */
if (buf[0] == 'D')
{
- /* Acquire the text */
- s = buf + 2;
-
- /* Description */
- if (!s_ptr->desc)
+ /* Need newline? */
+ if (!s_ptr->desc.empty())
{
- s_ptr->desc = my_strdup(s);
- }
- else
- {
- strappend(&s_ptr->desc, format("\n%s", s));
+ s_ptr->desc += '\n';
}
+ /* Append */
+ s_ptr->desc += (buf + 2);
+
/* Next... */
continue;
}
@@ -4924,15 +3116,15 @@ errr init_s_info_txt(FILE *fp)
char *txt;
/* Acquire the text */
- s = buf + 2;
+ char *s = buf + 2;
if (NULL == (txt = strchr(s, ':'))) return (1);
*txt = '\0';
txt++;
/* Copy action description */
- assert(!s_ptr->action_desc);
- s_ptr->action_desc = my_strdup(txt);
+ assert(s_ptr->action_desc.empty());
+ s_ptr->action_desc = txt;
/* Copy mkey index */
s_ptr->action_mkey = atoi(s);
@@ -4941,24 +3133,6 @@ errr init_s_info_txt(FILE *fp)
continue;
}
- /* Process 'I' for "Info" (one line only) */
- if (buf[0] == 'I')
- {
- int rate;
-
- /* Scan for the values */
- if (1 != sscanf(buf + 2, "%d", &rate))
- {
- return (1);
- }
-
- /* Save the values */
- s_ptr->rate = rate;
-
- /* Next... */
- continue;
- }
-
/* Process 'G' for "random Gain" (one line only) */
if (buf[0] == 'G')
{
@@ -4980,26 +3154,9 @@ errr init_s_info_txt(FILE *fp)
/* Process 'F' for flags */
if (buf[0] == 'F')
{
- char *t;
-
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (0 != grab_one_skill_flag(&s_ptr->flags, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_skill_flag(&(s_ptr->flags1), s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -5019,9 +3176,9 @@ errr init_s_info_txt(FILE *fp)
*/
errr init_ab_info_txt(FILE *fp)
{
- int i, z;
+ auto &ab_info = game->edit_data.ab_info;
+
char buf[1024];
- char *s;
/* Current entry */
ability_type *ab_ptr = NULL;
@@ -5050,7 +3207,7 @@ errr init_ab_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -5062,34 +3219,17 @@ errr init_ab_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
-
- /* Verify information */
- if (i >= max_ab_idx) return (2);
+ int i = atoi(buf + 2);
/* Save the index */
error_idx = i;
/* Point at the "info" */
- ab_ptr = &ab_info[i];
+ ab_ptr = &expand_to_fit_index(ab_info, i);
+ assert(ab_ptr->name.empty());
/* Copy name */
- assert(!ab_ptr->name);
- ab_ptr->name = my_strdup(s);
-
- /* Init */
- ab_ptr->action_mkey = 0;
- ab_ptr->acquired = FALSE;
- for (z = 0; z < 10; z++)
- {
- ab_ptr->skills[z] = -1;
- ab_ptr->need_abilities[z] = -1;
- ab_ptr->forbid_abilities[z] = -1;
- }
- for (z = 0; z < 6; z++)
- {
- ab_ptr->stat[z] = -1;
- }
+ ab_ptr->name = s;
/* Next... */
continue;
@@ -5101,19 +3241,15 @@ errr init_ab_info_txt(FILE *fp)
/* Process 'D' for "Description" */
if (buf[0] == 'D')
{
- /* Acquire the text */
- s = buf + 2;
-
- /* Append description */
- if (!ab_ptr->desc)
- {
- ab_ptr->desc = my_strdup(s);
- }
- else
+ /* Need newline? */
+ if (!ab_ptr->desc.empty())
{
- strappend(&ab_ptr->desc, format("\n%s", s));
+ ab_ptr->desc += '\n';
}
+ /* Append */
+ ab_ptr->desc += (buf + 2);
+
/* Next... */
continue;
}
@@ -5124,15 +3260,15 @@ errr init_ab_info_txt(FILE *fp)
char *txt;
/* Acquire the text */
- s = buf + 2;
+ char *s = buf + 2;
if (NULL == (txt = strchr(s, ':'))) return (1);
*txt = '\0';
txt++;
/* Copy name */
- assert(!ab_ptr->action_desc);
- ab_ptr->action_desc = my_strdup(txt);
+ assert(ab_ptr->action_desc.empty());
+ ab_ptr->action_desc = txt;
/* Set mkey */
ab_ptr->action_mkey = atoi(s);
@@ -5163,7 +3299,6 @@ errr init_ab_info_txt(FILE *fp)
if (buf[0] == 'k')
{
char *sec;
- s16b level, skill;
/* Scan for the values */
if (NULL == (sec = strchr(buf + 2, ':')))
@@ -5174,19 +3309,15 @@ errr init_ab_info_txt(FILE *fp)
sec++;
if (!*sec) return (1);
- level = atoi(buf + 2);
- skill = find_skill(sec);
-
+ s16b level = atoi(buf + 2);
+ s16b skill = find_skill(sec);
if (skill == -1) return (1);
- for (z = 0; z < 10; z++)
- if (ab_ptr->skills[z] == -1) break;
+ ability_type::skill_requirement req;
+ req.skill_idx = skill;
+ req.level = level;
- if (z < 10)
- {
- ab_ptr->skills[z] = skill;
- ab_ptr->skill_levels[z] = level;
- }
+ ab_ptr->need_skills.emplace_back(req);
/* Next... */
continue;
@@ -5195,20 +3326,14 @@ errr init_ab_info_txt(FILE *fp)
/* Process 'a' for "needed ability" */
if (buf[0] == 'a')
{
- s16b ab;
-
- ab = find_ability(buf + 2);
-
- if (ab == -1) return (1);
-
- for (z = 0; z < 10; z++)
- if (ab_ptr->need_abilities[z] == -1) break;
-
- if (z < 10)
+ s16b ab = find_ability(buf + 2);
+ if (ab == -1)
{
- ab_ptr->need_abilities[z] = ab;
+ return (1);
}
+ ab_ptr->need_abilities.push_back(ab);
+
/* Next... */
continue;
}
@@ -5242,44 +3367,6 @@ errr init_ab_info_txt(FILE *fp)
continue;
}
- /* Process 'E' for "Excluding ability" */
- if (buf[0] == 'E')
- {
- char *sec;
- s16b ab1, ab2;
-
- /* Scan for the values */
- if (NULL == (sec = strchr(buf + 2, ':')))
- {
- return (1);
- }
- *sec = '\0';
- sec++;
- if (!*sec) return (1);
-
- ab1 = find_ability(buf + 2);
- ab2 = find_ability(sec);
-
- if ((ab1 == -1) || (ab2 == -1)) return (1);
-
- for (z = 0; z < 10; z++)
- if (ab_info[ab1].forbid_abilities[z] == -1) break;
- if (z < 10)
- {
- ab_info[ab1].forbid_abilities[z] = ab2;
- }
-
- for (z = 0; z < 10; z++)
- if (ab_info[ab2].forbid_abilities[z] == -1) break;
- if (z < 10)
- {
- ab_info[ab2].forbid_abilities[z] = ab1;
- }
-
- /* Next... */
- continue;
- }
-
/* Oops */
return (6);
}
@@ -5290,218 +3377,47 @@ errr init_ab_info_txt(FILE *fp)
/*
- * Grab one flag in a ego-item_type from a textual string
+ * Look up ego flag
*/
-static bool_ grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool_ obvious)
+static ego_flag_set lookup_ego_flag(const char *what)
{
- int i;
- assert(n < FLAG_RARITY_MAX);
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags1[i]))
- {
- if (obvious)
- e_ptr->oflags1[n] |= (1L << i);
- else
- e_ptr->flags1[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2[i]))
- {
- if (obvious)
- e_ptr->oflags2[n] |= (1L << i);
- else
- e_ptr->flags2[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 -- traps */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2_trap[i]))
- {
- if (obvious)
- e_ptr->oflags2[n] |= (1L << i);
- else
- e_ptr->flags2[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags3[i]))
- {
- if (obvious)
- e_ptr->oflags3[n] |= (1L << i);
- else
- e_ptr->flags3[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags4 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags4[i]))
- {
- if (obvious)
- e_ptr->oflags4[n] |= (1L << i);
- else
- e_ptr->flags4[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags5 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags5[i]))
- {
- if (obvious)
- e_ptr->oflags5[n] |= (1L << i);
- else
- e_ptr->flags5[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Check esp_flags */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, esp_flags[i]))
- {
- if (obvious)
- e_ptr->oesp[n] |= (1L << i);
- else
- e_ptr->esp[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Check ego_flags */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, ego_flags[i]))
- {
- e_ptr->fego[n] |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown ego-item flag '%s'.", what);
-
- /* Error */
- return (1);
+#define ETR(tier, index, name) \
+ if (streq(what, #name)) \
+ { \
+ return BOOST_PP_CAT(ETR_,name); \
+ };
+#include "ego_flag_list.hpp"
+#undef ETR
+ return ego_flag_set();
}
-static bool_ grab_one_ego_item_flag_restrict(ego_item_type *e_ptr, cptr what, bool_ need)
-{
- int i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags1[i]))
- {
- if (need)
- e_ptr->need_flags1 |= (1L << i);
- else
- e_ptr->forbid_flags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2[i]))
- {
- if (need)
- e_ptr->need_flags2 |= (1L << i);
- else
- e_ptr->forbid_flags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 -- traps */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2_trap[i]))
- {
- if (need)
- e_ptr->need_flags2 |= (1L << i);
- else
- e_ptr->forbid_flags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags3[i]))
- {
- if (need)
- e_ptr->need_flags3 |= (1L << i);
- else
- e_ptr->forbid_flags3 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags4 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags4[i]))
- {
- if (need)
- e_ptr->need_flags4 |= (1L << i);
- else
- e_ptr->forbid_flags4 |= (1L << i);
- return (0);
- }
- }
- /* Check flags5 */
- for (i = 0; i < 32; i++)
+/*
+ * Grab one flag in a ego-item_type from a textual string.
+ *
+ * We explicitly allow nullptr for the "ego" parameter.
+ */
+static bool_ grab_one_ego_item_flag(object_flag_set *flags, ego_flag_set *ego, cptr what)
+{
+ /* Lookup as an object_flag */
+ if (auto f = object_flag_set_from_string(what))
{
- if (streq(what, k_info_flags5[i]))
- {
- if (need)
- e_ptr->need_flags5 |= (1L << i);
- else
- e_ptr->forbid_flags5 |= (1L << i);
- return (0);
- }
+ *flags |= f;
+ return 0;
}
- /* Check esp_flags */
- for (i = 0; i < 32; i++)
+ /* Lookup as ego flag */
+ if (ego)
{
- if (streq(what, esp_flags[i]))
+ if (auto f = lookup_ego_flag(what))
{
- if (need)
- e_ptr->need_esp |= (1L << i);
- else
- e_ptr->forbid_esp |= (1L << i);
+ *ego |= f;
return (0);
}
}
/* Oops */
- msg_format("Unknown ego-item restrict flag '%s'.", what);
+ msg_format("Unknown ego-item flag '%s'.", what);
/* Error */
return (1);
@@ -5509,13 +3425,14 @@ static bool_ grab_one_ego_item_flag_restrict(ego_item_type *e_ptr, cptr what, bo
-
/*
* Initialize the "e_info" array, by parsing an ascii "template" file
*/
errr init_e_info_txt(FILE *fp)
{
- int i, cur_r = -1, cur_t = 0, j;
+ auto &e_info = game->edit_data.e_info;
+
+ int i, cur_r = -1, cur_t = 0;
char buf[1024];
char *s, *t;
@@ -5563,46 +3480,20 @@ errr init_e_info_txt(FILE *fp)
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_e_idx) return (2);
-
/* Save the index */
error_idx = i;
+ /* Reset cur_* variables */
+ cur_r = -1;
+ cur_t = 0;
+
/* Point at the "info" */
- e_ptr = &e_info[i];
+ e_ptr = &expand_to_fit_index(e_info, i);
/* Copy name */
assert(!e_ptr->name);
e_ptr->name = my_strdup(s);
- /* Needed hack */
- e_ptr->power = -1;
- cur_r = -1;
- cur_t = 0;
-
- for (j = 0; j < 10; j++)
- {
- e_ptr->tval[j] = 255;
- }
- for (j = 0; j < FLAG_RARITY_MAX; j++)
- {
- e_ptr->rar[j] = 0;
- e_ptr->flags1[j] = 0;
- e_ptr->flags2[j] = 0;
- e_ptr->flags3[j] = 0;
- e_ptr->flags4[j] = 0;
- e_ptr->flags5[j] = 0;
- e_ptr->esp[j] = 0;
- e_ptr->oflags1[j] = 0;
- e_ptr->oflags2[j] = 0;
- e_ptr->oflags3[j] = 0;
- e_ptr->oflags4[j] = 0;
- e_ptr->oflags5[j] = 0;
- e_ptr->oesp[j] = 0;
- e_ptr->fego[j] = 0;
- }
-
/* Next... */
continue;
}
@@ -5763,7 +3654,10 @@ errr init_e_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_ego_item_flag_restrict(e_ptr, s, TRUE)) return (5);
+ if (grab_object_flag(&e_ptr->need_flags, s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -5776,24 +3670,9 @@ errr init_e_info_txt(FILE *fp)
/* Hack -- Process 'r:F' for forbidden flags */
if ((buf[0] == 'r') && (buf[2] == 'F'))
{
- /* Parse every entry textually */
- for (s = buf + 4; *s; )
+ if (grab_object_flag(&e_ptr->forbid_flags, buf + 4))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_ego_item_flag_restrict(e_ptr, s, FALSE)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -5819,7 +3698,14 @@ errr init_e_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_ego_item_flag(e_ptr, s, cur_r, FALSE)) return (5);
+ assert(cur_r < FLAG_RARITY_MAX);
+ if (0 != grab_one_ego_item_flag(
+ &e_ptr->flags[cur_r],
+ &e_ptr->fego[cur_r],
+ s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -5848,7 +3734,14 @@ errr init_e_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_ego_item_flag(e_ptr, s, cur_r, TRUE)) return (5);
+ assert(cur_r < FLAG_RARITY_MAX);
+ if (0 != grab_one_ego_item_flag(
+ &e_ptr->oflags[cur_r],
+ nullptr,
+ s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -5866,124 +3759,6 @@ errr init_e_info_txt(FILE *fp)
return (0);
}
-/*
- * Grab one flag in a randart_part_type from a textual string
- */
-static bool_ grab_one_randart_item_flag(randart_part_type *ra_ptr, cptr what, char c)
-{
- int i;
- u32b *f1, *f2, *f3, *f4, *f5, *esp;
-
- if (c == 'F')
- {
- f1 = &ra_ptr->flags1;
- f2 = &ra_ptr->flags2;
- f3 = &ra_ptr->flags3;
- f4 = &ra_ptr->flags4;
- f5 = &ra_ptr->flags5;
- esp = &ra_ptr->esp;
- }
- else
- {
- f1 = &ra_ptr->aflags1;
- f2 = &ra_ptr->aflags2;
- f3 = &ra_ptr->aflags3;
- f4 = &ra_ptr->aflags4;
- f5 = &ra_ptr->aflags5;
- esp = &ra_ptr->aesp;
- }
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags1[i]))
- {
- *f1 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2[i]))
- {
- *f2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags2 -- traps */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags2_trap[i]))
- {
- *f2 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags3[i]))
- {
- *f3 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags4 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags4[i]))
- {
- *f4 |= (1L << i);
- return (0);
- }
- }
-
- /* Check flags5 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, k_info_flags5[i]))
- {
- *f5 |= (1L << i);
- return (0);
- }
- }
-
- /* Check esp_flags */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, esp_flags[i]))
- {
- *esp |= (1L << i);
- return (0);
- }
- }
-
- /* Check ego_flags */
- if (c == 'F')
- {
- for (i = 0; i < 32; i++)
- {
- if (streq(what, ego_flags[i]))
- {
- ra_ptr->fego |= (1L << i);
- return (0);
- }
- }
- }
-
- /* Oops */
- msg_format("Unknown ego-item flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-
/*
@@ -5991,9 +3766,10 @@ static bool_ grab_one_randart_item_flag(randart_part_type *ra_ptr, cptr what, ch
*/
errr init_ra_info_txt(FILE *fp)
{
- int i, cur_t = 0, j, cur_g = 0;
+ auto &ra_gen = game->edit_data.ra_gen;
+ auto &ra_info = game->edit_data.ra_info;
+
char buf[1024];
- char *s, *t;
/* Current entry */
randart_part_type *ra_ptr = NULL;
@@ -6028,11 +3804,14 @@ errr init_ra_info_txt(FILE *fp)
&chance, &dd, &ds, &plus)) return (1);
/* Save the values */
- ra_gen[cur_g].chance = chance;
- ra_gen[cur_g].dd = dd;
- ra_gen[cur_g].ds = ds;
- ra_gen[cur_g].plus = plus;
- cur_g++;
+ randart_gen_type gen;
+ gen.chance = chance;
+ gen.dd = dd;
+ gen.ds = ds;
+ gen.plus = plus;
+
+ /* Add to data */
+ ra_gen.emplace_back(gen);
/* Next... */
continue;
@@ -6042,35 +3821,16 @@ errr init_ra_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_ra_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- ra_ptr = &ra_info[i];
-
- /* Needed hack */
- ra_ptr->power = -1;
- cur_t = 0;
-
- for (j = 0; j < 20; j++)
- {
- ra_ptr->tval[j] = 255;
- }
- ra_ptr->flags1 = 0;
- ra_ptr->flags2 = 0;
- ra_ptr->flags3 = 0;
- ra_ptr->flags4 = 0;
- ra_ptr->flags5 = 0;
- ra_ptr->esp = 0;
- ra_ptr->fego = 0;
+ ra_ptr = &expand_to_fit_index(ra_info, i);
/* Next... */
continue;
@@ -6082,20 +3842,19 @@ errr init_ra_info_txt(FILE *fp)
/* Process 'T' for "Tval/Sval" (up to 5 lines) */
if (buf[0] == 'T')
{
- int tv, minsv, maxsv;
-
- if (cur_t == 20) return 1;
-
/* Scan for the values */
+ int tv, minsv, maxsv;
if (3 != sscanf(buf + 2, "%d:%d:%d",
&tv, &minsv, &maxsv)) return (1);
- /* Save the values */
- ra_ptr->tval[cur_t] = tv;
- ra_ptr->min_sval[cur_t] = minsv;
- ra_ptr->max_sval[cur_t] = maxsv;
+ /* Set up filter */
+ randart_part_type::kind_filter_t filter;
+ filter.tval = tv;
+ filter.min_sval = minsv;
+ filter.max_sval = maxsv;
- cur_t++;
+ /* Add filter */
+ ra_ptr->kind_filter.emplace_back(filter);
/* Next... */
continue;
@@ -6157,18 +3916,21 @@ errr init_ra_info_txt(FILE *fp)
/* Process 'Z' for "Granted power" */
if (buf[0] == 'Z')
{
- int i;
-
/* Acquire the text */
- s = buf + 2;
+ char const *s = buf + 2;
/* Find it in the list */
+ std::size_t i;
for (i = 0; i < POWER_MAX; i++)
{
if (iequals(s, powers_type[i].name)) break;
}
- if (i == POWER_MAX) return (6);
+ /* Not present? Fail */
+ if (i == POWER_MAX)
+ {
+ return (6);
+ }
ra_ptr->power = i;
@@ -6176,54 +3938,30 @@ errr init_ra_info_txt(FILE *fp)
continue;
}
- /* Hack -- Process 'F' for flags */
+ /* Process 'F' for flags */
if (buf[0] == 'F')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (0 != grab_one_ego_item_flag(
+ &ra_ptr->flags,
+ &ra_ptr->fego,
+ buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_randart_item_flag(ra_ptr, s, 'F')) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
continue;
}
- /* Hack -- Process 'A' for antagonic flags */
+ /* Process 'A' for antagonic flags */
if (buf[0] == 'A')
{
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
+ if (0 != grab_one_ego_item_flag(
+ &ra_ptr->aflags,
+ nullptr,
+ buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_randart_item_flag(ra_ptr, s, 'A')) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -6238,72 +3976,17 @@ errr init_ra_info_txt(FILE *fp)
return (0);
}
-/*
- * Grab one (basic) flag in a monster_race from a textual string
- */
-static errr grab_one_basic_flag(monster_race *r_ptr, cptr what)
-{
- int i;
-
- /* Scan flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags1[i]))
- {
- r_ptr->flags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags2[i]))
- {
- r_ptr->flags2 |= (1L << i);
- return (0);
- }
- }
- /* Scan flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags3[i]))
- {
- r_ptr->flags3 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags7 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags7[i]))
- {
- r_ptr->flags7 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags8 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags8[i]))
- {
- r_ptr->flags8 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags9 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags9[i]))
- {
- r_ptr->flags9 |= (1L << i);
- return (0);
- }
- }
+static errr grab_monster_race_flag(monster_race_flag_set *flags, cptr what)
+{
+#define RF(tier, index, name) \
+ if (streq(what, #name)) \
+ { \
+ *flags |= BOOST_PP_CAT(RF_,name); \
+ return 0; \
+ };
+#include "monster_race_flag_list.hpp"
+#undef RF
/* Oops */
msg_format("Unknown monster flag '%s'.", what);
@@ -6316,37 +3999,14 @@ static errr grab_one_basic_flag(monster_race *r_ptr, cptr what)
/*
* Grab one (spell) flag in a monster_race from a textual string
*/
-static errr grab_one_spell_flag(monster_race *r_ptr, cptr what)
+static errr grab_one_monster_spell_flag(monster_spell_flag_set *flags, cptr what)
{
- int i;
-
- /* Scan flags4 */
- for (i = 0; i < 32; i++)
+ for (auto const &monster_spell: monster_spells())
{
- if (streq(what, r_info_flags4[i]))
+ if (streq(what, monster_spell->name))
{
- r_ptr->flags4 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags5 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags5[i]))
- {
- r_ptr->flags5 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags6 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags6[i]))
- {
- r_ptr->flags6 |= (1L << i);
- return (0);
+ *flags |= monster_spell->flag_set;
+ return 0;
}
}
@@ -6363,9 +4023,9 @@ static errr grab_one_spell_flag(monster_race *r_ptr, cptr what)
*/
errr init_r_info_txt(FILE *fp)
{
- int i;
+ auto &r_info = game->edit_data.r_info;
+
char buf[1024];
- char *s, *t;
/* Current entry */
monster_race *r_ptr = NULL;
@@ -6394,7 +4054,7 @@ errr init_r_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -6406,19 +4066,16 @@ errr init_r_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_r_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- r_ptr = &r_info[i];
+ r_ptr = &expand_to_fit_index(r_info, i);
/* Allocate name string. */
assert(!r_ptr->name); // Sanity check that we aren't overwriting anything
@@ -6427,12 +4084,11 @@ errr init_r_info_txt(FILE *fp)
/* Ensure empty description */
r_ptr->text = my_strdup("");
- /* HACK -- Those ones HAVE to have a set default value */
- r_ptr->drops.treasure = OBJ_GENE_TREASURE;
- r_ptr->drops.combat = OBJ_GENE_COMBAT;
- r_ptr->drops.magic = OBJ_GENE_MAGIC;
- r_ptr->drops.tools = OBJ_GENE_TOOL;
- r_ptr->freq_inate = r_ptr->freq_spell = 0;
+ /* Set default drop theme */
+ r_ptr->drops = obj_theme::defaults();
+
+ r_ptr->freq_inate = 0;
+ r_ptr->freq_spell = 0;
/* Next... */
continue;
@@ -6445,11 +4101,8 @@ errr init_r_info_txt(FILE *fp)
/* Process 'D' for "Description" */
if (buf[0] == 'D')
{
- /* Acquire the text */
- s = buf + 2;
-
/* Append to description */
- strappend(&r_ptr->text, s);
+ strappend(&r_ptr->text, buf + 2);
/* Next... */
continue;
@@ -6547,6 +4200,25 @@ errr init_r_info_txt(FILE *fp)
continue;
}
+ /* Process 'A' for standard artifact drop (one line only) */
+ if (buf[0] == 'A')
+ {
+ int artifact_idx;
+ int artifact_chance;
+
+ /* Scan for values */
+ if (2 != sscanf(buf + 2, "%d:%d",
+ &artifact_idx,
+ &artifact_chance)) return (1);
+
+ /* Save the values */
+ r_ptr->artifact_idx = artifact_idx;
+ r_ptr->artifact_chance = artifact_chance;
+
+ /* Next... */
+ continue;
+ }
+
/* Process 'W' for "More Info" (one line only) */
if (buf[0] == 'W')
{
@@ -6572,7 +4244,9 @@ errr init_r_info_txt(FILE *fp)
/* Process 'B' for "Blows" (up to four lines) */
if (buf[0] == 'B')
{
- int n1, n2;
+ int i, n1, n2;
+ char *s;
+ char *t;
/* Find the next empty blow slot (if any) */
for (i = 0; i < 4; i++) if (!r_ptr->blow[i].method) break;
@@ -6633,24 +4307,9 @@ errr init_r_info_txt(FILE *fp)
/* Process 'F' for "Basic Flags" (multiple lines) */
if (buf[0] == 'F')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
+ if (0 != grab_monster_race_flag(&r_ptr->flags, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_basic_flag(r_ptr, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -6660,37 +4319,23 @@ errr init_r_info_txt(FILE *fp)
/* Process 'S' for "Spell Flags" (multiple lines) */
if (buf[0] == 'S')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
- {
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
+ char const *s = buf + 2;
+ int i;
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
+ /* XXX XXX XXX Hack -- Read spell frequency */
+ if (1 == sscanf(s, "1_IN_%d", &i))
+ {
+ /* Extract a "frequency" */
+ r_ptr->freq_spell = r_ptr->freq_inate = 100 / i;
+ }
- /* XXX XXX XXX Hack -- Read spell frequency */
- if (1 == sscanf(s, "1_IN_%d", &i))
+ /* Parse this entry */
+ else
+ {
+ if (0 != grab_one_monster_spell_flag(&r_ptr->spells, s))
{
- /* Extract a "frequency" */
- r_ptr->freq_spell = r_ptr->freq_inate = 100 / i;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
+ return (5);
}
-
- /* Parse this entry */
- if (0 != grab_one_spell_flag(r_ptr, s)) return (5);
-
- /* Start the next entry */
- s = t;
}
/* Next... */
@@ -6701,259 +4346,22 @@ errr init_r_info_txt(FILE *fp)
return (6);
}
- /* Postprocessing */
- for (i = 1; i < max_r_idx; i++)
- {
- /* Invert flag WILD_ONLY <-> RF8_DUNGEON */
- r_info[i].flags8 ^= 1L;
-
- /* WILD_TOO without any other wilderness flags enables all flags */
- if ((r_info[i].flags8 & RF8_WILD_TOO) && !(r_info[i].flags8 & 0x7FFFFFFE))
- r_info[i].flags8 = 0x0463;
- }
-
/* Success */
return (0);
}
/*
- * Grab one (basic) flag in a monster_race from a textual string
- */
-static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool_ add)
-{
- int i;
-
- /* Scan flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags1[i]))
- {
- if (add)
- re_ptr->mflags1 |= (1L << i);
- else
- re_ptr->nflags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags2[i]))
- {
- if (add)
- re_ptr->mflags2 |= (1L << i);
- else
- re_ptr->nflags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags3[i]))
- {
- if (add)
- re_ptr->mflags3 |= (1L << i);
- else
- re_ptr->nflags3 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags7 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags7[i]))
- {
- if (add)
- re_ptr->mflags7 |= (1L << i);
- else
- re_ptr->nflags7 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags8 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags8[i]))
- {
- if (add)
- re_ptr->mflags8 |= (1L << i);
- else
- re_ptr->nflags8 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags9 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags9[i]))
- {
- if (add)
- re_ptr->mflags9 |= (1L << i);
- else
- re_ptr->nflags9 |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown monster flag '%s'.", what);
-
- /* Failure */
- return (1);
-}
-
-
-/*
- * Grab one (spell) flag in a monster_race from a textual string
- */
-static errr grab_one_spell_ego_flag(monster_ego *re_ptr, cptr what, bool_ add)
-{
- int i;
-
- /* Scan flags4 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags4[i]))
- {
- if (add)
- re_ptr->mflags4 |= (1L << i);
- else
- re_ptr->nflags4 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags5 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags5[i]))
- {
- if (add)
- re_ptr->mflags5 |= (1L << i);
- else
- re_ptr->nflags5 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags6 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags6[i]))
- {
- if (add)
- re_ptr->mflags6 |= (1L << i);
- else
- re_ptr->nflags6 |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown monster flag '%s'.", what);
-
- /* Failure */
- return (1);
-}
-
-/*
- * Grab one (basic) flag in a monster_race from a textual string
- */
-static errr grab_one_ego_flag(monster_ego *re_ptr, cptr what, bool_ must)
-{
- int i;
-
- /* Scan flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags1[i]))
- {
- if (must) re_ptr->flags1 |= (1L << i);
- else re_ptr->hflags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags2[i]))
- {
- if (must) re_ptr->flags2 |= (1L << i);
- else re_ptr->hflags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags3[i]))
- {
- if (must) re_ptr->flags3 |= (1L << i);
- else re_ptr->hflags3 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags7 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags7[i]))
- {
- if (must) re_ptr->flags7 |= (1L << i);
- else re_ptr->hflags7 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags8 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags8[i]))
- {
- if (must) re_ptr->flags8 |= (1L << i);
- else re_ptr->hflags8 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags9 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags9[i]))
- {
- if (must) re_ptr->flags9 |= (1L << i);
- else re_ptr->hflags9 |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown monster flag '%s'.", what);
-
- /* Failure */
- return (1);
-}
-
-/*
* Initialize the "re_info" array, by parsing an ascii "template" file
*/
errr init_re_info_txt(FILE *fp)
{
- int i, j;
+ auto &re_info = game->edit_data.re_info;
+
char buf[1024];
byte blow_num = 0;
- int r_char_number = 0, nr_char_number = 0;
-
- char *s, *t;
+ int r_char_number = 0;
+ int nr_char_number = 0;
/* Current entry */
monster_ego *re_ptr = NULL;
@@ -6981,7 +4389,7 @@ errr init_re_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -6993,19 +4401,16 @@ errr init_re_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_re_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- re_ptr = &re_info[i];
+ re_ptr = &expand_to_fit_index(re_info, i);
/* Copy name */
assert(!re_ptr->name);
@@ -7015,9 +4420,8 @@ errr init_re_info_txt(FILE *fp)
blow_num = 0;
r_char_number = 0;
nr_char_number = 0;
- for (j = 0; j < 5; j++) re_ptr->r_char[j] = 0;
- for (j = 0; j < 5; j++) re_ptr->nr_char[j] = 0;
- for (j = 0; j < 4; j++)
+
+ for (std::size_t j = 0; j < 4; j++)
{
re_ptr->blow[j].method = 0;
re_ptr->blow[j].effect = 0;
@@ -7113,6 +4517,8 @@ errr init_re_info_txt(FILE *fp)
{
int n1, n2, dice, side;
char mdice, mside;
+ char *s;
+ char *t;
/* Oops, no more slots */
if (blow_num == 4) return (1);
@@ -7173,39 +4579,24 @@ errr init_re_info_txt(FILE *fp)
char r_char;
/* Parse every entry */
- for (s = buf + 2; *s; )
+ char const *s = buf + 2;
+
+ /* XXX XXX XXX Hack -- Read monster symbols */
+ if (1 == sscanf(s, "R_CHAR_%c", &r_char))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
+ /* Limited to 5 races */
+ if (r_char_number >= 5) continue;
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
+ /* Extract a "frequency" */
+ re_ptr->r_char[r_char_number++] = r_char;
+ }
- /* XXX XXX XXX Hack -- Read monster symbols */
- if (1 == sscanf(s, "R_CHAR_%c", &r_char))
+ /* Parse this entry */
+ else {
+ if (0 != grab_monster_race_flag(&re_ptr->flags, s))
{
- /* Limited to 5 races */
- if (r_char_number >= 5) continue;
-
- /* Extract a "frequency" */
- re_ptr->r_char[r_char_number++] = r_char;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
+ return (5);
}
-
- /* Parse this entry */
- if (0 != grab_one_ego_flag(re_ptr, s, TRUE)) return (5);
-
- /* Start the next entry */
- s = t;
}
/* Next... */
@@ -7218,39 +4609,24 @@ errr init_re_info_txt(FILE *fp)
char r_char;
/* Parse every entry */
- for (s = buf + 2; *s; )
+ char const *s = buf + 2;
+
+ /* XXX XXX XXX Hack -- Read monster symbols */
+ if (1 == sscanf(s, "R_CHAR_%c", &r_char))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
+ /* Limited to 5 races */
+ if (nr_char_number >= 5) continue;
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
+ /* Extract a "frequency" */
+ re_ptr->nr_char[nr_char_number++] = r_char;
+ }
- /* XXX XXX XXX Hack -- Read monster symbols */
- if (1 == sscanf(s, "R_CHAR_%c", &r_char))
+ /* Parse this entry */
+ else {
+ if (0 != grab_monster_race_flag(&re_ptr->hflags, s))
{
- /* Limited to 5 races */
- if (nr_char_number >= 5) continue;
-
- /* Extract a "frequency" */
- re_ptr->nr_char[nr_char_number++] = r_char;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
+ return (5);
}
-
- /* Parse this entry */
- if (0 != grab_one_ego_flag(re_ptr, s, FALSE)) return (5);
-
- /* Start the next entry */
- s = t;
}
/* Next... */
@@ -7260,24 +4636,9 @@ errr init_re_info_txt(FILE *fp)
/* Process 'M' for "Basic Monster Flags" (multiple lines) */
if (buf[0] == 'M')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
+ if (0 != grab_monster_race_flag(&re_ptr->mflags, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_basic_ego_flag(re_ptr, s, TRUE)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -7287,37 +4648,20 @@ errr init_re_info_txt(FILE *fp)
/* Process 'O' for "Basic Monster -Flags" (multiple lines) */
if (buf[0] == 'O')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
- {
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
+ char const *s = buf + 2;
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
+ /* XXX XXX XXX Hack -- Read no flags */
+ if (!strcmp(s, "MF_ALL"))
+ {
+ re_ptr->nflags = ~monster_race_flag_set();
+ }
- /* XXX XXX XXX Hack -- Read no flags */
- if (!strcmp(s, "MF_ALL"))
+ /* Parse this entry */
+ else {
+ if (0 != grab_monster_race_flag(&re_ptr->nflags, s))
{
- /* No flags */
- re_ptr->nflags1 = re_ptr->nflags2 = re_ptr->nflags3 = re_ptr->nflags7 = re_ptr->nflags8 = re_ptr->nflags9 = 0xFFFFFFFF;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
+ return (5);
}
-
- /* Parse this entry */
- if (0 != grab_one_basic_ego_flag(re_ptr, s, FALSE)) return (5);
-
- /* Start the next entry */
- s = t;
}
/* Next... */
@@ -7327,37 +4671,22 @@ errr init_re_info_txt(FILE *fp)
/* Process 'S' for "Spell Flags" (multiple lines) */
if (buf[0] == 'S')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
- {
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
+ char const *s = buf + 2;
+ int i;
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
+ /* XXX XXX XXX Hack -- Read spell frequency */
+ if (1 == sscanf(s, "1_IN_%d", &i))
+ {
+ /* Extract a "frequency" */
+ re_ptr->freq_spell = re_ptr->freq_inate = 100 / i;
+ }
- /* XXX XXX XXX Hack -- Read spell frequency */
- if (1 == sscanf(s, "1_IN_%d", &i))
+ /* Parse this entry */
+ else {
+ if (0 != grab_one_monster_spell_flag(&re_ptr->mspells, s))
{
- /* Extract a "frequency" */
- re_ptr->freq_spell = re_ptr->freq_inate = 100 / i;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
+ return (5);
}
-
- /* Parse this entry */
- if (0 != grab_one_spell_ego_flag(re_ptr, s, TRUE)) return (5);
-
- /* Start the next entry */
- s = t;
}
/* Next... */
@@ -7368,8 +4697,10 @@ errr init_re_info_txt(FILE *fp)
if (buf[0] == 'T')
{
/* Parse every entry */
- for (s = buf + 2; *s; )
+ for (char *s = buf + 2; *s; )
{
+ char *t;
+
/* Find the end of this entry */
for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
@@ -7384,7 +4715,7 @@ errr init_re_info_txt(FILE *fp)
if (!strcmp(s, "MF_ALL"))
{
/* No flags */
- re_ptr->nflags4 = re_ptr->nflags5 = re_ptr->nflags6 = 0xFFFFFFFF;
+ re_ptr->nspells = ~monster_spell_flag_set();
/* Start at next entry */
s = t;
@@ -7394,7 +4725,7 @@ errr init_re_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_spell_ego_flag(re_ptr, s, FALSE)) return (5);
+ if (0 != grab_one_monster_spell_flag(&re_ptr->nspells, s)) return (5);
/* Start the next entry */
s = t;
@@ -7414,287 +4745,17 @@ errr init_re_info_txt(FILE *fp)
/*
- * Grab one flag in an trap_type from a textual string
- */
-static errr grab_one_trap_type_flag(trap_type *t_ptr, cptr what)
-{
- s16b i;
-
- /* Check flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, t_info_flags[i]))
- {
- t_ptr->flags |= (1L << i);
- return (0);
- }
- }
- /* Oops */
- msg_format("Unknown trap_type flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-
-/*
- * Initialize the "tr_info" array, by parsing an ascii "template" file
- */
-errr init_t_info_txt(FILE *fp)
-{
- int i;
- char buf[1024];
- char *s, *t;
-
- /* Current entry */
- trap_type *t_ptr = NULL;
-
- /* Just before the first record */
- error_idx = -1;
-
- /* Just before the first line */
- error_line = -1;
-
- /* Parse */
- while (0 == my_fgets(fp, buf, 1024))
- {
- /* Advance the line number */
- error_line++;
-
- /* Skip comments and blank lines */
- if (!buf[0] || (buf[0] == '#')) continue;
-
- /* Verify correct "colon" format */
- if (buf[1] != ':') return (1);
-
- /* Process 'N' for "New/Number/Name" */
- if (buf[0] == 'N')
- {
- /* Find the colon before the name */
- s = strchr(buf + 2, ':');
-
- /* Verify that colon */
- if (!s) return (1);
-
- /* Nuke the colon, advance to the name */
- *s++ = '\0';
-
- /* Paranoia -- require a name */
- if (!*s) return (1);
-
- /* Get the index */
- i = atoi(buf + 2);
-
- /* Verify information */
- if (i <= error_idx) return (4);
-
- /* Verify information */
- if (i >= max_t_idx) return (2);
-
- /* Save the index */
- error_idx = i;
-
- /* Point at the "info" */
- t_ptr = &t_info[i];
-
- /* Copy name */
- t_ptr->name = my_strdup(s);
-
- /* Initialize */
- t_ptr->text = my_strdup("");
-
- /* Next... */
- continue;
- }
-
- /* There better be a current t_ptr */
- if (!t_ptr) return (3);
-
-
- /* Process 'I' for "Information" */
- if (buf[0] == 'I')
- {
- int probability, another, p1valinc, difficulty;
- int minlevel;
- int dd, ds;
- char color;
-
- /* Scan for the values */
- if (8 != sscanf(buf + 2, "%d:%d:%d:%d:%d:%dd%d:%c",
- &difficulty, &probability, &another,
- &p1valinc, &minlevel, &dd, &ds,
- &color)) return (1);
-
- t_ptr->difficulty = (byte)difficulty;
- t_ptr->probability = (s16b)probability;
- t_ptr->another = (s16b)another;
- t_ptr->p1valinc = (s16b)p1valinc;
- t_ptr->minlevel = (byte)minlevel;
- t_ptr->dd = (s16b)dd;
- t_ptr->ds = (s16b)ds;
- t_ptr->color = color_char_to_attr(color);
-
- /* Next... */
- continue;
- }
-
-
- /* Process 'D' for "Description" */
- if (buf[0] == 'D')
- {
- /* Acquire the text */
- s = buf + 2;
-
- /* Append chars to the name */
- strappend(&t_ptr->text, s);
-
- /* Next... */
- continue;
- }
-
-
- /* Hack -- Process 'F' for flags */
- if (buf[0] == 'F')
- {
-
- t_ptr->flags = 0;
-
- /* Parse every entry textually */
- for (s = buf + 2; *s; )
- {
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_trap_type_flag(t_ptr, s)) return (5);
-
- /* Start the next entry */
- s = t;
- }
-
- /* Next... */
- continue;
- }
-
-
- /* Oops */
- return (6);
- }
-
- /* Success */
- return (0);
-}
-
-/*
* Grab one flag for a dungeon type from a textual string
*/
-errr grab_one_dungeon_flag(u32b *flags1, u32b *flags2, cptr what)
+errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str)
{
- int i;
-
- /* Scan flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, d_info_flags1[i]))
- {
- *flags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, d_info_flags2[i]))
- {
- *flags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown dungeon type flag '%s'.", what);
-
- /* Failure */
- return (1);
-}
-
-/*
- * Grab one (basic) flag in a monster_race from a textual string
- */
-static errr grab_one_basic_monster_flag(dungeon_info_type *d_ptr, cptr what, byte rule)
-{
- int i;
-
- /* Scan flags1 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags1[i]))
- {
- d_ptr->rules[rule].mflags1 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags2 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags2[i]))
- {
- d_ptr->rules[rule].mflags2 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags3 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags3[i]))
- {
- d_ptr->rules[rule].mflags3 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags7 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags7[i]))
- {
- d_ptr->rules[rule].mflags7 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags8 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags8[i]))
- {
- d_ptr->rules[rule].mflags8 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags9 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags9[i]))
- {
- d_ptr->rules[rule].mflags9 |= (1L << i);
- return (0);
- }
- }
+#define DF(tier, index, name) \
+ if (streq(str, #name)) { *flags |= DF_##name; return 0; }
+#include "dungeon_flag_list.hpp"
+#undef DF
/* Oops */
- msg_format("Unknown monster flag '%s'.", what);
+ msg_format("Unknown dungeon type flag '%s'.", str);
/* Failure */
return (1);
@@ -7702,63 +4763,18 @@ static errr grab_one_basic_monster_flag(dungeon_info_type *d_ptr, cptr what, byt
/*
- * Grab one (spell) flag in a monster_race from a textual string
- */
-static errr grab_one_spell_monster_flag(dungeon_info_type *d_ptr, cptr what, byte rule)
-{
- int i;
-
- /* Scan flags4 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags4[i]))
- {
- d_ptr->rules[rule].mflags4 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags5 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags5[i]))
- {
- d_ptr->rules[rule].mflags5 |= (1L << i);
- return (0);
- }
- }
-
- /* Scan flags6 */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, r_info_flags6[i]))
- {
- d_ptr->rules[rule].mflags6 |= (1L << i);
- return (0);
- }
- }
-
- /* Oops */
- msg_format("Unknown monster flag '%s'.", what);
-
- /* Failure */
- return (1);
-}
-
-/*
* Initialize the "d_info" array, by parsing an ascii "template" file
*/
errr init_d_info_txt(FILE *fp)
{
- int i, j;
+ auto &d_info = game->edit_data.d_info;
+
char buf[1024];
s16b rule_num = 0;
byte r_char_number = 0;
- char *s, *t;
-
/* Current entry */
dungeon_info_type *d_ptr = NULL;
@@ -7785,7 +4801,7 @@ errr init_d_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -7797,26 +4813,20 @@ errr init_d_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_d_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- d_ptr = &d_info[i];
+ d_ptr = &expand_to_fit_index(d_info, i);
+ assert(d_ptr->name.empty());
/* Copy name */
- assert(!d_ptr->name);
- d_ptr->name = my_strdup(s);
-
- /* Initialize description */
- d_ptr->text = my_strdup("");
+ d_ptr->name = s;
/* HACK -- Those ones HAVE to have a set default value */
d_ptr->size_x = -1;
@@ -7828,24 +4838,22 @@ errr init_d_info_txt(FILE *fp)
d_ptr->fill_method = 1;
rule_num = -1;
r_char_number = 0;
- for (j = 0; j < 5; j++)
+ for (std::size_t j = 0; j < 5; j++)
{
- int k;
-
d_ptr->rules[j].mode = DUNGEON_MODE_NONE;
d_ptr->rules[j].percent = 0;
- for (k = 0; k < 5; k++) d_ptr->rules[j].r_char[k] = 0;
+ for (std::size_t k = 0; k < 5; k++)
+ {
+ d_ptr->rules[j].r_char[k] = 0;
+ }
}
- /* HACK -- Those ones HAVE to have a set default value */
- d_ptr->objs.treasure = OBJ_GENE_TREASURE;
- d_ptr->objs.combat = OBJ_GENE_COMBAT;
- d_ptr->objs.magic = OBJ_GENE_MAGIC;
- d_ptr->objs.tools = OBJ_GENE_TOOL;
+ /* Set default drop theme */
+ d_ptr->objs = obj_theme::defaults();
/* The default generator */
- strcpy(d_ptr->generator, "dungeon");
+ d_ptr->generator = "dungeon";
/* Next... */
continue;
@@ -7858,15 +4866,12 @@ errr init_d_info_txt(FILE *fp)
if (buf[0] == 'D')
{
/* Acquire short name */
- d_ptr->short_name[0] = buf[2];
- d_ptr->short_name[1] = buf[3];
- d_ptr->short_name[2] = buf[4];
-
- /* Acquire the text */
- s = buf + 6;
+ d_ptr->short_name += buf[2];
+ d_ptr->short_name += buf[3];
+ d_ptr->short_name += buf[4];
/* Append to description */
- strappend(&d_ptr->text, s);
+ d_ptr->text += (buf + 6);
/* Next... */
continue;
@@ -7876,18 +4881,17 @@ errr init_d_info_txt(FILE *fp)
if (buf[0] == 'W')
{
int min_lev, max_lev;
- int min_plev, next;
+ int min_plev;
int min_alloc, max_chance;
/* Scan for the values */
- if (6 != sscanf(buf + 2, "%d:%d:%d:%d:%d:%d",
- &min_lev, &max_lev, &min_plev, &next, &min_alloc, &max_chance)) return (1);
+ if (5 != sscanf(buf + 2, "%d:%d:%d:%d:%d",
+ &min_lev, &max_lev, &min_plev, &min_alloc, &max_chance)) return (1);
/* Save the values */
d_ptr->mindepth = min_lev;
d_ptr->maxdepth = max_lev;
d_ptr->min_plev = min_plev;
- d_ptr->next = next;
d_ptr->min_m_alloc_level = min_alloc;
d_ptr->max_m_alloc_chance = max_chance;
@@ -7956,7 +4960,7 @@ errr init_d_info_txt(FILE *fp)
/* Process 'G' for "Generator" (one line only) */
if (buf[0] == 'G')
{
- strnfmt(d_ptr->generator, 30, "%s", buf + 2);
+ d_ptr->generator = (buf + 2);
/* Next... */
continue;
@@ -8010,8 +5014,15 @@ errr init_d_info_txt(FILE *fp)
cptr tmp;
/* Find the next empty blow slot (if any) */
- for (i = 0; i < 4; i++) if ((!d_ptr->d_side[i]) &&
- (!d_ptr->d_dice[i])) break;
+ std::size_t i;
+ for (i = 0; i < 4; i++)
+ {
+ if ((!d_ptr->d_side[i]) &&
+ (!d_ptr->d_dice[i]))
+ {
+ break;
+ }
+ }
/* Oops, no more slots */
if (i == 4) return (1);
@@ -8065,103 +5076,57 @@ errr init_d_info_txt(FILE *fp)
int ix = -1, iy = -1, ox = -1, oy = -1;
int fill_method;
- /* Parse every entry */
- for (s = buf + 2; *s; )
- {
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Read dungeon in/out coords */
- if (4 == sscanf(s, "WILD_%d_%d__%d_%d", &ix, &iy, &ox, &oy))
- {
- d_ptr->ix = ix;
- d_ptr->iy = iy;
- d_ptr->ox = ox;
- d_ptr->oy = oy;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
- }
-
- /* Read dungeon size */
- if (2 == sscanf(s, "SIZE_%d_%d", &ix, &iy))
- {
- d_ptr->size_x = ix;
- d_ptr->size_y = iy;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
- }
-
- /* Read dungeon fill method */
- if (1 == sscanf(s, "FILL_METHOD_%d", &fill_method))
- {
- d_ptr->fill_method = fill_method;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
- }
+ char const *s = buf + 2;
- /* Read Final Object */
- if (1 == sscanf(s, "FINAL_OBJECT_%d", &obj))
- {
- /* Extract a "Final Artifact" */
- d_ptr->final_object = obj;
+ /* Read dungeon in/out coords */
+ if (4 == sscanf(s, "WILD_%d_%d__%d_%d", &ix, &iy, &ox, &oy))
+ {
+ d_ptr->ix = ix;
+ d_ptr->iy = iy;
+ d_ptr->ox = ox;
+ d_ptr->oy = oy;
+ }
- /* Start at next entry */
- s = t;
+ /* Read dungeon size */
+ else if (2 == sscanf(s, "SIZE_%d_%d", &ix, &iy))
+ {
+ d_ptr->size_x = ix;
+ d_ptr->size_y = iy;
+ }
- /* Continue */
- continue;
- }
+ /* Read dungeon fill method */
+ else if (1 == sscanf(s, "FILL_METHOD_%d", &fill_method))
+ {
+ d_ptr->fill_method = fill_method;
+ }
- /* Read Final Artifact */
- if (1 == sscanf(s, "FINAL_ARTIFACT_%d", &artif ))
- {
- /* Extract a "Final Artifact" */
- d_ptr->final_artifact = artif ;
+ /* Read Final Object */
+ else if (1 == sscanf(s, "FINAL_OBJECT_%d", &obj))
+ {
+ /* Extract a "Final Artifact" */
+ d_ptr->final_object = obj;
+ }
- /* Start at next entry */
- s = t;
+ /* Read Final Artifact */
+ else if (1 == sscanf(s, "FINAL_ARTIFACT_%d", &artif ))
+ {
+ /* Extract a "Final Artifact" */
+ d_ptr->final_artifact = artif ;
+ }
- /* Continue */
- continue;
- }
+ /* Read Artifact Guardian */
+ else if (1 == sscanf(s, "FINAL_GUARDIAN_%d", &monst))
+ {
+ /* Extract a "Artifact Guardian" */
+ d_ptr->final_guardian = monst;
+ }
- /* Read Artifact Guardian */
- if (1 == sscanf(s, "FINAL_GUARDIAN_%d", &monst))
+ /* Parse this entry */
+ else {
+ if (0 != grab_one_dungeon_flag(&d_ptr->flags, s))
{
- /* Extract a "Artifact Guardian" */
- d_ptr->final_guardian = monst;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
+ return (5);
}
-
- /* Parse this entry */
- if (0 != grab_one_dungeon_flag(&(d_ptr->flags1), &(d_ptr->flags2), s)) return (5);
-
- /* Start the next entry */
- s = t;
}
/* Next... */
@@ -8207,41 +5172,24 @@ errr init_d_info_txt(FILE *fp)
if (buf[0] == 'M')
{
byte r_char;
+ char const *s = buf + 2;
- /* Parse every entry */
- for (s = buf + 2; *s; )
+ /* Read monster symbols */
+ if (1 == sscanf(s, "R_CHAR_%c", &r_char))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
+ /* Limited to 5 races */
+ if (r_char_number >= 5) continue;
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
+ /* Extract a "frequency" */
+ d_ptr->rules[rule_num].r_char[r_char_number++] = r_char;
+ }
- /* Read monster symbols */
- if (1 == sscanf(s, "R_CHAR_%c", &r_char))
+ /* Parse this entry */
+ else {
+ if (0 != grab_monster_race_flag(&d_ptr->rules[rule_num].mflags, s))
{
- /* Limited to 5 races */
- if (r_char_number >= 5) continue;
-
- /* Extract a "frequency" */
- d_ptr->rules[rule_num].r_char[r_char_number++] = r_char;
-
- /* Start at next entry */
- s = t;
-
- /* Continue */
- continue;
+ return (5);
}
-
- /* Parse this entry */
- if (0 != grab_one_basic_monster_flag(d_ptr, s, rule_num)) return (5);
-
- /* Start the next entry */
- s = t;
}
/* Next... */
@@ -8251,24 +5199,12 @@ errr init_d_info_txt(FILE *fp)
/* Process 'S' for "Spell Flags" (multiple lines) */
if (buf[0] == 'S')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
- {
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while ((*t == ' ') || (*t == '|')) t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_spell_monster_flag(d_ptr, s, rule_num)) return (5);
+ char const *s = buf + 2;
- /* Start the next entry */
- s = t;
+ /* Parse this entry */
+ if (0 != grab_one_monster_spell_flag(&d_ptr->rules[rule_num].mspells, s))
+ {
+ return (5);
}
/* Next... */
@@ -8288,9 +5224,6 @@ errr init_d_info_txt(FILE *fp)
*/
static errr grab_one_race_flag(owner_type *ow_ptr, int state, cptr what)
{
- /* int i;
- cptr s; */
-
/* Scan race flags */
unknown_shut_up = TRUE;
if (!grab_one_race_allow_flag(ow_ptr->races[state], what))
@@ -8317,19 +5250,15 @@ static errr grab_one_race_flag(owner_type *ow_ptr, int state, cptr what)
/*
* Grab one store flag from a textual string
*/
-static errr grab_one_store_flag(store_info_type *st_ptr, cptr what)
+static errr grab_one_store_flag(store_flag_set *flags, cptr what)
{
- int i;
-
- /* Scan store flags */
- for (i = 0; i < 32; i++)
- {
- if (streq(what, st_info_flags1[i]))
- {
- st_ptr->flags1 |= (1L << i);
- return (0);
- }
- }
+#define STF(tier, index, name) \
+ if (streq(what, #name)) { \
+ *flags |= BOOST_PP_CAT(STF_,name); \
+ return 0; \
+ }
+#include "store_flag_list.hpp"
+#undef STF
/* Oops */
msg_format("Unknown store flag '%s'.", what);
@@ -8343,9 +5272,9 @@ static errr grab_one_store_flag(store_info_type *st_ptr, cptr what)
*/
errr init_st_info_txt(FILE *fp)
{
- int i = 0, item_idx = 0;
+ auto &st_info = game->edit_data.st_info;
+
char buf[1024];
- char *s, *t;
/* Current entry */
store_info_type *st_ptr = NULL;
@@ -8373,7 +5302,7 @@ errr init_st_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -8385,26 +5314,20 @@ errr init_st_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_st_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- st_ptr = &st_info[i];
+ st_ptr = &expand_to_fit_index(st_info, i);
+ assert(st_ptr->name.empty());
/* Copy name */
- assert(!st_ptr->name);
- st_ptr->name = my_strdup(s);
-
- /* We are ready for a new set of objects */
- item_idx = 0;
+ st_ptr->name = s;
/* Next... */
continue;
@@ -8417,7 +5340,7 @@ errr init_st_info_txt(FILE *fp)
if (buf[0] == 'I')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -8428,14 +5351,11 @@ errr init_st_info_txt(FILE *fp)
/* Paranoia -- require a name */
if (!*s) return (1);
- /* Get the index */
- st_ptr->table[item_idx][1] = atoi(buf + 2);
-
- /* Append chars to the name */
- st_ptr->table[item_idx++][0] = test_item_name(s);
-
- st_ptr->table_num = item_idx;
- assert(st_ptr->table_num <= STORE_CHOICES);
+ /* Add to items array */
+ store_item item;
+ item.chance = atoi(buf + 2);
+ item.kind = test_item_name(s);
+ st_ptr->items.emplace_back(item);
/* Next... */
continue;
@@ -8450,12 +5370,13 @@ errr init_st_info_txt(FILE *fp)
if (3 != sscanf(buf + 2, "%d:%d:%d",
&rar1, &tv1, &sv1)) return (1);
- /* Get the index */
- st_ptr->table[item_idx][1] = rar1;
- /* Hack -- 256 as a sval means all possible items */
- st_ptr->table[item_idx++][0] = (sv1 < 256) ? lookup_kind(tv1, sv1) : tv1 + 10000;
-
- st_ptr->table_num = item_idx;
+ /* Add to the items array */
+ store_item item;
+ item.chance = rar1;
+ item.kind = (sv1 < 256)
+ ? lookup_kind(tv1, sv1)
+ : tv1 + 10000; /* An SVAL of 256 means all possible items. */
+ st_ptr->items.emplace_back(item);
/* Next... */
continue;
@@ -8495,12 +5416,18 @@ errr init_st_info_txt(FILE *fp)
&a1, &a2, &a3, &a4, &a5, &a6)) return (1);
/* Save the values */
- st_ptr->actions[0] = a1;
- st_ptr->actions[1] = a2;
- st_ptr->actions[2] = a3;
- st_ptr->actions[3] = a4;
- st_ptr->actions[4] = a5;
- st_ptr->actions[5] = a6;
+ st_ptr->actions.push_back(a1);
+ st_ptr->actions.push_back(a2);
+ st_ptr->actions.push_back(a3);
+ st_ptr->actions.push_back(a4);
+ st_ptr->actions.push_back(a5);
+ st_ptr->actions.push_back(a6);
+
+ /* Remove zero entries since they have no effect */
+ st_ptr->actions.erase(
+ std::remove(st_ptr->actions.begin(), st_ptr->actions.end(), 0),
+ st_ptr->actions.end()
+ );
/* Next... */
continue;
@@ -8509,24 +5436,9 @@ errr init_st_info_txt(FILE *fp)
/* Process 'F' for "store Flags" (multiple lines) */
if (buf[0] == 'F')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
+ if (0 != grab_one_store_flag(&st_ptr->flags, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_store_flag(st_ptr, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -8540,13 +5452,23 @@ errr init_st_info_txt(FILE *fp)
/* Scan for the values */
if (4 != sscanf(buf + 2, "%d:%d:%d:%d",
- &a1, &a2, &a3, &a4)) return (1);
+ &a1, &a2, &a3, &a4))
+ {
+ return 1;
+ }
+
+ /* Get a reference to the owners */
+ auto owners = &st_ptr->owners;
/* Save the values */
- st_ptr->owners[0] = a1;
- st_ptr->owners[1] = a2;
- st_ptr->owners[2] = a3;
- st_ptr->owners[3] = a4;
+ owners->push_back(a1);
+ owners->push_back(a2);
+ owners->push_back(a3);
+ owners->push_back(a4);
+
+ /* Sort and remove duplicates */
+ std::sort(owners->begin(), owners->end());
+ owners->erase(std::unique(owners->begin(), owners->end()), owners->end());
/* Next... */
continue;
@@ -8582,9 +5504,9 @@ errr init_st_info_txt(FILE *fp)
*/
errr init_ba_info_txt(FILE *fp)
{
- int i = 0;
+ auto &ba_info = game->edit_data.ba_info;
+
char buf[1024];
- char *s;
/* Current entry */
store_action_type *ba_ptr = NULL;
@@ -8612,7 +5534,7 @@ errr init_ba_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -8624,23 +5546,19 @@ errr init_ba_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_ba_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- ba_ptr = &ba_info[i];
+ ba_ptr = &expand_to_fit_index(ba_info, i);
/* Copy name */
- assert(!ba_ptr->name);
- ba_ptr->name = my_strdup(s);
+ ba_ptr->name = s;
/* Next... */
continue;
@@ -8701,9 +5619,9 @@ errr init_ba_info_txt(FILE *fp)
*/
errr init_ow_info_txt(FILE *fp)
{
- int i;
+ auto &ow_info = game->edit_data.ow_info;
+
char buf[1024];
- char *s, *t;
/* Current entry */
owner_type *ow_ptr = NULL;
@@ -8730,7 +5648,7 @@ errr init_ow_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -8742,23 +5660,19 @@ errr init_ow_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_ow_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- ow_ptr = &ow_info[i];
+ ow_ptr = &expand_to_fit_index(ow_info, i);
/* Copy name */
- assert(!ow_ptr->name);
- ow_ptr->name = my_strdup(s);
+ ow_ptr->name = s;
/* Next... */
continue;
@@ -8806,24 +5720,9 @@ errr init_ow_info_txt(FILE *fp)
/* Process 'L' for "Liked races/classes" (multiple lines) */
if (buf[0] == 'L')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
+ if (0 != grab_one_race_flag(ow_ptr, STORE_LIKED, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_race_flag(ow_ptr, STORE_LIKED, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -8832,24 +5731,9 @@ errr init_ow_info_txt(FILE *fp)
/* Process 'H' for "Hated races/classes" (multiple lines) */
if (buf[0] == 'H')
{
- /* Parse every entry */
- for (s = buf + 2; *s; )
+ if (0 != grab_one_race_flag(ow_ptr, STORE_HATED, buf + 2))
{
- /* Find the end of this entry */
- for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */;
-
- /* Nuke and skip any dividers */
- if (*t)
- {
- *t++ = '\0';
- while (*t == ' ' || *t == '|') t++;
- }
-
- /* Parse this entry */
- if (0 != grab_one_race_flag(ow_ptr, STORE_HATED, s)) return (5);
-
- /* Start the next entry */
- s = t;
+ return (5);
}
/* Next... */
@@ -8869,9 +5753,9 @@ errr init_ow_info_txt(FILE *fp)
*/
errr init_wf_info_txt(FILE *fp)
{
- int i;
+ auto &wf_info = game->edit_data.wf_info;
+
char buf[1024];
- char *s;
/* Current entry */
wilderness_type_info *wf_ptr = NULL;
@@ -8898,7 +5782,7 @@ errr init_wf_info_txt(FILE *fp)
if (buf[0] == 'N')
{
/* Find the colon before the name */
- s = strchr(buf + 2, ':');
+ char *s = strchr(buf + 2, ':');
/* Verify that colon */
if (!s) return (1);
@@ -8910,19 +5794,16 @@ errr init_wf_info_txt(FILE *fp)
if (!*s) return (1);
/* Get the index */
- i = atoi(buf + 2);
+ int i = atoi(buf + 2);
/* Verify information */
if (i < error_idx) return (4);
- /* Verify information */
- if (i >= max_wf_idx) return (2);
-
/* Save the index */
error_idx = i;
/* Point at the "info" */
- wf_ptr = &wf_info[i];
+ wf_ptr = &expand_to_fit_index(wf_info, i);
/* Copy the name */
assert(!wf_ptr->name);
@@ -8939,7 +5820,7 @@ errr init_wf_info_txt(FILE *fp)
if (buf[0] == 'D')
{
/* Acquire the text */
- s = buf + 2;
+ char *s = buf + 2;
/* Copy description */
assert(!wf_ptr->text);
@@ -9014,7 +5895,6 @@ errr init_wf_info_txt(FILE *fp)
#define RANDOM_OBJECT 0x04
#define RANDOM_EGO 0x08
#define RANDOM_ARTIFACT 0x10
-#define RANDOM_TRAP 0x20
typedef struct dungeon_grid dungeon_grid;
@@ -9026,7 +5906,6 @@ struct dungeon_grid
int object; /* Object */
int ego; /* Ego-Item */
int artifact; /* Artifact */
- int trap; /* Trap */
int cave_info; /* Flags for CAVE_MARK, CAVE_GLOW, CAVE_ICKY, CAVE_ROOM */
int special; /* Reserved for special terrain info */
int random; /* Number of the random effect */
@@ -9045,6 +5924,10 @@ static dungeon_grid letter[255];
*/
static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalstart, int ymax, int xmax, bool_ full)
{
+ auto &wilderness = game->wilderness;
+ auto &wf_info = game->edit_data.wf_info;
+ auto &a_info = game->edit_data.a_info;
+
int i;
char *zz[33];
@@ -9083,12 +5966,12 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
return (0);
}
- /* Process "F:<letter>:<terrain>:<cave_info>:<monster>:<object>:<ego>:<artifact>:<trap>:<special>:<mimic>:<mflag>" -- info for dungeon grid */
+ /* Process "F:<letter>:<terrain>:<cave_info>:<monster>:<object>:<ego>:<artifact>:<special>:<mimic>:<mflag>" -- info for dungeon grid */
if (buf[0] == 'F')
{
int num;
- if ((num = tokenize(buf + 2, 11, zz, ':', '/')) > 1)
+ if ((num = tokenize(buf + 2, 10, zz, ':', '/')) > 1)
{
int index = zz[0][0];
@@ -9098,7 +5981,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
letter[index].object = 0;
letter[index].ego = 0;
letter[index].artifact = 0;
- letter[index].trap = 0;
letter[index].cave_info = 0;
letter[index].special = 0;
letter[index].random = 0;
@@ -9204,34 +6086,17 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
if (num > 7)
{
- if (zz[7][0] == '*')
- {
- letter[index].random |= RANDOM_TRAP;
-
- if (zz[7][1])
- {
- zz[7]++;
- letter[index].trap = atoi(zz[7]);
- }
- }
- else
- letter[index].trap = atoi(zz[7]);
- }
-
- if (num > 8)
- {
+ char *field = zz[7];
/* Quests can be defined by name only */
- if (zz[8][0] == '"')
+ if (field[0] == '"')
{
- int i;
-
/* Hunt & shoot the ending " */
- i = strlen(zz[8]) - 1;
- if (zz[8][i] == '"') zz[8][i] = '\0';
+ int i = strlen(field) - 1;
+ if (field[i] == '"') field[i] = '\0';
letter[index].special = 0;
for (i = 0; i < MAX_Q_IDX; i++)
{
- if (!strcmp(&zz[8][1], quest[i].name))
+ if (!strcmp(&field[1], quest[i].name))
{
letter[index].special = i;
break;
@@ -9239,17 +6104,17 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
}
}
else
- letter[index].special = atoi(zz[8]);
+ letter[index].special = atoi(field);
}
- if (num > 9)
+ if (num > 8)
{
- letter[index].mimic = atoi(zz[9]);
+ letter[index].mimic = atoi(zz[8]);
}
- if (num > 10)
+ if (num > 9)
{
- letter[index].mflag = atoi(zz[10]);
+ letter[index].mflag = atoi(zz[9]);
}
return (0);
@@ -9275,7 +6140,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
}
/* Parse this entry */
- if (0 != grab_one_dungeon_flag(&dungeon_flags1, &dungeon_flags2, s)) return 1;
+ if (0 != grab_one_dungeon_flag(&dungeon_flags, s)) return 1;
/* Start the next entry */
s = t;
@@ -9351,28 +6216,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
if (m_idx) m_list[m_idx].mflag |= letter[idx].mflag;
/* Object (and possible trap) */
- if ((random & RANDOM_OBJECT) && (random & RANDOM_TRAP))
- {
- int level = object_level;
-
- object_level = quest[p_ptr->inside_quest].level;
-
- /*
- * Random trap and random treasure defined
- * 25% chance for trap and 75% chance for object
- */
- if (rand_int(100) < 75)
- {
- place_object(y, x, FALSE, FALSE, OBJ_FOUND_SPECIAL);
- }
- else
- {
- place_trap(y, x);
- }
-
- object_level = level;
- }
- else if (random & RANDOM_OBJECT)
+ if (random & RANDOM_OBJECT)
{
/* Create an out of deep object */
if (object_index)
@@ -9402,11 +6246,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
place_object(y, x, TRUE, TRUE, OBJ_FOUND_SPECIAL);
}
}
- /* Random trap */
- else if (random & RANDOM_TRAP)
- {
- place_trap(y, x);
- }
else if (object_index)
{
/* Get local object */
@@ -9432,11 +6271,10 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
{
int I_kind = 0;
- artifact_type *a_ptr = &a_info[artifact_index];
-
- object_type forge;
+ auto a_ptr = &a_info[artifact_index];
/* Get local object */
+ object_type forge;
object_type *q_ptr = &forge;
a_allow_special[artifact_index] = TRUE;
@@ -9475,10 +6313,11 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
Let's just HACK around one observed bug: Shadow Cloak
of Luthien [Globe of Light] */
{
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f5 & TR5_SPELL_CONTAIN)
+ auto const flags = object_flags(q_ptr);
+ if (flags & TR_SPELL_CONTAIN)
+ {
q_ptr->pval2 = -1;
+ }
}
/* Drop the artifact */
@@ -9518,29 +6357,32 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
/* Layout of the wilderness */
if (buf[2] == 'D')
{
- int x;
- char i;
-
/* Acquire the text */
char *s = buf + 4;
int y = *yval;
- for (x = 0; x < max_wild_x; x++)
+ for (std::size_t x = 0; x < wilderness.width(); x++)
{
- if (1 != sscanf(s + x, "%c", &i)) return (1);
- wild_map[y][x].feat = wildc2i[(int)i];
+ char i;
+ if (1 != sscanf(s + x, "%c", &i))
+ {
+ return (1);
+ }
+
+ auto const wi = wildc2i[(int)i];
+
+ wilderness(x, y).feat = wi;
/*
* If this is a town/dungeon entrance, note
* its coordinates. (Have to check for
* duplicate Morias...)
*/
- if (wf_info[wildc2i[(int)i]].entrance &&
- wf_info[wildc2i[(int)i]].wild_x == 0)
+ if (wf_info[wi].entrance && wf_info[wi].wild_x == 0)
{
- wf_info[wildc2i[(int)i]].wild_x = x;
- wf_info[wildc2i[(int)i]].wild_y = y;
+ wf_info[wi].wild_x = x;
+ wf_info[wi].wild_y = y;
}
}
@@ -9592,7 +6434,9 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
{
if (tokenize(buf + 4, 3, zz, ':', '/') == 3)
{
- wild_map[atoi(zz[1])][atoi(zz[2])].entrance = 1000 + atoi(zz[0]);
+ int y = atoi(zz[1]);
+ int x = atoi(zz[2]);
+ wilderness(x, y).entrance = 1000 + atoi(zz[0]);
}
else
{
@@ -9645,156 +6489,28 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
max_real_towns = atoi(zz[1]);
}
- /* Maximum r_idx */
- else if (zz[0][0] == 'R')
- {
- max_r_idx = atoi(zz[1]);
- }
-
- /* Maximum re_idx */
- else if (zz[0][0] == 'r')
- {
- max_re_idx = atoi(zz[1]);
- }
-
- /* Maximum s_idx */
- else if (zz[0][0] == 'k')
- {
- max_s_idx = atoi(zz[1]);
- if (max_s_idx > MAX_SKILLS) return (1);
- }
-
- /* Maximum ab_idx */
- else if (zz[0][0] == 'b')
- {
- max_ab_idx = atoi(zz[1]);
- }
-
- /* Maximum k_idx */
- else if (zz[0][0] == 'K')
- {
- max_k_idx = atoi(zz[1]);
- }
-
- /* Maximum v_idx */
- else if (zz[0][0] == 'V')
- {
- max_v_idx = atoi(zz[1]);
- }
-
- /* Maximum f_idx */
- else if (zz[0][0] == 'F')
- {
- max_f_idx = atoi(zz[1]);
- }
-
- /* Maximum a_idx */
- else if (zz[0][0] == 'A')
- {
- max_a_idx = atoi(zz[1]);
- }
-
- /* Maximum e_idx */
- else if (zz[0][0] == 'E')
- {
- max_e_idx = atoi(zz[1]);
- }
-
- /* Maximum ra_idx */
- else if (zz[0][0] == 'Z')
- {
- max_ra_idx = atoi(zz[1]);
- }
-
/* Maximum o_idx */
else if (zz[0][0] == 'O')
{
max_o_idx = atoi(zz[1]);
}
- /* Maximum player types */
- else if (zz[0][0] == 'P')
- {
- if (zz[1][0] == 'R')
- {
- max_rp_idx = atoi(zz[2]);
- }
- else if (zz[1][0] == 'S')
- {
- max_rmp_idx = atoi(zz[2]);
- }
- else if (zz[1][0] == 'C')
- {
- max_c_idx = atoi(zz[2]);
- }
- else if (zz[1][0] == 'M')
- {
- max_mc_idx = atoi(zz[2]);
- }
- else if (zz[1][0] == 'H')
- {
- max_bg_idx = atoi(zz[2]);
- }
- }
-
/* Maximum m_idx */
else if (zz[0][0] == 'M')
{
max_m_idx = atoi(zz[1]);
}
- /* Maximum tr_idx */
- else if (zz[0][0] == 'U')
- {
- max_t_idx = atoi(zz[1]);
- }
-
- /* Maximum wf_idx */
- else if (zz[0][0] == 'W')
- {
- max_wf_idx = atoi(zz[1]);
- }
-
- /* Maximum ba_idx */
- else if (zz[0][0] == 'B')
- {
- max_ba_idx = atoi(zz[1]);
- }
-
- /* Maximum st_idx */
- else if (zz[0][0] == 'S')
- {
- max_st_idx = atoi(zz[1]);
- }
-
- /* Maximum set_idx */
- else if (zz[0][0] == 's')
- {
- max_set_idx = atoi(zz[1]);
- }
-
- /* Maximum ow_idx */
- else if (zz[0][0] == 'N')
- {
- max_ow_idx = atoi(zz[1]);
- }
-
/* Maximum wilderness x size */
else if (zz[0][0] == 'X')
{
- max_wild_x = atoi(zz[1]);
+ wilderness.width(atoi(zz[1]));
}
/* Maximum wilderness y size */
else if (zz[0][0] == 'Y')
{
- max_wild_y = atoi(zz[1]);
- }
-
- /* Maximum d_idx */
- else if (zz[0][0] == 'D')
- {
- max_d_idx = atoi(zz[1]);
+ wilderness.height(atoi(zz[1]));
}
return (0);
@@ -9989,25 +6705,25 @@ static cptr process_dungeon_file_expr(char **sp, char *fp)
/* Race */
else if (streq(b + 1, "RACE"))
{
- v = rp_ptr->title;
+ v = rp_ptr->title.c_str(); // The string SHOULD be stable enough for this
}
/* Race Mod */
else if (streq(b + 1, "RACEMOD"))
{
- v = rmp_ptr->title;
+ v = rmp_ptr->title.c_str(); // The string SHOULD be stable enough for this
}
/* Class */
else if (streq(b + 1, "CLASS"))
{
- v = cp_ptr->title;
+ v = cp_ptr->title.c_str(); // The string SHOULD be stable enough for this
}
/* Player */
else if (streq(b + 1, "PLAYER"))
{
- v = player_base;
+ v = game->player_base.c_str(); // The string SHOULD be stable enough for this
}
/* Town */
@@ -10194,7 +6910,7 @@ errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, b
if (buf[0] == '%')
{
/* Process that file if allowed */
- (void)process_dungeon_file(buf + 2, yval, xval, ymax, xmax, FALSE, full);
+ process_dungeon_file(buf + 2, yval, xval, ymax, xmax, FALSE, full);
/* Continue */
continue;
diff --git a/src/init1.hpp b/src/init1.hpp
index 766e467d..1c417285 100644
--- a/src/init1.hpp
+++ b/src/init1.hpp
@@ -1,26 +1,27 @@
#pragma once
#include "h-basic.h"
+#include "dungeon_flag_set.hpp"
-extern int color_char_to_attr(char c);
+int color_char_to_attr(char c);
extern byte conv_color[16];
-extern errr init_player_info_txt(FILE *fp);
-extern errr init_ab_info_txt(FILE *fp);
-extern errr init_s_info_txt(FILE *fp);
-extern errr init_set_info_txt(FILE *fp);
-extern errr init_v_info_txt(FILE *fp);
-extern errr init_f_info_txt(FILE *fp);
-extern errr init_k_info_txt(FILE *fp);
-extern errr init_a_info_txt(FILE *fp);
-extern errr init_ra_info_txt(FILE *fp);
-extern errr init_e_info_txt(FILE *fp);
-extern errr init_r_info_txt(FILE *fp);
-extern errr init_re_info_txt(FILE *fp);
-extern errr init_d_info_txt(FILE *fp);
-extern errr init_t_info_txt(FILE *fp);
-extern errr init_ba_info_txt(FILE *fp);
-extern errr init_st_info_txt(FILE *fp);
-extern errr init_ow_info_txt(FILE *fp);
-extern errr init_wf_info_txt(FILE *fp);
-extern errr grab_one_dungeon_flag(u32b *flags1, u32b *flags2, cptr what);
-extern errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, bool_ init, bool_ full);
+errr init_player_info_txt(FILE *fp);
+errr init_ab_info_txt(FILE *fp);
+errr init_s_info_txt(FILE *fp);
+errr init_set_info_txt(FILE *fp);
+errr init_v_info_txt(FILE *fp);
+errr init_f_info_txt(FILE *fp);
+errr init_k_info_txt(FILE *fp);
+errr init_a_info_txt(FILE *fp);
+errr init_ra_info_txt(FILE *fp);
+errr init_e_info_txt(FILE *fp);
+errr init_r_info_txt(FILE *fp);
+errr init_re_info_txt(FILE *fp);
+errr init_d_info_txt(FILE *fp);
+errr init_t_info_txt(FILE *fp);
+errr init_ba_info_txt(FILE *fp);
+errr init_st_info_txt(FILE *fp);
+errr init_ow_info_txt(FILE *fp);
+errr init_wf_info_txt(FILE *fp);
+errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str);
+errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, bool_ init, bool_ full);
diff --git a/src/init2.cc b/src/init2.cc
index 338ebf10..894e4767 100644
--- a/src/init2.cc
+++ b/src/init2.cc
@@ -11,37 +11,40 @@
#include "ego_item_type.hpp"
#include "files.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "generate.hpp"
#include "gen_evol.hpp"
#include "gen_maze.hpp"
-#include "hist_type.hpp"
#include "hooks.hpp"
#include "init1.hpp"
#include "lua_bind.hpp"
#include "messages.hpp"
-#include "meta_class_type.hpp"
#include "modules.hpp"
#include "monster_ego.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
+#include "object_type.hpp"
#include "owner_type.hpp"
#include "player_class.hpp"
#include "player_race.hpp"
#include "player_race_mod.hpp"
-#include "quark.hpp"
+#include "q_library.hpp"
#include "randart.hpp"
#include "randart_part_type.hpp"
-#include "script.h"
#include "set_type.hpp"
#include "skill_type.hpp"
#include "spells3.hpp"
+#include "spells4.hpp"
+#include "spells5.hpp"
+#include "spells6.hpp"
#include "squeltch.hpp"
#include "store_action_type.hpp"
#include "store_info_type.hpp"
#include "store_type.hpp"
#include "tables.hpp"
-#include "trap_type.hpp"
#include "tome/make_array.hpp"
#include "town_type.hpp"
#include "util.hpp"
@@ -228,41 +231,6 @@ void init_file_paths(char *path)
/*
- * Initialize and verify the file paths, and the score file.
- *
- * Use the ANGBAND_PATH environment var if possible, else use
- * DEFAULT_PATH, and in either case, branch off appropriately.
- *
- * First, we'll look for the ANGBAND_PATH environment variable,
- * and then look for the files in there. If that doesn't work,
- * we'll try the DEFAULT_PATH constant. So be sure that one of
- * these two things works...
- *
- * We must ensure that the path ends with "PATH_SEP" if needed,
- * since the "init_file_paths()" function will simply append the
- * relevant "sub-directory names" to the given path.
- */
-void init_file_paths_with_env()
-{
- char path[1024];
-
- cptr tail;
-
- /* Get the environment variable */
- tail = getenv("TOME_PATH");
-
- /* Use the angband_path, or a default */
- strcpy(path, tail ? tail : DEFAULT_PATH);
-
- /* Hack -- Add a path separator (only if needed) */
- if (!suffix(path, PATH_SEP)) strcat(path, PATH_SEP);
-
- /* Initialize */
- init_file_paths(path);
-}
-
-
-/*
* Hack -- help give useful error messages
*/
s16b error_idx;
@@ -306,11 +274,6 @@ namespace {
static constexpr char const *name = "f_info.txt";
- static void allocate()
- {
- f_info = make_array<feature_type>(max_f_idx);
- }
-
static errr parse(FILE *fp)
{
return init_f_info_txt(fp);
@@ -322,11 +285,6 @@ namespace {
static constexpr char const *name = "k_info.txt";
- static void allocate()
- {
- k_info = make_array<object_kind>(max_k_idx);
- }
-
static errr parse(FILE *fp)
{
return init_k_info_txt(fp);
@@ -338,11 +296,6 @@ namespace {
static constexpr char const *name = "set_info.txt";
- static void allocate()
- {
- set_info = make_array<set_type>(max_set_idx);
- }
-
static errr parse(FILE *fp)
{
return init_set_info_txt(fp);
@@ -354,11 +307,6 @@ namespace {
static constexpr char const *name = "a_info.txt";
- static void allocate()
- {
- a_info = make_array<artifact_type>(max_a_idx);
- }
-
static errr parse(FILE *fp)
{
return init_a_info_txt(fp);
@@ -370,11 +318,6 @@ namespace {
static constexpr char const *name = "s_info.txt";
- static void allocate()
- {
- s_info = make_array<skill_type>(max_s_idx);
- }
-
static errr parse(FILE *fp)
{
return init_s_info_txt(fp);
@@ -386,11 +329,6 @@ namespace {
static constexpr char const *name = "ab_info.txt";
- static void allocate()
- {
- ab_info = make_array<ability_type>(max_ab_idx);
- }
-
static errr parse(FILE *fp)
{
return init_ab_info_txt(fp);
@@ -402,11 +340,6 @@ namespace {
static constexpr char const *name = "e_info.txt";
- static void allocate()
- {
- e_info = make_array<ego_item_type>(max_e_idx);
- }
-
static errr parse(FILE *fp)
{
return init_e_info_txt(fp);
@@ -418,11 +351,6 @@ namespace {
static constexpr char const *name = "ra_info.txt";
- static void allocate()
- {
- ra_info = make_array<randart_part_type>(max_ra_idx);
- }
-
static errr parse(FILE *fp)
{
return init_ra_info_txt(fp);
@@ -434,11 +362,6 @@ namespace {
static constexpr char const *name = "r_info.txt";
- static void allocate()
- {
- r_info = make_array<monster_race>(max_r_idx);
- }
-
static errr parse(FILE *fp)
{
return init_r_info_txt(fp);
@@ -450,11 +373,6 @@ namespace {
static constexpr char const *name = "re_info.txt";
- static void allocate()
- {
- re_info = make_array<monster_ego>(max_re_idx);
- }
-
static errr parse(FILE *fp)
{
return init_re_info_txt(fp);
@@ -466,11 +384,6 @@ namespace {
static constexpr char const *name = "d_info.txt";
- static void allocate()
- {
- d_info = make_array<dungeon_info_type>(max_d_idx);
- }
-
static errr parse(FILE *fp)
{
return init_d_info_txt(fp);
@@ -482,11 +395,6 @@ namespace {
static constexpr char const *name = "st_info.txt";
- static void allocate()
- {
- st_info = make_array<store_info_type>(max_st_idx);
- }
-
static errr parse(FILE *fp)
{
return init_st_info_txt(fp);
@@ -498,11 +406,6 @@ namespace {
static constexpr char const *name = "ow_info.txt";
- static void allocate()
- {
- ow_info = make_array<owner_type>(max_ow_idx);
- }
-
static errr parse(FILE *fp)
{
return init_ow_info_txt(fp);
@@ -514,11 +417,6 @@ namespace {
static constexpr char const *name = "ba_info.txt";
- static void allocate()
- {
- ba_info = make_array<store_action_type>(max_ba_idx);
- }
-
static errr parse(FILE *fp)
{
return init_ba_info_txt(fp);
@@ -530,11 +428,6 @@ namespace {
static constexpr char const *name = "wf_info.txt";
- static void allocate()
- {
- wf_info = make_array<wilderness_type_info>(max_wf_idx);
- }
-
static errr parse(FILE *fp)
{
return init_wf_info_txt(fp);
@@ -542,31 +435,10 @@ namespace {
};
- struct tr_info_traits {
-
- static constexpr char const *name = "tr_info.txt";
-
- static void allocate()
- {
- t_info = make_array<trap_type>(max_t_idx);
- }
-
- static errr parse(FILE *fp)
- {
- return init_t_info_txt(fp);
- }
-
- };
-
struct v_info_traits {
static constexpr char const *name = "v_info.txt";
- static void allocate()
- {
- v_info = make_array<vault_type>(max_v_idx);
- }
-
static errr parse(FILE *fp)
{
return init_v_info_txt(fp);
@@ -578,19 +450,6 @@ namespace {
static constexpr char const *name = "p_info.txt";
- static void allocate()
- {
- race_info = make_array<player_race>(max_rp_idx);
- race_mod_info = make_array<player_race_mod>(max_rmp_idx);
- class_info = make_array<player_class>(max_c_idx);
- bg = make_array<hist_type>(max_bg_idx);
- meta_class_info = make_array<meta_class_type>(max_mc_idx);
- for (std::size_t i = 0; i < max_mc_idx; i++)
- {
- meta_class_info[i].classes = make_array<s16b>(max_c_idx);
- }
- }
-
static errr parse(FILE *fp)
{
return init_player_info_txt(fp);
@@ -602,9 +461,6 @@ namespace {
template<typename T> static errr init_x_info() {
- /* Allocate the data array */
- T::allocate();
-
/* Build the filename */
boost::filesystem::path path(ANGBAND_DIR_EDIT);
path /= T::name;
@@ -663,13 +519,16 @@ static void init_basic()
/* Extended trigger macros */
cli_info = make_array<cli_comm>(CLI_MAX);
+
+ /* Options */
+ options = new struct options();
}
/*
* Initialise misc. values
*/
-static errr init_misc(void)
+static errr init_misc()
{
int xstart = 0;
int ystart = 0;
@@ -677,12 +536,6 @@ static errr init_misc(void)
/*** Prepare the various "bizarre" arrays ***/
- /* Initialize quark subsystem */
- quark_init();
-
- /* Initialize messages subsystem */
- message_init();
-
/* Initialise the values */
process_dungeon_file("misc.txt", &ystart, &xstart, 0, 0, TRUE, FALSE);
@@ -705,26 +558,24 @@ static errr init_misc(void)
/*
* Initialise town array
*/
-static errr init_towns(void)
+static errr init_towns()
{
- int i = 0, j = 0;
+ auto const &st_info = game->edit_data.st_info;
- /*** Prepare the Towns ***/
+ town_info = new town_type[max_towns];
- /* Allocate the towns */
- town_info = make_array<town_type>(max_towns);
-
- for (i = 1; i < max_towns; i++)
+ for (std::size_t i = 1; i < max_towns; i++)
{
- if (i <= max_real_towns) town_info[i].flags |= (TOWN_REAL);
-
- /* Allocate the stores */
- town_info[i].store = make_array<store_type>(max_st_idx);
+ if (i <= max_real_towns)
+ {
+ town_info[i].flags |= TOWN_REAL;
+ }
/* Fill in each store */
- for (j = 0; j < max_st_idx; j++)
+ for (std::size_t j = 0; j < st_info.size(); j++)
{
- /* Access the store */
+ /* Create the store */
+ town_info[i].store.emplace_back(store_type());
store_type *st_ptr = &town_info[i].store[j];
/* Know who we are */
@@ -734,74 +585,59 @@ static errr init_towns(void)
st_ptr->stock_size = 0;
}
}
+
return 0;
}
void create_stores_stock(int t)
{
- int j;
+ auto const &st_info = game->edit_data.st_info;
+
town_type *t_ptr = &town_info[t];
if (t_ptr->stocked) return;
- for (j = 0; j < max_st_idx; j++)
+ for (std::size_t j = 0; j < st_info.size(); j++)
{
store_type *st_ptr = &t_ptr->store[j];
/* Assume full stock */
st_ptr->stock_size = st_info[j].max_obj;
- /* Allocate the stock */
- st_ptr->stock = make_array<object_type>(st_ptr->stock_size);
- }
- t_ptr->stocked = TRUE;
-}
-
-/*
- * Initialise wilderness map array
- */
-static errr init_wilderness(void)
-{
- int i;
-
- /* Allocate the wilderness (two-dimension array) */
- wild_map = make_array<wilderness_map *>(max_wild_y);
-
- /* Init the other pointers */
- for (i = 0; i < max_wild_y; i++)
- {
- wild_map[i] = make_array<wilderness_map>(max_wild_x);
+ /* Reserve space for stock */
+ st_ptr->stock.reserve(st_ptr->stock_size);
}
- /* No encounter right now */
- generate_encounter = FALSE;
-
- return 0;
+ t_ptr->stocked = TRUE;
}
/*
* Initialise some other arrays
*/
-static errr init_other(void)
+static errr init_other()
{
- int i, n;
+ auto const &d_info = game->edit_data.d_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
+ auto &level_markers = game->level_markers;
/*** Prepare the "dungeon" information ***/
/* Allocate and Wipe the special gene flags */
- m_allow_special = make_array<bool_>(max_r_idx);
- k_allow_special = make_array<bool_>(max_k_idx);
- a_allow_special = make_array<bool_>(max_a_idx);
+ m_allow_special = make_array<bool_>(r_info.size());
+ k_allow_special = make_array<bool_>(k_info.size());
+ a_allow_special = make_array<bool_>(a_info.size());
/*** Prepare "vinfo" array ***/
/* Used by "update_view()" */
- (void)vinfo_init();
+ vinfo_init();
/* Allocate and Wipe the object list */
- o_list = make_array<object_type>(max_o_idx);
+ o_list = new object_type[max_o_idx];
/* Allocate and Wipe the monster list */
m_list = new monster_type[max_m_idx];
@@ -810,76 +646,24 @@ static errr init_other(void)
km_list = new monster_type[max_m_idx];
/* Allocate and Wipe the max dungeon level */
- max_dlv = make_array<s16b>(max_d_idx);
+ max_dlv = make_array<s16b>(d_info.size());
- /* Allocate and Wipe the special levels */
- for (i = 0; i < MAX_DUNGEON_DEPTH; i++)
- {
- special_lvl[i] = make_array<bool_>(max_d_idx);
- }
+ /* Allocate level markers */
+ level_markers.resize(boost::extents[MAX_DUNGEON_DEPTH][d_info.size()]);
/* Allocate and wipe each line of the cave */
cave = new cave_type *[MAX_HGT];
- for (i = 0; i < MAX_HGT; i++)
+ for (std::size_t i = 0; i < MAX_HGT; i++)
{
/* Allocate one row of the cave */
cave[i] = new cave_type[MAX_WID];
}
- /*** Pre-allocate the basic "auto-inscriptions" ***/
-
- /* The "basic" feelings */
- (void)quark_add("cursed");
- (void)quark_add("broken");
- (void)quark_add("average");
- (void)quark_add("good");
-
- /* The "extra" feelings */
- (void)quark_add("excellent");
- (void)quark_add("worthless");
- (void)quark_add("special");
- (void)quark_add("terrible");
-
- /* Some extra strings */
- (void)quark_add("uncursed");
- (void)quark_add("on sale");
-
-
- /*** Prepare the options ***/
-
- /* Scan the options */
- for (i = 0; option_info[i].o_desc; i++)
- {
- int os = option_info[i].o_page;
- int ob = option_info[i].o_bit;
-
- /* Set the "default" options */
- if (option_info[i].o_var)
- {
- /* Accept */
- option_mask[os] |= (1L << ob);
-
- /* Set */
- if (option_info[i].o_norm)
- {
- /* Set */
- option_flag[os] |= (1L << ob);
- }
-
- /* Clear */
- else
- {
- /* Clear */
- option_flag[os] &= ~(1L << ob);
- }
- }
- }
-
/* Analyze the windows */
- for (n = 0; n < 8; n++)
+ for (std::size_t n = 0; n < 8; n++)
{
/* Analyze the options */
- for (i = 0; i < 32; i++)
+ for (std::size_t i = 0; i < 32; i++)
{
/* Accept */
if (window_flag_desc[i])
@@ -901,7 +685,7 @@ static errr init_other(void)
/*** Pre-allocate space for the "format()" buffer ***/
/* Hack -- Just call the "format()" function */
- (void)format("%s (%s).", "Dark God <darkgod@t-o-m-e.net>", MAINTAINER);
+ format("%s (%s).", "Dark God <darkgod@t-o-m-e.net>", MAINTAINER);
/* Success */
return (0);
@@ -912,15 +696,11 @@ static errr init_other(void)
/*
* Initialise some other arrays
*/
-static errr init_alloc(void)
+static errr init_alloc()
{
- int i, j;
-
- object_kind *k_ptr;
-
- monster_race *r_ptr;
-
- alloc_entry *table;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto &alloc = game->alloc;
s16b num[MAX_DEPTH_MONSTER];
@@ -934,22 +714,20 @@ static errr init_alloc(void)
/* Clear the "num" array */
memset(num, 0, MAX_DEPTH_MONSTER * sizeof(s16b));
- /* Size of "alloc_kind_table" */
- alloc_kind_size = 0;
-
/* Scan the objects */
- for (i = 1; i < max_k_idx; i++)
+ std::size_t kind_size = 0;
+ for (auto const &k_ref: k_info)
{
- k_ptr = &k_info[i];
+ auto k_ptr = &k_ref;
/* Scan allocation pairs */
- for (j = 0; j < ALLOCATION_MAX; j++)
+ for (std::size_t j = 0; j < ALLOCATION_MAX; j++)
{
/* Count the "legal" entries */
if (k_ptr->chance[j])
{
/* Count the entries */
- alloc_kind_size++;
+ kind_size++;
/* Group by level */
num[k_ptr->locale[j]]++;
@@ -958,7 +736,7 @@ static errr init_alloc(void)
}
/* Collect the level indexes */
- for (i = 1; i < MAX_DEPTH_MONSTER; i++)
+ for (std::size_t i = 1; i < MAX_DEPTH_MONSTER; i++)
{
/* Group by level */
num[i] += num[i - 1];
@@ -971,18 +749,16 @@ static errr init_alloc(void)
/*** Initialise object allocation info ***/
/* Allocate the alloc_kind_table */
- alloc_kind_table = make_array<alloc_entry>(alloc_kind_size);
-
- /* Access the table entry */
- table = alloc_kind_table;
+ alloc.kind_table.clear();
+ alloc.kind_table.resize(kind_size);
/* Scan the objects */
- for (i = 1; i < max_k_idx; i++)
+ for (std::size_t i = 1; i < k_info.size(); i++)
{
- k_ptr = &k_info[i];
+ auto k_ptr = &k_info[i];
/* Scan allocation pairs */
- for (j = 0; j < ALLOCATION_MAX; j++)
+ for (std::size_t j = 0; j < ALLOCATION_MAX; j++)
{
/* Count the "legal" entries */
if (k_ptr->chance[j])
@@ -1002,11 +778,12 @@ static errr init_alloc(void)
z = y + aux[x];
/* Load the entry */
- table[z].index = i;
- table[z].level = x;
- table[z].prob1 = p;
- table[z].prob2 = p;
- table[z].prob3 = p;
+ auto &entry = alloc.kind_table[z];
+ entry.index = i;
+ entry.level = x;
+ entry.prob1 = p;
+ entry.prob2 = p;
+ entry.prob3 = p;
/* Another entry complete for this locale */
aux[x]++;
@@ -1023,20 +800,18 @@ static errr init_alloc(void)
/* Clear the "num" array */
memset(num, 0, MAX_DEPTH_MONSTER * sizeof(s16b));
- /* Size of "alloc_race_table" */
- alloc_race_size = 0;
-
/* Scan the monsters */
- for (i = 1; i < max_r_idx; i++)
+ std::size_t race_size = 0;
+ for (auto &r_ref: r_info)
{
/* Get the i'th race */
- r_ptr = &r_info[i];
+ auto r_ptr = &r_ref;
/* Legal monsters */
if (r_ptr->rarity)
{
/* Count the entries */
- alloc_race_size++;
+ race_size++;
/* Group by level */
num[r_ptr->level]++;
@@ -1044,7 +819,7 @@ static errr init_alloc(void)
}
/* Collect the level indexes */
- for (i = 1; i < MAX_DEPTH_MONSTER; i++)
+ for (std::size_t i = 1; i < MAX_DEPTH_MONSTER; i++)
{
/* Group by level */
num[i] += num[i - 1];
@@ -1057,16 +832,14 @@ static errr init_alloc(void)
/*** Initialise monster allocation info ***/
/* Allocate the alloc_race_table */
- alloc_race_table = make_array<alloc_entry>(alloc_race_size);
-
- /* Access the table entry */
- table = alloc_race_table;
+ alloc.race_table.clear();
+ alloc.race_table.resize(race_size);
/* Scan the monsters */
- for (i = 1; i < max_r_idx; i++)
+ for (std::size_t i = 1; i < r_info.size(); i++)
{
/* Get the i'th race */
- r_ptr = &r_info[i];
+ auto r_ptr = &r_info[i];
/* Count valid pairs */
if (r_ptr->rarity)
@@ -1086,11 +859,12 @@ static errr init_alloc(void)
z = y + aux[x];
/* Load the entry */
- table[z].index = i;
- table[z].level = x;
- table[z].prob1 = p;
- table[z].prob2 = p;
- table[z].prob3 = p;
+ auto &entry = alloc.race_table[z];
+ entry.index = i;
+ entry.level = x;
+ entry.prob1 = p;
+ entry.prob2 = p;
+ entry.prob3 = p;
/* Another entry complete for this locale */
aux[x]++;
@@ -1105,15 +879,21 @@ static errr init_alloc(void)
/* Init the sets in a_info */
static void init_sets_aux()
{
- int i, j;
+ auto const &set_info = game->edit_data.set_info;
+ auto &a_info = game->edit_data.a_info;
- for (i = 0; i < max_a_idx; i++)
- a_info[i].set = -1;
- for (i = 0; i < max_set_idx; i++)
+ for (auto &a_ref: a_info)
{
- for (j = 0; j < set_info[i].num; j++)
+ a_ref.set = -1;
+ }
+
+ for (std::size_t i = 0; i < set_info.size(); i++)
+ {
+ auto const &set_ref = set_info[i];
+
+ for (std::size_t j = 0; j < set_ref.num; j++)
{
- a_info[set_info[i].arts[j].a_idx].set = i;
+ a_info[set_ref.arts[j].a_idx].set = i;
}
}
}
@@ -1121,42 +901,43 @@ static void init_sets_aux()
/*
* Mark guardians and their artifacts with SPECIAL_GENE flag
*/
-static void init_guardians(void)
+static void init_guardians()
{
- int i;
+ auto const &d_info = game->edit_data.d_info;
+ auto &r_info = game->edit_data.r_info;
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
/* Scan dungeons */
- for (i = 0; i < max_d_idx; i++)
+ for (std::size_t i = 0; i < d_info.size(); i++)
{
- dungeon_info_type *d_ptr = &d_info[i];
+ auto d_ptr = &d_info[i];
/* Mark the guadian monster */
if (d_ptr->final_guardian)
{
- monster_race *r_ptr = &r_info[d_ptr->final_guardian];
+ auto r_ptr = &r_info[d_ptr->final_guardian];
- r_ptr->flags9 |= RF9_SPECIAL_GENE;
+ r_ptr->flags |= RF_SPECIAL_GENE;
/* Mark the final artifact */
if (d_ptr->final_artifact)
{
- artifact_type *a_ptr = &a_info[d_ptr->final_artifact];
-
- a_ptr->flags4 |= TR4_SPECIAL_GENE;
+ auto a_ptr = &a_info[d_ptr->final_artifact];
+ a_ptr->flags |= TR_SPECIAL_GENE;
}
/* Mark the final object */
if (d_ptr->final_object)
{
- object_kind *k_ptr = &k_info[d_ptr->final_object];
-
- k_ptr->flags4 |= TR4_SPECIAL_GENE;
+ auto k_ptr = &k_info[d_ptr->final_object];
+ k_ptr->flags |= TR_SPECIAL_GENE;
}
/* Give randart if there are no final artifacts */
if (!(d_ptr->final_artifact) && !(d_ptr->final_object))
{
- r_ptr->flags7 |= RF7_DROP_RANDART;
+ r_ptr->flags |= RF_DROP_RANDART;
}
}
}
@@ -1236,7 +1017,7 @@ static void init_angband_aux(cptr why)
* Note that the "graf-xxx.prf" file must be loaded separately,
* if needed, in the first (?) pass through "TERM_XTRA_REACT".
*/
-void init_angband(void)
+void init_angband()
{
int fd = -1;
@@ -1293,7 +1074,7 @@ void init_angband(void)
}
/* Close it */
- (void)fd_close(fd);
+ fd_close(fd);
/*** Display the "news" file ***/
@@ -1355,8 +1136,7 @@ void init_angband(void)
}
/* Close it */
- (void)fd_close(fd);
-
+ fd_close(fd);
/*** Initialise some arrays ***/
@@ -1365,8 +1145,20 @@ void init_angband(void)
if (init_misc()) quit("Cannot initialise misc. values");
/* Initialise some other arrays */
- note("[Initialising scripting... (script)]");
- init_lua_init();
+ {
+ note("[Initialising scripting... (script)]");
+
+ /* Initialize schooled spells */
+ schools_init();
+ school_spells_init();
+ init_school_books();
+
+ /* Post-spell creation initialization */
+ initialize_bookable_spells();
+
+ /* Finish up the corruptions */
+ init_corruptions();
+ }
/* Initialise skills info */
note("[Initialising arrays... (skills)]");
@@ -1434,18 +1226,10 @@ void init_angband(void)
note("[Initialising arrays... (wilderness features)]");
if (init_x_info<wf_info_traits>()) quit("Cannot initialise wilderness features");
- /* Initialise wilderness map array */
- note("[Initialising arrays... (wilderness map)]");
- if (init_wilderness()) quit("Cannot initialise wilderness map");
-
/* Initialise town array */
note("[Initialising arrays... (towns)]");
if (init_towns()) quit("Cannot initialise towns");
- /* Initialise trap info */
- note("[Initialising arrays... (traps)]");
- if (init_x_info<tr_info_traits>()) quit("Cannot initialise traps");
-
/* Initialise some other arrays */
note("[Initialising arrays... (other)]");
if (init_other()) quit("Cannot initialise other stuff");
diff --git a/src/init2.h b/src/init2.h
index 5697e4ef..bdc525bf 100644
--- a/src/init2.h
+++ b/src/init2.h
@@ -5,9 +5,8 @@
extern "C" {
#endif
-extern void init_file_paths(char *path);
-extern void init_file_paths_with_env();
-extern void init_angband(void);
+void init_file_paths(char *path);
+void init_angband();
#ifdef __cplusplus
} // extern "C"
diff --git a/src/init2.hpp b/src/init2.hpp
index 707a2706..de575e77 100644
--- a/src/init2.hpp
+++ b/src/init2.hpp
@@ -2,8 +2,8 @@
#include "h-basic.h"
-extern void init_corruptions();
-extern void create_stores_stock(int t);
-extern errr init_v_info(void);
+void init_corruptions();
+void create_stores_stock(int t);
+errr init_v_info();
extern s16b error_idx;
extern s16b error_line;
diff --git a/src/inscription_info_type.hpp b/src/inscription_info_type.hpp
index 6dbb67f1..4e1e4c32 100644
--- a/src/inscription_info_type.hpp
+++ b/src/inscription_info_type.hpp
@@ -9,6 +9,5 @@ struct inscription_info_type
{
char text[40]; /* The inscription itself */
byte when; /* When it is executed */
- bool_ know; /* Is the inscription know ? */
byte mana; /* Grid mana needed */
};
diff --git a/src/joke.cc b/src/joke.cc
index be272115..07149b3f 100644
--- a/src/joke.cc
+++ b/src/joke.cc
@@ -22,9 +22,9 @@ static void gen_joke_place_monster(int r_idx)
}
}
-bool_ gen_joke_monsters(void *data, void *in, void *out)
+bool gen_joke_monsters(void *data, void *in, void *out)
{
- if (joke_monsters)
+ if (options->joke_monsters)
{
if ((dungeon_type == 20) &&
(dun_level == 72))
diff --git a/src/joke.hpp b/src/joke.hpp
index 05ac1843..2721636e 100644
--- a/src/joke.hpp
+++ b/src/joke.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-extern bool_ gen_joke_monsters(void *data, void *in, void *out);
+bool gen_joke_monsters(void *data, void *in, void *out);
diff --git a/src/level_marker.cc b/src/level_marker.cc
new file mode 100644
index 00000000..ee1d8ebe
--- /dev/null
+++ b/src/level_marker.cc
@@ -0,0 +1,12 @@
+#include "level_marker.hpp"
+
+EnumStringMap<level_marker> const &level_marker_values()
+{
+ auto static instance = new EnumStringMap<level_marker> {
+ { level_marker::NORMAL, "normal" },
+ { level_marker::SPECIAL, "special" },
+ { level_marker::REGENERATE, "regenerate" }
+ };
+
+ return *instance;
+}
diff --git a/src/level_marker.hpp b/src/level_marker.hpp
new file mode 100644
index 00000000..07925b70
--- /dev/null
+++ b/src/level_marker.hpp
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <tome/enum_string_map.hpp>
+
+/**
+ * Markers for 'special' levels.
+ */
+enum class level_marker {
+ NORMAL,
+ SPECIAL,
+ REGENERATE
+};
+
+/**
+ * Is the level "normal"?
+ */
+inline bool is_normal_level(level_marker m)
+{
+ return m == level_marker::NORMAL;
+}
+
+/**
+ * Bidrectional map between enum and strings.
+ */
+EnumStringMap<level_marker> const &level_marker_values();
diff --git a/src/levels.cc b/src/levels.cc
index ac3aa3d3..2a1bb3ab 100644
--- a/src/levels.cc
+++ b/src/levels.cc
@@ -9,6 +9,7 @@
#include "levels.hpp"
#include "dungeon_info_type.hpp"
+#include "game.hpp"
#include "init1.hpp"
#include "util.hpp"
#include "util.h"
@@ -78,6 +79,8 @@ static bool_ get_command(const char *file, char comm, char *param)
*/
int get_branch()
{
+ auto const &d_info = game->edit_data.d_info;
+
char file[20], buf[5];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
@@ -95,6 +98,8 @@ int get_branch()
*/
int get_fbranch()
{
+ auto const &d_info = game->edit_data.d_info;
+
char file[20], buf[5];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
@@ -112,6 +117,8 @@ int get_fbranch()
*/
int get_flevel()
{
+ auto const &d_info = game->edit_data.d_info;
+
char file[20], buf[5];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
@@ -129,6 +136,8 @@ int get_flevel()
*/
bool_ get_dungeon_save(char *buf)
{
+ auto const &d_info = game->edit_data.d_info;
+
char file[20];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
@@ -144,8 +153,9 @@ bool_ get_dungeon_save(char *buf)
*/
bool_ get_dungeon_generator(char *buf)
{
- char file[20];
+ auto const &d_info = game->edit_data.d_info;
+ char file[20];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
/* Get and return the level */
@@ -159,8 +169,9 @@ bool_ get_dungeon_generator(char *buf)
*/
bool_ get_dungeon_special(char *buf)
{
- char file[20];
+ auto const &d_info = game->edit_data.d_info;
+ char file[20];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
/* Get and return the level */
@@ -174,8 +185,9 @@ bool_ get_dungeon_special(char *buf)
*/
bool_ get_dungeon_name(char *buf)
{
- char file[20];
+ auto const &d_info = game->edit_data.d_info;
+ char file[20];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
/* Get and return the level */
@@ -189,6 +201,8 @@ bool_ get_dungeon_name(char *buf)
*/
void get_level_flags()
{
+ auto const &d_info = game->edit_data.d_info;
+
char file[20];
char buf[1024], *s, *t;
@@ -213,7 +227,7 @@ void get_level_flags()
}
/* Parse this entry */
- if (0 != grab_one_dungeon_flag(&dungeon_flags1, &dungeon_flags2, s)) return;
+ if (0 != grab_one_dungeon_flag(&dungeon_flags, s)) return;
/* Start the next entry */
s = t;
@@ -226,8 +240,9 @@ void get_level_flags()
*/
bool_ get_level_desc(char *buf)
{
- char file[20];
+ auto const &d_info = game->edit_data.d_info;
+ char file[20];
sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth);
/* Get and return the level */
diff --git a/src/levels.hpp b/src/levels.hpp
index 187092b1..a48f1d95 100644
--- a/src/levels.hpp
+++ b/src/levels.hpp
@@ -2,12 +2,12 @@
#include "h-basic.h"
-extern bool_ get_dungeon_generator(char *buf);
-extern bool_ get_level_desc(char *buf);
-extern void get_level_flags(void);
-extern bool_ get_dungeon_name(char *buf);
-extern bool_ get_dungeon_special(char *buf);
-extern int get_branch(void);
-extern int get_fbranch(void);
-extern int get_flevel(void);
-extern bool_ get_dungeon_save(char *buf);
+bool_ get_dungeon_generator(char *buf);
+bool_ get_level_desc(char *buf);
+void get_level_flags();
+bool_ get_dungeon_name(char *buf);
+bool_ get_dungeon_special(char *buf);
+int get_branch();
+int get_fbranch();
+int get_flevel();
+bool_ get_dungeon_save(char *buf);
diff --git a/src/loadsave.cc b/src/loadsave.cc
index 1806d7c8..3c843a36 100644
--- a/src/loadsave.cc
+++ b/src/loadsave.cc
@@ -1,12 +1,12 @@
#include "loadsave.hpp"
#include "loadsave.h"
-#include "ability_type.hpp"
#include "artifact_type.hpp"
#include "birth.hpp"
#include "cave_type.hpp"
#include "dungeon_info_type.hpp"
#include "ego_item_type.hpp"
+#include "game.hpp"
#include "init1.hpp"
#include "init2.hpp"
#include "levels.hpp"
@@ -18,18 +18,18 @@
#include "object1.hpp"
#include "object2.hpp"
#include "object_kind.hpp"
+#include "options.hpp"
#include "player_class.hpp"
+#include "player_level_flag.hpp"
#include "player_race.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "hooks.hpp"
#include "skill_type.hpp"
#include "store_type.hpp"
#include "tables.hpp"
#include "timer_type.hpp"
#include "town_type.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "wilderness_map.hpp"
@@ -38,12 +38,33 @@
#include "xtra2.hpp"
#include "z-rand.hpp"
+#include <boost/filesystem.hpp>
#include <cassert>
+#include <fmt/format.h>
#include <memory>
static u32b vernum; /* Version flag */
static FILE *fff; /* Local savefile ptr */
+/*
+ * Show information on the screen, one line at a time.
+ *
+ * Avoid the top two lines, to avoid interference with "msg_print()".
+ */
+static void note(cptr msg)
+{
+ static int y = 2;
+
+ /* Draw the message */
+ prt(msg, y, 0);
+
+ /* Advance one line (wrap if needed) */
+ if (++y >= 24) y = 2;
+
+ /* Flush it */
+ Term_fresh();
+}
+
/**
* Load/save flag
*/
@@ -52,22 +73,23 @@ enum class ls_flag_t {
SAVE = 7
};
-/*
- * Basic byte-level reading from savefile. This provides a single point
- * of interface to the pseudoencryption that ToME (and Angband)
- * uses. I'm thinking about if it might be faster/better to modify all
- * the do_* functions to directly do this stuff -- it'd make the code
- * somewhat uglier to maintain, but concievably might be much faster. Or
- * is it better maybe to scrap the pseudoencryption entirely and adopt
- * some other means of obfuscation, should it still prove useful in any
- * way? -- Improv
- *
- * What's the point of encryption on savefiles anyway? If I wanted to
- * make a cheater savefile, I'd activate debug mode, and hack the game
- * not to save it. There's no point. -- takkaria
+/**
+ * Structure for loading/saving option values
*/
+namespace {
+
+struct option_value {
+ std::string name;
+ bool_ value;
+};
-static byte sf_get(void)
+} // namespace (anonymous)
+
+
+/*
+ * Basic byte-level reading from savefile.
+ */
+static byte sf_get()
{
byte c;
@@ -81,7 +103,7 @@ static byte sf_get(void)
static void sf_put(byte v)
{
- (void)putc((int)v, fff);
+ putc((int)v, fff);
}
/*
@@ -106,6 +128,11 @@ static void do_byte(byte *v, ls_flag_t flag)
}
}
+static void do_char(char *c, ls_flag_t flag)
+{
+ do_byte((byte *) c, flag);
+}
+
static void do_bool(bool_ *f, ls_flag_t flag)
{
byte b = *f;
@@ -116,6 +143,24 @@ static void do_bool(bool_ *f, ls_flag_t flag)
}
}
+static void do_std_bool(bool *x, ls_flag_t flag)
+{
+ switch (flag)
+ {
+ case ls_flag_t::LOAD:
+ {
+ *x = (sf_get() != 0);
+ return;
+ }
+ case ls_flag_t::SAVE:
+ {
+ byte val = (*x) ? 1 : 0;
+ sf_put(val);
+ return;
+ }
+ }
+}
+
static void do_u16b(u16b *v, ls_flag_t flag)
{
switch (flag)
@@ -171,95 +216,145 @@ static void do_s32b(s32b *ip, ls_flag_t flag)
do_u32b((u32b *)ip, flag);
}
-/*
- * Do object memory and similar stuff
- */
-static void do_xtra(int k_idx, ls_flag_t flag)
+static void save_std_string(std::string const *s)
{
- byte tmp8u = 0;
- object_kind *k_ptr = &k_info[k_idx];
-
- switch(flag)
+ // Length prefix.
+ u32b saved_size = s->size();
+ do_u32b(&saved_size, ls_flag_t::SAVE);
+ // Save each character
+ for (auto c: *s)
{
- case ls_flag_t::SAVE:
- {
- if (k_ptr->aware) tmp8u |= 0x01;
- if (k_ptr->tried) tmp8u |= 0x02;
- if (k_ptr->artifact) tmp8u |= 0x80;
-
- do_byte(&tmp8u, flag);
- return;
+ sf_put(c);
}
- case ls_flag_t::LOAD:
+}
+
+static std::string load_std_string()
+{
+ // Length prefix.
+ u32b saved_size;
+ do_u32b(&saved_size, ls_flag_t::LOAD);
+ // Convert to size_t
+ std::size_t n = saved_size;
+ // Make sure we reserve space rather than resizing as we go.
+ std::string s;
+ s.reserve(n);
+ // Read each character
+ for (std::size_t i = 0; i < n; i++)
+ {
+ s += sf_get();
+ }
+ // Done
+ return s;
+}
+
+
+static void do_std_string(std::string &s, ls_flag_t flag)
+{
+ switch (flag)
{
- do_byte(&tmp8u, flag);
- k_ptr->aware = ((tmp8u & 0x01) ? TRUE : FALSE);
- k_ptr->tried = ((tmp8u & 0x02) ? TRUE : FALSE);
- k_ptr->artifact = ((tmp8u & 0x80) ? TRUE : FALSE);
- return;
- }
+ case ls_flag_t::LOAD:
+ s = load_std_string();
+ break;
+ case ls_flag_t::SAVE:
+ save_std_string(&s);
+ break;
}
}
-static void save_string(const char *str)
+static void do_option_value(option_value *option_value, ls_flag_t flag)
{
- while (*str)
+ do_std_string(option_value->name, flag);
+ do_bool(&option_value->value, flag);
+}
+
+
+namespace {
+
+/**
+ * Load/save flag set
+ */
+template<std::size_t Tiers> void do_flag_set(flag_set<Tiers> *flags, ls_flag_t flag)
+{
+ for (std::size_t i = 0; i < flags->size(); i++)
{
- do_byte((byte*)str, ls_flag_t::SAVE);
- str++;
+ do_u32b(&(*flags)[i], flag);
}
- do_byte((byte*)str, ls_flag_t::SAVE);
}
-static void load_string(char *str, int max)
+template<typename T, typename F> void do_vector(ls_flag_t flag, std::vector<T> &v, F f)
{
- int i;
+ u32b n = v.size();
- /* Read the string */
- for (i = 0; TRUE; i++)
+ do_u32b(&n, flag);
+
+ if (flag == ls_flag_t::LOAD)
{
- byte tmp8u;
+ v.clear(); // Make sure it's empty
+ v.reserve(n);
+ std::fill_n(std::back_inserter(v), n, T());
+ }
- /* Read a byte */
- do_byte(&tmp8u, ls_flag_t::LOAD);
+ for (std::size_t i = 0; i < n; i++)
+ {
+ f(&v[i], flag);
+ }
+}
- /* Collect string while legal */
- if (i < max) str[i] = tmp8u;
+template<typename A, typename F> void do_array(std::string const &what, ls_flag_t flag, A &array, std::size_t size, F f)
+{
+ // Save/load size.
+ u32b n = size;
+ do_u32b(&n, flag);
- /* End of string */
- if (!tmp8u) break;
+ // Check that we don't overflow the array.
+ if (flag == ls_flag_t::LOAD)
+ {
+ if (n > size)
+ {
+ note(fmt::format("Too many {:s}: {:d} > {:d}! Game may act strangely or crash.", what, n, size).c_str());
+ }
+ }
+
+ // Load/save the contents of the array.
+ for (std::size_t i = 0; i < n; i++)
+ {
+ f(&array[i], flag);
}
- /* Terminate */
- str[max - 1] = '\0';
}
-static void do_string(char *str, int max, ls_flag_t flag)
-/* Max is ignored for writing */
+static void do_bytes(ls_flag_t flag, std::uint8_t *buf, std::size_t n)
{
- switch(flag) {
- case ls_flag_t::LOAD:
+ for (std::size_t i = 0; i < n; i++)
{
- load_string(str, max);
- return;
+ do_byte(&buf[i], flag);
}
- case ls_flag_t::SAVE:
+};
+
+static void do_seed(seed_t *seed, ls_flag_t flag)
+{
+ uint8_t buf[seed_t::n_bytes];
+
+ if (flag == ls_flag_t::SAVE)
{
- save_string(str);
- return;
+ seed->to_bytes(buf);
}
+
+ do_bytes(flag, buf, sizeof(buf));
+
+ if (flag == ls_flag_t::LOAD)
+ {
+ *seed = seed_t::from_bytes(buf);
}
}
+} // namespace (anonymous)
+
+
/*
* Load/Save quick start data
*/
-static void do_quick_start(ls_flag_t flag)
+static void do_quick_start(ls_flag_t flag, birther &previous_char)
{
- s16b tmp16s;
- u32b tmp32u;
- int i;
-
- do_s16b(&previous_char.sex, flag);
do_s16b(&previous_char.race, flag);
do_s16b(&previous_char.rmod, flag);
do_s16b(&previous_char.pclass, flag);
@@ -267,20 +362,34 @@ static void do_quick_start(ls_flag_t flag)
do_byte(&previous_char.quests, flag);
do_byte(&previous_char.god, flag);
do_s32b(&previous_char.grace, flag);
- do_s16b(&previous_char.age, flag);
- do_s16b(&previous_char.wt, flag);
- do_s16b(&previous_char.ht, flag);
- do_s16b(&previous_char.sc, flag);
do_s32b(&previous_char.au, flag);
- for (i = 0; i < 6; i++) do_s16b(&(previous_char.stat[i]), flag);
+ for (std::size_t i = 0; i < 6; i++)
+ {
+ do_s16b(&(previous_char.stat[i]), flag);
+ }
do_s16b(&previous_char.luck, flag);
- do_s16b(&tmp16s, flag);
- do_u32b(&tmp32u, flag);
- do_byte((byte*)&previous_char.quick_ok, flag);
+ do_bool(&previous_char.quick_ok, flag);
+}
+
+static void do_skill_modifier(skill_modifier *s, ls_flag_t flag)
+{
+ do_char(&s->basem, flag);
+ do_u32b(&s->base, flag);
+ do_char(&s->modm, flag);
+ do_s16b(&s->mod, flag);
+}
+
+static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag)
+{
+ do_vector(flag, skill_modifiers->modifiers, do_skill_modifier);
+}
- for (i = 0; i < 4; i++) do_string(previous_char.history[i], 60, flag);
+static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag)
+{
+ do_flag_set(&lflag->oflags, flag);
+ do_s16b(&lflag->pval, flag);
}
/*
@@ -288,106 +397,52 @@ static void do_quick_start(ls_flag_t flag)
*/
static void do_subrace(ls_flag_t flag)
{
+ auto &race_mod_info = game->edit_data.race_mod_info;
+
player_race_mod *sr_ptr = &race_mod_info[SUBRACE_SAVE];
int i;
- char buf[81];
- buf[80] = '\0'; // Make sure string is always NUL terminated
+ do_std_string(sr_ptr->title, flag);
+ do_std_string(sr_ptr->description, flag);
- if (flag == ls_flag_t::SAVE)
- {
- strncpy(buf, sr_ptr->title, 80);
- }
- do_string(buf, 80, flag);
- if (flag == ls_flag_t::LOAD)
- {
- set_subrace_title(sr_ptr, buf);
- }
+ do_bool(&sr_ptr->place, flag);
- if (flag == ls_flag_t::SAVE)
- {
- strncpy(buf, sr_ptr->desc, 80);
- }
- do_string(buf, 80, flag);
- if (flag == ls_flag_t::LOAD)
+ for (i = 0; i < 6; i++)
{
- set_subrace_description(sr_ptr, buf);
+ do_s16b(&sr_ptr->ps.adj[i], flag);
}
- do_byte((byte*)&sr_ptr->place, flag);
-
- for (i = 0; i < 6; i++)
- do_s16b(&sr_ptr->r_adj[i], flag);
-
- do_byte((byte*)&sr_ptr->luck, flag);
+ do_char(&sr_ptr->luck, flag);
do_s16b(&sr_ptr->mana, flag);
- do_s16b(&sr_ptr->r_dis, flag);
- do_s16b(&sr_ptr->r_dev, flag);
- do_s16b(&sr_ptr->r_sav, flag);
- do_s16b(&sr_ptr->r_stl, flag);
- do_s16b(&sr_ptr->r_srh, flag);
- do_s16b(&sr_ptr->r_fos, flag);
- do_s16b(&sr_ptr->r_thn, flag);
- do_s16b(&sr_ptr->r_thb, flag);
+ do_s16b(&sr_ptr->ps.mhp, flag);
+ do_s16b(&sr_ptr->ps.exp, flag);
- do_byte((byte*)&sr_ptr->r_mhp, flag);
- do_s16b(&sr_ptr->r_exp, flag);
+ do_char(&sr_ptr->infra, flag);
- do_byte((byte*)&sr_ptr->b_age, flag);
- do_byte((byte*)&sr_ptr->m_age, flag);
-
- do_byte((byte*)&sr_ptr->m_b_ht, flag);
- do_byte((byte*)&sr_ptr->m_m_ht, flag);
- do_byte((byte*)&sr_ptr->f_b_ht, flag);
- do_byte((byte*)&sr_ptr->f_m_ht, flag);
-
- do_byte((byte*)&sr_ptr->m_b_wt, flag);
- do_byte((byte*)&sr_ptr->m_m_wt, flag);
- do_byte((byte*)&sr_ptr->f_b_wt, flag);
- do_byte((byte*)&sr_ptr->f_m_wt, flag);
-
- do_byte((byte*)&sr_ptr->infra, flag);
-
- for (i = 0; i < 4; i++)
- do_s16b(&sr_ptr->powers[i], flag);
+ do_vector(flag, sr_ptr->ps.powers, do_s16b);
for (i = 0; i < BODY_MAX; i++)
- do_byte((byte*)&sr_ptr->body_parts[i], flag);
+ {
+ do_char(&sr_ptr->body_parts[i], flag);
+ }
- do_u32b(&sr_ptr->flags1, flag);
- do_u32b(&sr_ptr->flags2, flag);
+ do_flag_set(&sr_ptr->flags, flag);
for (i = 0; i < PY_MAX_LEVEL + 1; i++)
{
- do_u32b(&sr_ptr->oflags1[i], flag);
- do_u32b(&sr_ptr->oflags2[i], flag);
- do_u32b(&sr_ptr->oflags3[i], flag);
- do_u32b(&sr_ptr->oflags4[i], flag);
- do_u32b(&sr_ptr->oflags5[i], flag);
- do_u32b(&sr_ptr->oesp[i], flag);
- do_s16b(&sr_ptr->opval[i], flag);
+ do_player_level_flag(&sr_ptr->lflags[i], flag);
}
do_byte(&sr_ptr->g_attr, flag);
- do_byte((byte*)&sr_ptr->g_char, flag);
+ do_char(&sr_ptr->g_char, flag);
- for (i = 0; i < MAX_SKILLS; i++)
- {
- do_byte((byte*)&sr_ptr->skill_basem[i], flag);
- do_u32b(&sr_ptr->skill_base[i], flag);
- do_byte((byte*)&sr_ptr->skill_modm[i], flag);
- do_s16b(&sr_ptr->skill_mod[i], flag);
- }
+ do_skill_modifiers(&sr_ptr->skill_modifiers, flag);
}
-/* Load/Save the random spells info */
-static void do_spells(int i, ls_flag_t flag)
+static void do_random_spell(random_spell *s_ptr, ls_flag_t flag)
{
- random_spell *s_ptr = &random_spells[i];
- do_string(s_ptr->name, 30, flag);
- do_string(s_ptr->desc, 30, flag);
do_s16b(&s_ptr->mana, flag);
do_s16b(&s_ptr->fail, flag);
do_u32b(&s_ptr->proj_flags, flag);
@@ -396,113 +451,82 @@ static void do_spells(int i, ls_flag_t flag)
do_byte(&s_ptr->dam_sides, flag);
do_byte(&s_ptr->dam_dice, flag);
do_byte(&s_ptr->level, flag);
- do_byte((byte*)&s_ptr->untried, flag);
+ do_std_bool(&s_ptr->untried, flag);
}
-
-/*
- * Show information on the screen, one line at a time.
- *
- * Avoid the top two lines, to avoid interference with "msg_print()".
- */
-static void note(cptr msg)
+static void do_level_marker(level_marker *marker, ls_flag_t flag)
{
- static int y = 2;
-
- /* Draw the message */
- prt(msg, y, 0);
-
- /* Advance one line (wrap if needed) */
- if (++y >= 24) y = 2;
-
- /* Flush it */
- Term_fresh();
-}
+ std::string v;
-
-static void skip_ver_byte(u32b version, ls_flag_t flag)
-/* Reads and discards a byte if the savefile is as old as/older than version */
-{
- if ((flag == ls_flag_t::LOAD) && (vernum <= version))
+ if (flag == ls_flag_t::SAVE)
{
- byte forget;
- do_byte(&forget, flag);
+ v = level_marker_values().stringify(*marker);
}
- return;
-}
-static void do_ver_s16b(s16b *v, u32b version, s16b defval, ls_flag_t flag)
-{
- if ((flag == ls_flag_t::LOAD) && (vernum < version))
+ do_std_string(v, flag);
+
+ if (flag == ls_flag_t::LOAD)
{
- *v = defval;
- return;
+ bool valid = level_marker_values().parse(v.c_str(), marker);
+ if (!valid)
+ {
+ note(fmt::format("Bad level marker: {}!", v).c_str());
+ abort();
+ }
}
- do_s16b(v, flag);
}
/*
* Misc. other data
*/
-static char loaded_game_module[80];
static bool_ do_extra(ls_flag_t flag)
{
- int i, j;
- byte tmp8u = 0;
- s16b tmp16s = 0;
- u32b tmp32u = 0;
- s32b tmp32s = 0;
- u16b tmp16b = 0;
- u32b dummy32u = 0;
+ auto const &d_info = game->edit_data.d_info;
+ auto &s_info = game->s_info;
- do_string(player_name, 32, flag);
+ do_std_string(game->player_name, flag);
- do_string(died_from, 80, flag);
-
- for (i = 0; i < 4; i++)
- {
- do_string(history[i], 60, flag);
- }
+ do_std_string(game->died_from, flag);
/* Handle the special levels info */
- if (flag == ls_flag_t::SAVE)
{
- tmp8u = max_d_idx;
- tmp16s = MAX_DUNGEON_DEPTH;
- }
- do_byte(&tmp8u, flag);
+ byte tmp8u = d_info.size();
+ u16b tmp16u = MAX_DUNGEON_DEPTH;
- if (flag == ls_flag_t::LOAD)
- {
- if (tmp8u > max_d_idx)
+ do_byte(&tmp8u, flag);
+
+ if (flag == ls_flag_t::LOAD)
{
- note(format("Too many (%d) dungeon types!", tmp8u));
+ if (tmp8u > d_info.size())
+ {
+ note(format("Too many dungeon types!", static_cast<int>(tmp8u)));
+ }
}
- }
- do_s16b(&tmp16s, flag);
+ do_u16b(&tmp16u, flag);
- if (flag == ls_flag_t::LOAD)
- {
- if (tmp16s > MAX_DUNGEON_DEPTH)
+ if (flag == ls_flag_t::LOAD)
{
- note(format("Too many (%d) max level by dungeon type!", tmp16s));
+ if (tmp16u > MAX_DUNGEON_DEPTH)
+ {
+ note(format("Too many (%d) max level by dungeon type!", static_cast<int>(tmp16u)));
+ }
}
- }
- /* Load the special levels history */
- for (i = 0; i < tmp8u; i++)
- {
- for (j = 0; j < tmp16s; j++)
+ /* Load the special levels history */
+ for (std::size_t i = 0; i < tmp8u; i++)
{
- do_byte((byte*)&special_lvl[j][i], flag);
+ for (std::size_t j = 0; j < tmp16u; j++)
+ {
+ do_level_marker(&game->level_markers[j][i], flag);
+ }
}
}
- do_byte((byte*)&generate_special_feeling, flag);
+ do_std_bool(&game->generate_special_feeling, flag);
/* Load the quick start data */
- do_quick_start(flag);
+ do_quick_start(flag, game->previous_char);
/* Load/save the special subrace */
do_subrace(flag);
@@ -513,75 +537,39 @@ static bool_ do_extra(ls_flag_t flag)
do_byte(&p_ptr->pracem, flag);
do_byte(&p_ptr->pclass, flag);
do_byte(&p_ptr->pspec, flag);
- do_byte(&p_ptr->psex, flag);
- do_u16b(&tmp16b, flag);
- do_u16b(&tmp16b, flag);
do_byte(&p_ptr->mimic_form, flag);
do_s16b(&p_ptr->mimic_level, flag);
- if (flag == ls_flag_t::SAVE) tmp8u = 0;
do_byte(&p_ptr->hitdie, flag);
do_u16b(&p_ptr->expfact, flag);
- do_s16b(&p_ptr->age, flag);
- do_s16b(&p_ptr->ht, flag);
- do_s16b(&p_ptr->wt, flag);
-
/* Dump the stats (maximum and current) */
- for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag);
- for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag);
- for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cnt[i], flag);
- for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_los[i], flag);
-
- /* Dump the skills */
- do_s16b(&p_ptr->skill_points, flag);
- do_s16b(&p_ptr->skill_last_level, flag);
- do_s16b(&p_ptr->melee_style, flag);
- do_s16b(&p_ptr->use_piercing_shots, flag);
-
- tmp16s = MAX_SKILLS;
- do_s16b(&tmp16s, flag);
-
- if ((flag == ls_flag_t::LOAD) && (tmp16s > MAX_SKILLS))
- {
- quit("Too many skills");
- }
-
- if (flag == ls_flag_t::SAVE) old_max_s_idx = max_s_idx;
- do_u16b(&old_max_s_idx, flag);
- for (i = 0; i < tmp16s; ++i)
- {
- if (i < old_max_s_idx)
- {
- do_s32b(&s_info[i].value, flag);
- do_s32b(&s_info[i].mod, flag);
- do_byte((byte*)&s_info[i].dev, flag);
- do_byte((byte*)&s_info[i].hidden, flag);
- do_u32b(&s_info[i].uses, flag);
- }
- else
- {
- do_u32b(&tmp32u, flag);
- do_s16b(&tmp16s, flag);
- do_byte(&tmp8u, flag);
- do_byte(&tmp8u, flag);
- do_u32b(&tmp32u, flag);
- }
- }
-
- tmp16s = max_ab_idx;
- do_s16b(&tmp16s, flag);
-
- if ((flag == ls_flag_t::LOAD) && (tmp16s > max_ab_idx))
- {
- quit("Too many abilities");
+ for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag);
+ for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag);
+ for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cnt[i], flag);
+ for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_los[i], flag);
+
+ // Skills
+ {
+ do_s16b(&p_ptr->skill_points, flag);
+ do_s16b(&p_ptr->skill_last_level, flag);
+ do_s16b(&p_ptr->melee_style, flag);
+ do_s16b(&p_ptr->use_piercing_shots, flag);
+
+ do_array("skills", flag, s_info, s_info.size(),
+ [](auto skill, auto flag) -> void {
+ do_s32b(&skill->value, flag);
+ do_s32b(&skill->mod, flag);
+ do_std_bool(&skill->dev, flag);
+ do_std_bool(&skill->hidden, flag);
+ }
+ );
}
- for (i = 0; i < tmp16s; ++i)
- {
- do_byte((byte*)&ab_info[i].acquired, flag);
- }
+ // Abilities
+ do_vector(flag, p_ptr->abilities, do_u16b);
+ // Miscellaneous
do_s16b(&p_ptr->luck_base, flag);
do_s16b(&p_ptr->luck_max, flag);
@@ -595,48 +583,28 @@ static bool_ do_extra(ls_flag_t flag)
do_s16b(&p_ptr->town_num, flag); /* -KMW- */
/* Write arena and rewards information -KMW- */
- do_s16b(&tmp16s, flag);
- do_s16b(&tmp16s, flag);
do_s16b(&p_ptr->inside_quest, flag);
- do_byte(&tmp8u, flag);
/* Save/load spellbinder */
- do_byte(&p_ptr->spellbinder_num, flag);
- do_byte(&p_ptr->spellbinder_trigger, flag);
- for (i = 0; i < 4; i++)
- do_u32b(&p_ptr->spellbinder[i], flag);
+ do_byte(&p_ptr->spellbinder.trigger, flag);
+ do_vector(flag, p_ptr->spellbinder.spell_idxs, do_u32b);
-
- do_byte(&tmp8u, flag); /* tmp8u should be 0 at this point */
-
- if (flag == ls_flag_t::SAVE) tmp8u = MAX_PLOTS;
- do_byte(&tmp8u, flag);
-
- if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_PLOTS))
- {
- quit(format("Too many plots, %d %d", tmp8u, MAX_PLOTS));
- }
-
- for (i = 0; i < tmp8u; i++)
- {
- do_s16b(&plots[i], flag);
- }
-
- if (flag == ls_flag_t::SAVE)
- {
- tmp8u = MAX_RANDOM_QUEST;
- }
- do_byte(&tmp8u, flag);
-
- if ((flag == ls_flag_t::LOAD) &&
- (tmp8u > MAX_RANDOM_QUEST)) quit("Too many random quests");
- for (i = 0; i < tmp8u; i++)
- {
- do_byte(&random_quests[i].type, flag);
- do_s16b(&random_quests[i].r_idx, flag);
- do_byte((byte*)&random_quests[i].done, flag);
- }
+ // Quest status
+ do_array("plot quests", flag, plots, MAX_PLOTS,
+ [](auto plot, auto flag) -> void {
+ do_s16b(plot, flag);
+ }
+ );
+
+ // Random quests
+ do_array("random quests", flag, random_quests, MAX_RANDOM_QUEST,
+ [](auto q, auto flag) -> void {
+ do_byte(&q->type, flag);
+ do_s16b(&q->r_idx, flag);
+ do_std_bool(&q->done, flag);
+ }
+ );
do_s16b(&p_ptr->oldpx, flag);
do_s16b(&p_ptr->oldpy, flag);
@@ -654,49 +622,48 @@ static bool_ do_extra(ls_flag_t flag)
do_s16b(&p_ptr->csp, flag);
do_u16b(&p_ptr->csp_frac, flag);
- /* XXX
- Here's where tank points were.
- Those who run the estate of you-know-who is really stupid.
- I'll never even consider reading her books now. -- neil */
- do_s16b(&tmp16s, flag);
- do_s16b(&tmp16s, flag);
- do_s16b(&tmp16s, flag);
- do_s16b(&tmp16s, flag);
-
/* Gods */
do_s32b(&p_ptr->grace, flag);
do_s32b(&p_ptr->grace_delay, flag);
- do_byte((byte*)&p_ptr->praying, flag);
+ do_bool(&p_ptr->praying, flag);
do_s16b(&p_ptr->melkor_sacrifice, flag);
do_byte(&p_ptr->pgod, flag);
- /* Max Player and Dungeon Levels */
do_s16b(&p_ptr->max_plv, flag);
- if (flag == ls_flag_t::SAVE)
- tmp8u = max_d_idx;
- do_byte(&tmp8u, flag);
- for (i = 0; i < tmp8u; i++)
+ // Max dungeon levels
{
- if (flag == ls_flag_t::SAVE)
- tmp16s = max_dlv[i];
- do_s16b(&tmp16s, flag);
- if ((flag == ls_flag_t::LOAD) && (i <= max_d_idx))
- max_dlv[i] = tmp16s;
+ byte tmp8u = d_info.size();
+
+ do_byte(&tmp8u, flag);
+
+ for (std::size_t i = 0; i < tmp8u; i++)
+ {
+ s16b tmp16s = max_dlv[i];
+
+ do_s16b(&tmp16s, flag);
+
+ if ((flag == ls_flag_t::LOAD) && (i <= d_info.size()))
+ {
+ max_dlv[i] = tmp16s;
+ }
+ }
}
+
/* Repair max player level??? */
if ((flag == ls_flag_t::LOAD) && (p_ptr->max_plv < p_ptr->lev))
+ {
p_ptr->max_plv = p_ptr->lev;
+ }
- do_byte((byte*)&(p_ptr->help.enabled), flag);
- for (i = 0; i < HELP_MAX; i++)
+ /* Help */
+ do_std_bool(&p_ptr->help.enabled, flag);
+ for (std::size_t i = 0; i < HELP_MAX; i++)
{
- do_bool(&(p_ptr->help.activated[i]), flag);
+ do_std_bool(&p_ptr->help.activated[i], flag);
}
/* More info */
- tmp16s = 0;
- do_s16b(&p_ptr->sc, flag);
do_s16b(&p_ptr->blind, flag);
do_s16b(&p_ptr->paralyzed, flag);
do_s16b(&p_ptr->confused, flag);
@@ -711,7 +678,6 @@ static bool_ do_extra(ls_flag_t flag)
do_s16b(&p_ptr->poisoned, flag);
do_s16b(&p_ptr->image, flag);
do_s16b(&p_ptr->protevil, flag);
- do_s16b(&p_ptr->protundead, flag);
do_s16b(&p_ptr->invuln, flag);
do_s16b(&p_ptr->hero, flag);
do_s16b(&p_ptr->shero, flag);
@@ -742,7 +708,7 @@ static bool_ do_extra(ls_flag_t flag)
do_s16b(&p_ptr->tim_invis, flag);
do_s16b(&p_ptr->word_recall, flag);
- do_s16b(&p_ptr->recall_dungeon, flag);
+ do_byte(&p_ptr->recall_dungeon, flag);
do_s16b(&p_ptr->see_infra, flag);
do_s16b(&p_ptr->tim_infra, flag);
do_s16b(&p_ptr->oppose_fire, flag);
@@ -750,182 +716,97 @@ static bool_ do_extra(ls_flag_t flag)
do_s16b(&p_ptr->oppose_acid, flag);
do_s16b(&p_ptr->oppose_elec, flag);
do_s16b(&p_ptr->oppose_pois, flag);
- do_s16b(&p_ptr->oppose_ld, flag);
do_s16b(&p_ptr->oppose_cc, flag);
- do_s16b(&p_ptr->oppose_ss, flag);
- do_s16b(&p_ptr->oppose_nex, flag);
do_s16b(&p_ptr->tim_esp, flag);
do_s16b(&p_ptr->tim_wraith, flag);
do_s16b(&p_ptr->tim_ffall, flag);
- do_ver_s16b(&p_ptr->tim_fly, SAVEFILE_VERSION, 0, flag);
- do_s16b(&tmp16s, flag);
- do_ver_s16b(&p_ptr->tim_poison, SAVEFILE_VERSION, 0, flag);
- do_s16b(&tmp16s, flag);
+ do_s16b(&p_ptr->tim_fly, flag);
+ do_s16b(&p_ptr->tim_poison, flag);
do_s16b(&p_ptr->tim_invisible, flag);
do_s16b(&p_ptr->tim_inv_pow, flag);
do_s16b(&p_ptr->tim_mimic, flag);
do_s16b(&p_ptr->lightspeed, flag);
do_s16b(&p_ptr->tim_lite, flag);
- do_ver_s16b(&p_ptr->tim_regen, SAVEFILE_VERSION, 0, flag);
- do_ver_s16b(&p_ptr->tim_regen_pow, SAVEFILE_VERSION, 0, flag);
+ do_s16b(&p_ptr->tim_regen, flag);
+ do_s16b(&p_ptr->tim_regen_pow, flag);
do_s16b(&p_ptr->holy, flag);
- do_s16b(&tmp16s, flag);
- do_s16b(&tmp16s, flag);
do_s16b(&p_ptr->immov_cntr, flag);
do_s16b(&p_ptr->strike, flag);
- do_s16b(&tmp16s, flag);
do_s16b(&p_ptr->tim_reflect, flag);
- do_s16b(&tmp16s, flag);
do_s16b(&p_ptr->tim_deadly, flag);
do_s16b(&p_ptr->prob_travel, flag);
do_s16b(&p_ptr->disrupt_shield, flag);
do_s16b(&p_ptr->parasite, flag);
do_s16b(&p_ptr->parasite_r_idx, flag);
- do_s32b(&tmp32s, flag);
- do_s32b(&tmp32s, flag);
do_s16b(&p_ptr->absorb_soul, flag);
do_s32b(&p_ptr->inertia_controlled_spell, flag);
do_s16b(&p_ptr->last_rewarded_level, flag);
- do_s16b(&tmp16s, flag); /* compat */
-
- if (flag == ls_flag_t::SAVE) { tmp16s = CORRUPTIONS_MAX; }
- do_s16b(&tmp16s, flag);
- if (tmp16s > CORRUPTIONS_MAX) {
- quit("Too many corruptions");
- }
-
- for (i = 0; i < tmp16s; i++)
- {
- if (flag == ls_flag_t::SAVE)
- tmp8u = p_ptr->corruptions[i];
-
- do_byte(&tmp8u, flag);
-
- if (flag == ls_flag_t::LOAD)
- p_ptr->corruptions[i] = tmp8u;
- }
+ do_array("corruptions", flag, p_ptr->corruptions, CORRUPTIONS_MAX,
+ [](auto corruption, auto flag) -> void {
+ do_bool(corruption, flag);
+ }
+ );
- do_byte((byte*)&p_ptr->corrupt_anti_teleport_stopped, flag);
+ do_bool(&p_ptr->corrupt_anti_teleport_stopped, flag);
do_byte(&p_ptr->confusing, flag);
- do_byte((byte*)&p_ptr->black_breath, flag);
- do_byte((byte*)&fate_flag, flag);
- do_byte(&p_ptr->searching, flag);
- do_byte(&tmp8u, flag);
- do_byte(&p_ptr->preserve, flag);
- do_byte(&p_ptr->special, flag);
- do_byte((byte*)&ambush_flag, flag);
+ do_bool(&p_ptr->black_breath, flag);
+ do_bool(&fate_flag, flag);
+ do_bool(&ambush_flag, flag);
do_byte(&p_ptr->allow_one_death, flag);
- do_s16b(&tmp16s, flag);
-
- do_byte(&tmp8u, flag);
do_s16b(&no_breeds, flag);
- do_s16b(&p_ptr->protgood, flag);
/* Auxilliary variables */
do_u32b(&p_ptr->mimic_extra, flag);
do_u32b(&p_ptr->antimagic_extra, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
do_u32b(&p_ptr->music_extra, flag);
- do_u32b(&tmp32u, flag);
do_u32b(&p_ptr->necro_extra, flag);
do_u32b(&p_ptr->necro_extra2, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
- do_u32b(&tmp32u, flag);
-
do_u16b(&p_ptr->body_monster, flag);
- do_byte((byte*)&p_ptr->disembodied, flag);
+ do_bool(&p_ptr->disembodied, flag);
/* Are we in astral mode? */
- do_byte((byte*)&p_ptr->astral, flag);
-
- if (flag == ls_flag_t::SAVE) tmp16s = POWER_MAX;
- do_s16b(&tmp16s, flag);
- if ((flag == ls_flag_t::LOAD) && (tmp16s > POWER_MAX))
- note(format("Too many (%u) powers!", tmp16s));
- for (i = 0; i < POWER_MAX; i++)
- do_byte((byte*)&p_ptr->powers_mod[i], flag);
+ do_bool(&p_ptr->astral, flag);
- skip_ver_byte(100, flag);
+ // Powers
+ do_array("powers", flag, p_ptr->powers_mod, POWER_MAX,
+ [](auto pwr, auto flag) -> void {
+ do_bool(pwr, flag);
+ }
+ );
/* The tactic */
- do_byte((byte*)&p_ptr->tactic, flag);
+ do_char(&p_ptr->tactic, flag);
/* The movement */
- do_byte((byte*)&p_ptr->movement, flag);
+ do_char(&p_ptr->movement, flag);
/* The comapnions killed */
do_s16b(&p_ptr->companion_killed, flag);
/* The fate */
- do_byte((byte*)&p_ptr->no_mortal, flag);
-
- /* The bounties -- kept only for load-compatibility with old savefiles. */
- for (i = 0; i < 24; i++) {
- tmp16s = 0; do_s16b(&tmp16s, flag);
- tmp16s = 0; do_s16b(&tmp16s, flag);
- }
- tmp32u = 0; do_u32b(&tmp32u, flag);
+ do_bool(&p_ptr->no_mortal, flag);
- /* Spells */
- do_s16b(&spell_num, flag);
- for (i = 0; i < MAX_SPELLS; i++)
- do_spells(i, flag);
- do_s16b(&rune_num, flag);
- for (i = 0; i < MAX_RUNES; i++)
- {
- do_string(rune_spells[i].name, 30, flag);
- do_s16b(&rune_spells[i].type, flag);
- do_s16b(&rune_spells[i].rune2, flag);
- do_s16b(&rune_spells[i].mana, flag);
- }
+ /* Random spells */
+ do_vector(flag, p_ptr->random_spells, do_random_spell);
- /* Load random seeds */
- do_u32b(&dummy32u, flag); /* Load-compatibility with old savefiles. */
- do_u32b(&seed_flavor, flag); /* For consistent object flavors. */
- do_u32b(&dummy32u, flag); /* Load-compatibility with old savefiles. */
+ /* Random seed for object flavors. */
+ do_seed(&seed_flavor(), flag);
/* Special stuff */
- do_u16b(&tmp16b, flag); /* Dummy */
do_u16b(&total_winner, flag);
do_u16b(&has_won, flag);
do_u16b(&noscore, flag);
/* Write death */
- if (flag == ls_flag_t::SAVE) tmp8u = death;
- do_byte(&tmp8u, flag);
- if (flag == ls_flag_t::LOAD) death = tmp8u;
-
- /* Incompatible module? */
- if (flag == ls_flag_t::LOAD)
- {
- s32b ok;
-
- ok = module_savefile_loadable(loaded_game_module);
-
- /* Argh bad game module! */
- if (!ok)
- {
- note(format("Bad game module. Savefile was saved with module '%s' but game is '%s'.", loaded_game_module, game_module));
- return (FALSE);
- }
- }
+ do_bool(&death, flag);
- /* Write feeling */
- if (flag == ls_flag_t::SAVE) tmp8u = feeling;
- do_byte(&tmp8u, flag);
- if (flag == ls_flag_t::LOAD) feeling = tmp8u;
+ /* Level feeling */
+ do_s16b(&feeling, flag);
/* Turn of last "feeling" */
do_s32b(&old_turn, flag);
@@ -942,8 +823,6 @@ static bool_ do_extra(ls_flag_t flag)
*/
static void do_monster(monster_type *m_ptr, ls_flag_t flag)
{
- int i;
-
/* Read the monster race */
do_s16b(&m_ptr->r_idx, flag);
@@ -976,16 +855,20 @@ static void do_monster(monster_type *m_ptr, ls_flag_t flag)
do_s32b(&m_ptr->mflag, flag);
- if (flag == ls_flag_t::LOAD) m_ptr->mflag &= PERM_MFLAG_MASK;
-
- /* Attacks */
- for (i = 0; i < 4; i++)
+ if (flag == ls_flag_t::LOAD)
{
- do_byte(&m_ptr->blow[i].method, flag);
- do_byte(&m_ptr->blow[i].effect, flag);
- do_byte(&m_ptr->blow[i].d_dice, flag);
- do_byte(&m_ptr->blow[i].d_side, flag);
+ m_ptr->mflag &= PERM_MFLAG_MASK;
}
+
+ /* Attacks */
+ do_array("attacks", flag, m_ptr->blow, 4,
+ [](auto blow, auto flag) {
+ do_byte(&blow->method, flag);
+ do_byte(&blow->effect, flag);
+ do_byte(&blow->d_dice, flag);
+ do_byte(&blow->d_side, flag);
+ }
+ );
}
@@ -1031,7 +914,6 @@ static bool_ wearable_p(object_type *o_ptr)
case TV_HYPNOS:
case TV_INSTRUMENT:
case TV_DAEMON_BOOK:
- case TV_TRAPKIT:
case TV_TOOL:
{
return (TRUE);
@@ -1045,19 +927,16 @@ static bool_ wearable_p(object_type *o_ptr)
/*
* rd/wr an object
- *
- * FIXME! This code probably has a lot of cruft from the old Z/V codebase.
- *
*/
static void do_item(object_type *o_ptr, ls_flag_t flag)
{
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+ auto &e_info = game->edit_data.e_info;
+
byte old_dd;
byte old_ds;
- u32b f1, f2, f3, f4, f5, esp;
-
- object_kind *k_ptr;
-
/* Kind */
do_s16b(&o_ptr->k_idx, flag);
@@ -1110,20 +989,10 @@ static void do_item(object_type *o_ptr, ls_flag_t flag)
do_byte(&o_ptr->marked, flag);
/* flags */
- do_u32b(&o_ptr->art_flags1, flag);
- do_u32b(&o_ptr->art_flags2, flag);
- do_u32b(&o_ptr->art_flags3, flag);
- do_u32b(&o_ptr->art_flags4, flag);
- do_u32b(&o_ptr->art_flags5, flag);
- do_u32b(&o_ptr->art_esp, flag);
+ do_flag_set(&o_ptr->art_flags, flag);
/* obvious flags */
- do_u32b(&o_ptr->art_oflags1, flag);
- do_u32b(&o_ptr->art_oflags2, flag);
- do_u32b(&o_ptr->art_oflags3, flag);
- do_u32b(&o_ptr->art_oflags4, flag);
- do_u32b(&o_ptr->art_oflags5, flag);
- do_u32b(&o_ptr->art_oesp, flag);
+ do_flag_set(&o_ptr->art_oflags, flag);
/* Monster holding object */
do_s16b(&o_ptr->held_m_idx, flag);
@@ -1145,50 +1014,22 @@ static void do_item(object_type *o_ptr, ls_flag_t flag)
do_s16b(&o_ptr->found_aux3, flag);
do_s16b(&o_ptr->found_aux4, flag);
- if (flag == ls_flag_t::LOAD)
- {
- char buf[128];
- /* Inscription */
- load_string(buf, 128);
- if (buf[0])
- {
- o_ptr->note = quark_add(buf);
- }
- /* Artifact name */
- load_string(buf, 128);
- if (buf[0])
- {
- o_ptr->art_name = quark_add(buf);
- }
- }
- if (flag == ls_flag_t::SAVE)
- {
- /* Save the inscription (if any) */
- if (o_ptr->note)
- {
- save_string(quark_str(o_ptr->note));
- }
- else
- {
- save_string("");
- }
- if (o_ptr->art_name)
- {
- save_string(quark_str(o_ptr->art_name));
- }
- else
- {
- save_string("");
- }
- }
+ // Inscription
+ do_std_string(o_ptr->inscription, flag);
+
+ // Artifact name
+ do_std_string(o_ptr->artifact_name, flag);
+
+ /* Stick any more shared code before this. The rest
+ of this function is reserved for ls_flag_t::LOAD's
+ cleanup functions */
+
+ if (flag == ls_flag_t::SAVE) return;
- if (flag == ls_flag_t::SAVE) return ; /* Stick any more shared code before this. The rest
- of this function is reserved for ls_flag_t::LOAD's
- cleanup functions */
/*********** END OF ls_flag_t::SAVE ***************/
/* Obtain the "kind" template */
- k_ptr = &k_info[o_ptr->k_idx];
+ object_kind *k_ptr = &k_info[o_ptr->k_idx];
/* Obtain tval/sval from k_info */
o_ptr->tval = k_ptr->tval;
@@ -1213,16 +1054,11 @@ static void do_item(object_type *o_ptr, ls_flag_t flag)
}
- /* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
/* Paranoia */
if (o_ptr->name1)
{
- artifact_type *a_ptr;
-
/* Obtain the artifact info */
- a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
/* Verify that artifact */
if (!a_ptr->name) o_ptr->name1 = 0;
@@ -1270,7 +1106,7 @@ static void do_item(object_type *o_ptr, ls_flag_t flag)
o_ptr->ds = old_ds;
}
- if (o_ptr->art_name) /* A random artifact */
+ if (!o_ptr->artifact_name.empty()) /* A random artifact */
{
o_ptr->dd = old_dd;
o_ptr->ds = old_ds;
@@ -1284,7 +1120,6 @@ static void do_cave_type(cave_type *c_ptr, ls_flag_t flag)
do_byte(&c_ptr->mimic, flag);
do_s16b(&c_ptr->special, flag);
do_s16b(&c_ptr->special2, flag);
- do_s16b(&c_ptr->t_idx, flag);
do_s16b(&c_ptr->inscription, flag);
do_byte(&c_ptr->mana, flag);
do_s16b(&c_ptr->effect, flag);
@@ -1301,307 +1136,287 @@ static void do_grid(ls_flag_t flag)
}
}
-static void my_sentinel(const char *place, u16b value, ls_flag_t flag)
-/* This function lets us know exactly where a savefile is
- broken by reading/writing conveniently a sentinel at this
- spot */
+static bool do_objects(ls_flag_t flag, bool no_companions)
{
if (flag == ls_flag_t::SAVE)
{
- do_u16b(&value, flag);
- return;
+ // Compact everything before saving
+ compact_objects(0);
+ compact_monsters(0);
}
- if (flag == ls_flag_t::LOAD)
- {
- u16b found;
- do_u16b(&found, flag);
- if (found == value) /* All is good */
- return;
- /* All is bad */
- note(format("Savefile broken %s", place));
- return;
- }
- note(format("Impossible has occurred")); /* Programmer error */
- exit(0);
-}
-
+ u16b n_objects = o_max;
-/*
- * Handle dungeon
- *
- * The monsters/objects must be loaded in the same order
- * that they were stored, since the actual indexes matter.
- */
-static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions)
-{
- int i;
-
- cave_type *c_ptr;
-
- /* Read specific */
- u16b tmp16b = 0;
-
- my_sentinel("Before do_dungeon", 324, flag);
-
- /* Header info */
- do_s16b(&dun_level, flag);
- do_byte(&dungeon_type, flag);
- do_s16b(&num_repro, flag);
- do_s16b(&p_ptr->py, flag);
- do_s16b(&p_ptr->px, flag);
- do_s16b(&cur_hgt, flag);
- do_s16b(&cur_wid, flag);
- do_s16b(&max_panel_rows, flag);
- do_s16b(&max_panel_cols, flag);
-
- do_u32b(&dungeon_flags1, flag);
- do_u32b(&dungeon_flags2, flag);
-
- /* Last teleportation */
- do_s16b(&last_teleportation_y, flag);
- do_s16b(&last_teleportation_y, flag);
-
- /* Spell effects */
- tmp16b = MAX_EFFECTS;
- do_u16b(&tmp16b, flag);
-
- if ((flag == ls_flag_t::LOAD) && (tmp16b > MAX_EFFECTS))
- {
- quit("Too many spell effects");
- }
-
- for (i = 0; i < tmp16b; ++i)
- {
- do_s16b(&effects[i].type, flag);
- do_s16b(&effects[i].dam, flag);
- do_s16b(&effects[i].time, flag);
- do_u32b(&effects[i].flags, flag);
- do_s16b(&effects[i].cx, flag);
- do_s16b(&effects[i].cy, flag);
- do_s16b(&effects[i].rad, flag);
- }
-
- /* TO prevent bugs with evolving dungeons */
- for (i = 0; i < 100; i++)
- {
- do_s16b(&floor_type[i], flag);
- do_s16b(&fill_type[i], flag);
- }
-
- if ((flag == ls_flag_t::LOAD) && (!dun_level && !p_ptr->inside_quest))
- {
- int xstart = 0;
- int ystart = 0;
- /* Init the wilderness */
- process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
- TRUE, FALSE);
-
- /* Init the town */
- xstart = 0;
- ystart = 0;
- init_flags = 0;
- process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
- TRUE, FALSE);
- }
-
- do_grid(flag);
-
- /*** Objects ***/
-
- if (flag == ls_flag_t::SAVE) compact_objects(0);
- if (flag == ls_flag_t::SAVE) compact_monsters(0);
if (flag == ls_flag_t::SAVE)
{
- tmp16b = o_max;
+ u16b tmp16u = n_objects;
if (no_companions)
{
- for (i = 1; i < o_max; i++)
+ for (int i = 1; i < o_max; i++)
{
object_type *o_ptr = &o_list[i];
- if (o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) tmp16b--;
+ if (o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION))
+ {
+ tmp16u--;
+ }
}
}
- /* Item count */
- do_u16b(&tmp16b, flag);
-
- tmp16b = o_max;
+ do_u16b(&tmp16u, flag);
}
else
- /* Read item count */
- do_u16b(&tmp16b, flag);
+ {
+ do_u16b(&n_objects, flag);
+ }
/* Verify maximum */
- if ((flag == ls_flag_t::LOAD) && (tmp16b > max_o_idx))
+ if ((flag == ls_flag_t::LOAD) && (n_objects > max_o_idx))
{
- note(format("Too many (%d) object entries!", tmp16b));
- return (FALSE);
+ note("Too many object entries!");
+ return false;
}
/* Dungeon items */
- for (i = 1; i < tmp16b; i++)
+ if (flag == ls_flag_t::SAVE)
{
- int o_idx;
-
- object_type *o_ptr;
-
- if (flag == ls_flag_t::SAVE)
+ for (std::size_t i = 1; i < n_objects; i++)
{
- o_ptr = &o_list[i];
- /* Don't save objects held by companions when no_companions is set */
- if (no_companions && o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) continue;
+ auto o_ptr = &o_list[i];
+ // Skip objects held by companions when no_companions is set
+ if (no_companions && o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION))
+ {
+ continue;
+ }
do_item(o_ptr, ls_flag_t::SAVE);
- continue; /* Saving is easy */
}
- /* Until the end of the loop, this is all ls_flag_t::LOAD */
-
- /* Get a new record */
- o_idx = o_pop();
-
- /* Oops */
- if (i != o_idx)
+ }
+ else if (flag == ls_flag_t::LOAD)
+ {
+ for (int i = 1; i < n_objects; i++)
{
- note(format("Object allocation error (%d <> %d)", i, o_idx));
- return (FALSE);
- }
+ /* Get a new record */
+ int o_idx = o_pop();
+ /* Oops */
+ if (i != o_idx)
+ {
+ note(format("Object allocation error (%d <> %d)", i, o_idx));
+ return false;
+ }
- /* Acquire place */
- o_ptr = &o_list[o_idx];
+ /* Acquire place */
+ auto o_ptr = &o_list[o_idx];
- /* Read the item */
- do_item(o_ptr, ls_flag_t::LOAD);
+ /* Read the item */
+ do_item(o_ptr, ls_flag_t::LOAD);
- /* Monster */
- if (o_ptr->held_m_idx)
- {
/* Monster */
- monster_type *m_ptr = &m_list[o_ptr->held_m_idx];
+ if (o_ptr->held_m_idx)
+ {
+ /* Monster */
+ monster_type *m_ptr = &m_list[o_ptr->held_m_idx];
- /* Place the object */
- m_ptr->hold_o_idxs.push_back(o_idx);
- }
+ /* Place the object */
+ m_ptr->hold_o_idxs.push_back(o_idx);
+ }
- /* Dungeon */
- else
- {
- /* Access the item location */
- c_ptr = &cave[o_ptr->iy][o_ptr->ix];
+ /* Dungeon */
+ else
+ {
+ /* Access the item location */
+ auto c_ptr = &cave[o_ptr->iy][o_ptr->ix];
- /* Place the object */
- c_ptr->o_idxs.push_back(o_idx);
+ /* Place the object */
+ c_ptr->o_idxs.push_back(o_idx);
+ }
}
}
- /*** Monsters ***/
+ return true;
+}
+
+
+static bool do_monsters(ls_flag_t flag, bool no_companions)
+{
+ auto &r_info = game->edit_data.r_info;
+
+ u16b n_monsters = m_max;
if (flag == ls_flag_t::SAVE)
{
- tmp16b = m_max;
+ u16b tmp16u = m_max;
if (no_companions)
{
- for (i = 1; i < m_max; i++)
+ for (int i = 1; i < m_max; i++)
{
monster_type *m_ptr = &m_list[i];
- if (m_ptr->status == MSTATUS_COMPANION) tmp16b--;
+ if (m_ptr->status == MSTATUS_COMPANION)
+ {
+ tmp16u--;
+ }
}
}
- /* Write the monster count */
- do_u16b(&tmp16b, flag);
-
- tmp16b = m_max;
+ do_u16b(&tmp16u, flag);
}
else
- /* Read the monster count */
- do_u16b(&tmp16b, flag);
+ {
+ do_u16b(&n_monsters, flag);
+ }
/* Validate */
- if ((flag == ls_flag_t::LOAD) && (tmp16b > max_m_idx))
+ if ((flag == ls_flag_t::LOAD) && (n_monsters > max_m_idx))
{
- note(format("Too many (%d) monster entries!", tmp16b));
- return (FALSE);
+ note("Too many monster entries!");
+ return false;
}
- /* Read the monsters */
- for (i = 1; i < tmp16b; i++)
- {
- int m_idx;
- monster_type *m_ptr;
- monster_race *r_ptr;
+ /* Load/save the monsters */
- if (flag == ls_flag_t::SAVE)
+ if (flag == ls_flag_t::SAVE)
+ {
+ for (std::size_t i = 1; i < n_monsters; i++)
{
- m_ptr = &m_list[i];
+ auto m_ptr = &m_list[i];
- /* Don't save companions when no_companions is set */
- if (no_companions && m_ptr->status == MSTATUS_COMPANION) continue;
+ // Skip companions when no_companions is set
+ if (no_companions && m_ptr->status == MSTATUS_COMPANION)
+ {
+ continue;
+ }
do_monster(m_ptr, ls_flag_t::SAVE);
- continue; /* Easy to save a monster */
}
- /* From here on, it's all ls_flag_t::LOAD */
- /* Get a new record */
- m_idx = m_pop();
-
- /* Oops */
- if (i != m_idx)
+ }
+ else if (flag == ls_flag_t::LOAD)
+ {
+ for (int i = 1; i < n_monsters; i++)
{
- note(format("Monster allocation error (%d <> %d)", i, m_idx));
- return (FALSE);
- }
+ /* Get a new record */
+ int m_idx = m_pop();
+
+ /* Oops */
+ if (i != m_idx)
+ {
+ note(format("Monster allocation error (%d <> %d)", i, m_idx));
+ return false;
+ }
- /* Acquire monster */
- m_ptr = &m_list[m_idx];
+ /* Acquire monster */
+ auto m_ptr = &m_list[m_idx];
- /* Read the monster */
- do_monster(m_ptr, ls_flag_t::LOAD);
+ /* Read the monster */
+ do_monster(m_ptr, ls_flag_t::LOAD);
- /* Access grid */
- c_ptr = &cave[m_ptr->fy][m_ptr->fx];
+ /* Place in grid */
+ auto c_ptr = &cave[m_ptr->fy][m_ptr->fx];
+ c_ptr->m_idx = m_idx;
- /* Mark the location */
- c_ptr->m_idx = m_idx;
+ /* Controlled? */
+ if (m_ptr->mflag & MFLAG_CONTROL)
+ {
+ p_ptr->control = m_idx;
+ }
- /* Controlled ? */
- if (m_ptr->mflag & MFLAG_CONTROL)
- p_ptr->control = m_idx;
+ /* Count as an alive member of race */
+ auto r_ptr = &r_info[m_ptr->r_idx];
+ r_ptr->cur_num++;
+ }
+ }
- /* Access race */
- r_ptr = &r_info[m_ptr->r_idx];
+ /* Save/load pets */
+ {
+ const std::size_t sz =
+ (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0;
- /* Count XXX XXX XXX */
- r_ptr->cur_num++;
+ do_array("pets", flag, km_list, sz,
+ [](auto m_ptr, auto flag) {
+ do_monster(m_ptr, flag);
+ }
+ );
}
- /* Read the kept monsters */
+ return true;
+}
- tmp16b = (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0;
+/*
+ * Handle dungeon
+ *
+ * The monsters/objects must be loaded in the same order
+ * that they were stored, since the actual indexes matter.
+ */
+static bool_ do_dungeon(ls_flag_t flag, bool no_companions)
+{
+ /* Header info */
+ do_s16b(&dun_level, flag);
+ do_byte(&dungeon_type, flag);
+ do_s16b(&num_repro, flag);
+ do_s16b(&p_ptr->py, flag);
+ do_s16b(&p_ptr->px, flag);
+ do_s16b(&cur_hgt, flag);
+ do_s16b(&cur_wid, flag);
+ do_s16b(&max_panel_rows, flag);
+ do_s16b(&max_panel_cols, flag);
+
+ do_flag_set(&dungeon_flags, flag);
- /* Read the monster count */
- do_u16b(&tmp16b, flag);
+ /* Last teleportation */
+ do_s16b(&last_teleportation_y, flag);
+ do_s16b(&last_teleportation_y, flag);
+
+ /* Spell effects */
+ do_array("spell effects", flag, effects, MAX_EFFECTS,
+ [](auto effect, auto flag) -> void {
+ do_s16b(&effect->type, flag);
+ do_s16b(&effect->dam, flag);
+ do_s16b(&effect->time, flag);
+ do_u32b(&effect->flags, flag);
+ do_s16b(&effect->cx, flag);
+ do_s16b(&effect->cy, flag);
+ do_s16b(&effect->rad, flag);
+ }
+ );
- /* Hack -- verify */
- if ((flag == ls_flag_t::LOAD) && (tmp16b > max_m_idx))
+ /* To prevent bugs with evolving dungeons */
+ for (std::size_t i = 0; i < 100; i++)
{
- note(format("Too many (%d) monster entries!", tmp16b));
- return (FALSE);
+ do_s16b(&floor_type[i], flag);
+ do_s16b(&fill_type[i], flag);
}
- for (i = 1; i < tmp16b; i++)
+
+ if ((flag == ls_flag_t::LOAD) && (!dun_level && !p_ptr->inside_quest))
{
- monster_type *m_ptr;
+ int xstart = 0;
+ int ystart = 0;
+ /* Init the wilderness */
+ process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
+ TRUE, FALSE);
+
+ /* Init the town */
+ xstart = 0;
+ ystart = 0;
+ init_flags = 0;
+ process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
+ TRUE, FALSE);
+ }
+
+ do_grid(flag);
- /* Acquire monster */
- m_ptr = &km_list[i];
+ /*** Objects ***/
+ if (!do_objects(flag, no_companions))
+ {
+ return FALSE;
+ }
- /* Read the monster */
- do_monster(m_ptr, flag);
+ /*** Monsters ***/
+ if (!do_monsters(flag, no_companions))
+ {
+ return FALSE;
}
/*** Success ***/
@@ -1614,7 +1429,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions)
}
/* Save the current persistent dungeon -SC- */
-void save_dungeon(void)
+void save_dungeon()
{
char tmp[16];
char name[1024], buf[5];
@@ -1623,145 +1438,58 @@ void save_dungeon(void)
if (!get_dungeon_save(buf) || (!dun_level)) return;
/* Construct filename */
- sprintf(tmp, "%s.%s", player_base, buf);
+ sprintf(tmp, "%s.%s", game->player_base.c_str(), buf);
path_build(name, 1024, ANGBAND_DIR_SAVE, tmp);
/* Open the file */
fff = my_fopen(name, "wb");
/* Save the dungeon */
- do_dungeon(ls_flag_t::SAVE, TRUE);
+ do_dungeon(ls_flag_t::SAVE, true);
my_fclose(fff);
}
-bool_ file_exist(cptr buf)
-{
- int fd;
- bool_ result;
-
- /* Open savefile */
- fd = fd_open(buf, O_RDONLY);
-
- /* File exists */
- if (fd >= 0)
- {
- fd_close(fd);
- result = TRUE;
- }
- else
- result = FALSE;
-
- return result;
-}
-
-
-/*
- * Handle monster lore
- */
-static void do_lore(int r_idx, ls_flag_t flag)
-{
- monster_race *r_ptr = &r_info[r_idx];
-
- /* Count sights/deaths/kills */
- do_s16b(&r_ptr->r_sights, flag);
- do_s16b(&r_ptr->r_deaths, flag);
- do_s16b(&r_ptr->r_pkills, flag);
- do_s16b(&r_ptr->r_tkills, flag);
-
- /* Count wakes and ignores */
- do_byte(&r_ptr->r_wake, flag);
- do_byte(&r_ptr->r_ignore, flag);
-
- /* Extra stuff */
- do_byte(&r_ptr->r_xtra1, flag);
- do_byte(&r_ptr->r_xtra2, flag);
-
- /* Count drops */
- do_byte(&r_ptr->r_drop_gold, flag);
- do_byte(&r_ptr->r_drop_item, flag);
-
- /* Count spells */
- do_byte(&r_ptr->r_cast_inate, flag);
- do_byte(&r_ptr->r_cast_spell, flag);
-
- /* Count blows of each type */
- do_byte(&r_ptr->r_blows[0], flag);
- do_byte(&r_ptr->r_blows[1], flag);
- do_byte(&r_ptr->r_blows[2], flag);
- do_byte(&r_ptr->r_blows[3], flag);
-
- /* Memorize flags */
- do_u32b(&r_ptr->r_flags1, flag); /* Just to remind you */
- do_u32b(&r_ptr->r_flags2, flag); /* flag is unrelated to */
- do_u32b(&r_ptr->r_flags3, flag); /* the other argument */
- do_u32b(&r_ptr->r_flags4, flag);
- do_u32b(&r_ptr->r_flags5, flag);
- do_u32b(&r_ptr->r_flags6, flag);
- do_u32b(&r_ptr->r_flags7, flag);
- do_u32b(&r_ptr->r_flags8, flag);
- do_u32b(&r_ptr->r_flags9, flag);
-
- /* Read the "Racial" monster tmp16b per level */
- do_s16b(&r_ptr->max_num, flag);
-
- do_byte((byte*)&r_ptr->on_saved, flag);
-
- if (flag == ls_flag_t::LOAD)
- {
- /* Lore flag repair? */
- r_ptr->r_flags1 &= r_ptr->flags1;
- r_ptr->r_flags2 &= r_ptr->flags2;
- r_ptr->r_flags3 &= r_ptr->flags3;
- r_ptr->r_flags4 &= r_ptr->flags4;
- r_ptr->r_flags5 &= r_ptr->flags5;
- r_ptr->r_flags6 &= r_ptr->flags6;
- }
-}
-
-
-
/*
* Read a store
*/
static void do_store(store_type *str, ls_flag_t flag)
{
- byte store_inven_max = STORE_INVEN_MAX;
-
- /* Some basic info */
+ // Store state
do_s32b(&str->store_open, flag);
do_u16b(&str->owner, flag);
-
- /* Could be cleaner, done this way for benefit of the for loop later on */
- byte num;
- if (flag == ls_flag_t::SAVE) num = str->stock_num;
- do_byte(&num, flag);
-
- /* Last visit */
do_s32b(&str->last_visit, flag);
- /* Items */
- for (int j = 0; j < num; j++)
+ // Items in store
{
- if (flag == ls_flag_t::LOAD)
- /* Can't this be cleaner? */
+ byte num = str->stock.size();
+
+ do_byte(&num, flag);
+
+ if (flag == ls_flag_t::SAVE)
{
- object_type forge;
- /* Wipe the object */
- object_wipe(&forge);
- /* Read the item */
- do_item(&forge, ls_flag_t::LOAD);
- /* Acquire valid items */
- if ((str->stock_num < store_inven_max) && (str->stock_num < str->stock_size))
+ for (std::size_t i = 0; i < num; i++)
{
- int k = str->stock_num++;
+ do_item(&str->stock[i], ls_flag_t::SAVE);
+ }
+ }
+ else if (flag == ls_flag_t::LOAD)
+ {
+ for (std::size_t i = 0; i < num; i++)
+ {
+ object_type forge;
+ object_wipe(&forge);
+ do_item(&forge, ls_flag_t::LOAD);
- /* Acquire the item */
- object_copy(&str->stock[k], &forge);
+ if ((str->stock.size() < STORE_INVEN_MAX) && (str->stock.size() < str->stock_size))
+ {
+ object_type stock_obj;
+ object_copy(&stock_obj, &forge);
+ str->stock.push_back(stock_obj);
+ }
}
}
- if (flag == ls_flag_t::SAVE) do_item(&str->stock[j], flag);
}
}
@@ -1770,26 +1498,24 @@ static void do_store(store_type *str, ls_flag_t flag)
*/
static void do_randomizer(ls_flag_t flag)
{
- int i;
-
- u16b tmp16u = 0;
+ std::string state;
- /* Tmp */
- do_u16b(&tmp16u, flag);
+ if (flag == ls_flag_t::SAVE)
+ {
+ state = get_complex_rng_state();
+ }
- /* Place */
- do_u16b(&Rand_place, flag);
+ do_std_string(state, flag);
- /* State */
- for (i = 0; i < RAND_DEG; i++)
+ if (flag == ls_flag_t::LOAD)
{
- do_u32b(&Rand_state[i], flag);
+ set_complex_rng_state(state);
}
/* Accept */
if (flag == ls_flag_t::LOAD)
{
- Rand_quick = FALSE;
+ set_complex_rng();
}
}
@@ -1815,90 +1541,92 @@ static void do_options(ls_flag_t flag)
/*** Special info */
/* Read "delay_factor" */
- do_byte(&delay_factor, flag);
+ do_byte(&options->delay_factor, flag);
/* Read "hitpoint_warn" */
- do_byte(&hitpoint_warn, flag);
+ do_byte(&options->hitpoint_warn, flag);
/*** Cheating options ***/
- if (flag == ls_flag_t::LOAD) /* There *MUST* be some nice way to unify this! */
- {
- u16b c;
- do_u16b(&c, ls_flag_t::LOAD);
- if (c & 0x0002) wizard = TRUE;
- cheat_peek = (c & 0x0100) ? TRUE : FALSE;
- cheat_hear = (c & 0x0200) ? TRUE : FALSE;
- cheat_room = (c & 0x0400) ? TRUE : FALSE;
- cheat_xtra = (c & 0x0800) ? TRUE : FALSE;
- cheat_know = (c & 0x1000) ? TRUE : FALSE;
- cheat_live = (c & 0x2000) ? TRUE : FALSE;
- }
- if (flag == ls_flag_t::SAVE)
- {
- u16b c = 0;
- if (wizard) c |= 0x0002;
- if (cheat_peek) c |= 0x0100;
- if (cheat_hear) c |= 0x0200;
- if (cheat_room) c |= 0x0400;
- if (cheat_xtra) c |= 0x0800;
- if (cheat_know) c |= 0x1000;
- if (cheat_live) c |= 0x2000;
- do_u16b(&c, ls_flag_t::SAVE);
- }
+ do_bool(&wizard, flag);
+ do_bool(&options->cheat_peek, flag);
+ do_bool(&options->cheat_hear, flag);
+ do_bool(&options->cheat_room, flag);
+ do_bool(&options->cheat_xtra, flag);
+ do_bool(&options->cheat_live, flag);
- do_byte((byte*)&autosave_l, flag);
- do_byte((byte*)&autosave_t, flag);
- do_s16b(&autosave_freq, flag);
+ /*** Autosave options */
+ do_bool(&options->autosave_l, flag);
+ do_bool(&options->autosave_t, flag);
+ do_s16b(&options->autosave_freq, flag);
- if (flag == ls_flag_t::LOAD)
+ // Standard options
{
- /* Read the option flags */
- for (n = 0; n < 8; n++) do_u32b(&oflag[n], flag);
+ std::vector<option_value> option_values;
- /* Read the option masks */
- for (n = 0; n < 8; n++) do_u32b(&mask[n], flag);
+ // If we're saving we need to map to a vector of key-value pairs.
+ if (flag == ls_flag_t::SAVE)
+ {
+ for (auto const &option: options->standard_options)
+ {
+ option_values.emplace_back(
+ option_value {
+ option.o_text,
+ *option.o_var
+ }
+ );
+ }
+ }
- /* Analyze the options */
- for (n = 0; n < 8; n++)
+ // Read/write the option values
+ do_vector(flag, option_values, do_option_value);
+
+ // If we're loading we need to set options based of the key-value pairs.
+ if (flag == ls_flag_t::LOAD)
{
- /* Analyze the options */
- for (i = 0; i < 32; i++)
+ // Go through all the options that were loaded.
+ for (auto const &option_value: option_values)
{
- /* Process valid flags */
- if (mask[n] & (1L << i))
+ // We need to search through all the options
+ // that are actually in the game; we'll ignore
+ // saved options that are now gone.
+ const option_type *found_option;
+ for (auto const &option: options->standard_options)
{
- /* Process valid flags */
- if (option_mask[n] & (1L << i))
+ if (option_value.name == option.o_text)
{
- /* Set */
- if (oflag[n] & (1L << i))
- {
- /* Set */
- option_flag[n] |= (1L << i);
- }
-
- /* Clear */
- else
- {
- /* Clear */
- option_flag[n] &= ~(1L << i);
- }
+ found_option = &option;
+ break;
}
}
+
+ // If we found the option, we'll set the value.
+ if (found_option)
+ {
+ *(*found_option).o_var = option_value.value;
+ }
}
}
+ }
+ if (flag == ls_flag_t::LOAD)
+ {
/*** Window Options ***/
/* Read the window flags */
- for (n = 0; n < 8; n++) do_u32b(&oflag[n], flag);
+ for (n = 0; n < ANGBAND_TERM_MAX; n++)
+ {
+ do_u32b(&oflag[n], flag);
+ }
/* Read the window masks */
- for (n = 0; n < 8; n++) do_u32b(&mask[n], flag);
+ for (n = 0; n < ANGBAND_TERM_MAX; n++)
+ {
+ do_u32b(&mask[n], flag);
+ }
/* Analyze the options */
- for (n = 0; n < 8; n++)
+ for (n = 0; n < ANGBAND_TERM_MAX; n++)
{
/* Analyze the options */
for (i = 0; i < 32; i++)
@@ -1927,61 +1655,34 @@ static void do_options(ls_flag_t flag)
}
}
}
+
if (flag == ls_flag_t::SAVE)
{
- /* Analyze the options */
- for (i = 0; option_info[i].o_desc; i++)
- {
- int os = option_info[i].o_page;
- int ob = option_info[i].o_bit;
-
- /* Process real entries */
- if (option_info[i].o_var)
- {
- /* Set */
- if (*option_info[i].o_var)
- {
- /* Set */
- option_flag[os] |= (1L << ob);
- }
-
- /* Clear */
- else
- {
- /* Clear */
- option_flag[os] &= ~(1L << ob);
- }
- }
- }
-
-
- /*** Normal options ***/
-
- /* Dump the flags */
- for (i = 0; i < 8; i++) do_u32b(&option_flag[i], flag);
-
- /* Dump the masks */
- for (i = 0; i < 8; i++) do_u32b(&option_mask[i], flag);
-
/*** Window options ***/
/* Dump the flags */
- for (i = 0; i < 8; i++) do_u32b(&window_flag[i], flag);
+ for (i = 0; i < ANGBAND_TERM_MAX; i++)
+ {
+ do_u32b(&window_flag[i], flag);
+ }
/* Dump the masks */
- for (i = 0; i < 8; i++) do_u32b(&window_mask[i], flag);
+ for (i = 0; i < ANGBAND_TERM_MAX; i++)
+ {
+ do_u32b(&window_mask[i], flag);
+ }
}
}
/*
- * Handle player inventory
- *
- * FIXME! This function probably could be unified better
- * Note that the inventory is "re-sorted" later by "dungeon()".
+ * Handle player inventory. Note that the inventory is
+ * "re-sorted" later by "dungeon()".
*/
static bool_ do_inventory(ls_flag_t flag)
{
+ auto const &a_info = game->edit_data.a_info;
+
if (flag == ls_flag_t::LOAD)
{
int slot = 0;
@@ -2058,63 +1759,56 @@ static bool_ do_inventory(ls_flag_t flag)
}
if (flag == ls_flag_t::SAVE)
{
- u16b i;
- u16b sent = 0xFFFF;
- for (i = 0; i < INVEN_TOTAL; i++)
+ for (u16b i = 0; i < INVEN_TOTAL; i++)
{
object_type *o_ptr = &p_ptr->inventory[i];
if (!o_ptr->k_idx) continue;
do_u16b(&i, flag);
do_item(o_ptr, flag);
}
- do_u16b(&sent, ls_flag_t::SAVE); /* Sentinel */
+ // Sentinel
+ u16b sent = 0xFFFF;
+ do_u16b(&sent, ls_flag_t::SAVE);
}
/* Success */
return (TRUE);
}
+static void do_message(message &msg, ls_flag_t flag)
+{
+ do_std_string(msg.text, flag);
+ do_u32b(&msg.count, flag);
+ do_byte(&msg.color, flag);
+}
+
/*
* Read the saved messages
*/
-static void do_messages(ls_flag_t flag) /* FIXME! We should be able to unify this better */
+static void do_messages(ls_flag_t flag)
{
- int i;
- char buf[128];
- byte color;
+ auto &messages = game->messages;
- s16b num;
-
- /* Total */
- if (flag == ls_flag_t::SAVE) num = message_num();
+ /* Save/load number of messages */
+ s16b num = messages.size();
do_s16b(&num, flag);
/* Read the messages */
- if (flag == ls_flag_t::LOAD)
+ for (int i = 0; i < num; i++)
{
- byte tmp8u = 0;
- for (i = 0; i < num; i++)
- {
- /* Read the message */
- do_string(buf, 128, ls_flag_t::LOAD);
- do_byte(&color, flag);
- do_byte(&tmp8u, flag);
+ message message;
- /* Save the message */
- message_add(buf, color);
+ if (flag == ls_flag_t::SAVE)
+ {
+ message = messages.at(i);
}
- }
- if (flag == ls_flag_t::SAVE)
- {
- byte holder;
- byte zero = 0;
- for (i = num - 1; i >= 0; i--)
+
+ do_message(message, flag);
+
+ if (flag == ls_flag_t::LOAD)
{
- do_string((char *)message_str((s16b)i), 0, ls_flag_t::SAVE);
- holder = message_color((s16b)i);
- do_byte(&holder, flag);
- do_byte(&zero, flag);
+ messages.add(message);
}
}
}
@@ -2128,7 +1822,7 @@ bool_ load_dungeon(char *ext)
s16b old_dun = dun_level;
/* Construct name */
- sprintf(tmp, "%s.%s", player_base, ext);
+ sprintf(tmp, "%s.%s", game->player_base.c_str(), ext);
path_build(name, 1024, ANGBAND_DIR_SAVE, tmp);
/* Open the file */
@@ -2144,7 +1838,7 @@ bool_ load_dungeon(char *ext)
}
/* Read the dungeon */
- if (!do_dungeon(ls_flag_t::LOAD, FALSE))
+ if (!do_dungeon(ls_flag_t::LOAD, false))
{
dun_level = old_dun;
dungeon_type = old_dungeon_type;
@@ -2161,35 +1855,16 @@ bool_ load_dungeon(char *ext)
return (TRUE);
}
-void do_fate(int i, ls_flag_t flag)
-{
- if ((flag == ls_flag_t::LOAD) && (i >= MAX_FATES)) i = MAX_FATES - 1;
-
- do_byte(&fates[i].fate, flag);
- do_byte(&fates[i].level, flag);
- do_byte(&fates[i].serious, flag);
- do_s16b(&fates[i].o_idx, flag);
- do_s16b(&fates[i].e_idx, flag);
- do_s16b(&fates[i].a_idx, flag);
- do_s16b(&fates[i].v_idx, flag);
- do_s16b(&fates[i].r_idx, flag);
- do_s16b(&fates[i].count, flag);
- do_s16b(&fates[i].time, flag);
- do_byte((byte*)&fates[i].know, flag);
-}
-
/*
* Load/save timers.
*/
static void do_timers(ls_flag_t flag)
{
- timer_type *t_ptr;
-
- for (t_ptr = gl_timers; t_ptr != NULL; t_ptr = t_ptr->next)
+ for (auto &&t_ptr: game->timers)
{
- do_bool(&t_ptr->enabled, flag);
- do_s32b(&t_ptr->delay, flag);
- do_s32b(&t_ptr->countdown, flag);
+ do_std_bool(&t_ptr->m_enabled, flag);
+ do_s32b(&t_ptr->m_delay, flag);
+ do_s32b(&t_ptr->m_countdown, flag);
}
}
@@ -2198,41 +1873,41 @@ static void do_timers(ls_flag_t flag)
*/
static void do_stores(ls_flag_t flag)
{
- u16b tmp16u;
- u16b real_max = 0;
+ auto const &st_info = game->edit_data.st_info;
- /* Note that this forbids max_towns from shrinking, but that is fine */
- std::unique_ptr<byte[]> reals(new byte[max_towns]);
+ // Indexes for "real" towns.
+ std::vector<byte> reals;
+ reals.reserve(max_towns);
- /* Find the real towns */
+ // Fill in the "real" towns if necessary.
if (flag == ls_flag_t::SAVE)
{
for (int i = 1; i < max_towns; i++)
{
- if (!(town_info[i].flags & (TOWN_REAL))) continue;
- reals[real_max++] = i;
+ if (!(town_info[i].flags & TOWN_REAL))
+ {
+ continue;
+ }
+ reals.emplace_back(i);
}
}
- do_u16b(&real_max, flag);
- for (int i = 0; i < real_max; i++)
- {
- do_byte((byte*)&reals[i], flag);
- }
+
+ // Load/save
+ do_vector(flag, reals, do_byte);
/* Read the stores */
- if (flag == ls_flag_t::SAVE) tmp16u = max_st_idx;
- do_u16b(&tmp16u, flag);
- assert(tmp16u <= max_st_idx);
+ u16b n_stores = st_info.size();
+ do_u16b(&n_stores, flag);
+ assert(n_stores <= st_info.size());
- /* Ok now read the real towns */
- for (int i = 0; i < real_max; i++)
+ for (auto const z: reals)
{
- int z = reals[i];
-
- /* Ultra paranoia */
- if (!town_info[z].stocked) create_stores_stock(z);
+ if (!town_info[z].stocked)
+ {
+ create_stores_stock(z);
+ }
- for (int j = 0; j < tmp16u; j++)
+ for (int j = 0; j < n_stores; j++)
{
do_store(&town_info[z].store[j], flag);
}
@@ -2240,395 +1915,398 @@ static void do_stores(ls_flag_t flag)
}
/*
- * Note that this function may not be needed at all.
- * It was taken out of load_player_aux(). Do we need it?
+ * Monster memory
*/
-static void junkinit(void)
+static bool do_monster_lore(ls_flag_t flag)
{
- int i, j;
- p_ptr->inside_quest = 0;
- p_ptr->town_num = 1;
- p_ptr->wilderness_x = 4;
- p_ptr->wilderness_y = 4;
- for (i = 0; i < max_wild_x; i++)
- {
- for (j = 0; j < max_wild_y; j++)
- {
- wild_map[j][i].seed = rand_int(0x10000000);
+ auto &r_info = game->edit_data.r_info;
+
+ do_array("monster races", flag, r_info, r_info.size(),
+ [](auto r_ptr, auto flag) -> void {
+ do_s16b(&r_ptr->r_pkills, flag);
+ do_s16b(&r_ptr->max_num, flag);
+ do_bool(&r_ptr->on_saved, flag);
}
- }
-}
+ );
-static void morejunk(void)
-{
- sp_ptr = &sex_info[p_ptr->psex]; /* Sex */
- rp_ptr = &race_info[p_ptr->prace]; /* Raceclass */
- rmp_ptr = &race_mod_info[p_ptr->pracem];
- cp_ptr = &class_info[p_ptr->pclass];
- spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec];
+ return true;
}
/*
- * Actually read the savefile
+ * Object memory
*/
-static bool_ do_savefile_aux(ls_flag_t flag)
+static bool do_object_lore(ls_flag_t flag)
{
- int i, j;
+ auto &k_info = game->edit_data.k_info;
- byte tmp8u;
- u16b tmp16u;
+ do_array("object kinds", flag, k_info, k_info.size(),
+ [](auto k_ptr, auto flag) -> void {
+ do_bool(&k_ptr->aware, flag);
+ do_bool(&k_ptr->tried, flag);
+ do_bool(&k_ptr->artifact, flag);
+ }
+ );
- /* Mention the savefile version */
- if (flag == ls_flag_t::LOAD)
+ return true;
+}
+
+
+static bool do_towns(ls_flag_t flag)
+{
+ auto &d_info = game->edit_data.d_info;
+
+ u16b max_towns_ldsv = max_towns;
+
+ do_u16b(&max_towns_ldsv, flag);
+
+ if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_towns))
{
- if (vernum < 100)
- {
- note(format("Savefile version %lu too old! ", vernum));
- return FALSE;
- }
- else
- {
- note(format("Loading version %lu savefile... ", vernum));
- }
+ note("Too many towns!");
+ return false;
}
+
if (flag == ls_flag_t::SAVE)
{
- sf_when = time((time_t *) 0); /* Note when file was saved */
- sf_saves++; /* Increment the saves ctr */
+ max_towns_ldsv = TOWN_RANDOM;
}
- /* Handle version bytes. FIXME! DG wants me to change this all around */
- if (flag == ls_flag_t::LOAD)
- {
- u32b mt32b;
- byte mtbyte;
+ do_u16b(&max_towns_ldsv, flag);
- /* Discard all this, we've already read it */
- do_u32b(&mt32b, flag);
- do_byte(&mtbyte, flag);
- }
- if (flag == ls_flag_t::SAVE)
+ if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv != TOWN_RANDOM))
{
- u32b saver;
- saver = SAVEFILE_VERSION;
- do_u32b(&saver, flag);
- tmp8u = (byte)rand_int(256);
- do_byte(&tmp8u, flag); /* 'encryption' */
+ note("Different random towns base!");
+ return false;
}
- /* Kept only for compatibility; always set to 0 */
+ for (std::size_t i = 0; i < max_towns; i++)
{
- u32b tmp32u = 0;
- do_u32b(&tmp32u, flag);
- }
+ auto town = &town_info[i];
- /* Time of last save */
- do_u32b(&sf_when, flag);
+ do_bool(&town->destroyed, flag);
- /* Number of past lives */
- do_u16b(&sf_lives, flag);
+ if (i >= TOWN_RANDOM)
+ {
+ do_seed(&town->seed, flag);
+ do_byte(&town->flags, flag);
- /* Number of times saved */
- do_u16b(&sf_saves, flag);
+ // Create stock if necessary
+ if ((town_info->flags & TOWN_REAL) && (flag == ls_flag_t::LOAD))
+ {
+ create_stores_stock(i);
+ }
+ }
+ }
- /* Game module */
if (flag == ls_flag_t::SAVE)
- strcpy(loaded_game_module, game_module);
- do_string(loaded_game_module, 80, flag);
-
- /* Timers */
- do_timers(flag);
-
- /* Read RNG state */
- do_randomizer(flag);
-
- /* Automatizer state */
- do_byte((byte*)&automatizer_enabled, flag);
+ {
+ max_towns_ldsv = d_info.size();
+ }
- /* Then the options */
- do_options(flag);
+ do_u16b(&max_towns_ldsv, flag);
- /* Then the "messages" */
- do_messages(flag);
+ if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > d_info.size()))
+ {
+ note("Too many dungeon types!");
+ return false;
+ }
- /* Monster Memory */
- if (flag == ls_flag_t::SAVE) tmp16u = max_r_idx;
- do_u16b(&tmp16u, flag);
+ // Town quest entrances
+ u16b max_quests_ldsv = TOWN_DUNGEON;
+ do_u16b(&max_quests_ldsv, flag);
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (tmp16u > max_r_idx))
+ if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv > TOWN_DUNGEON))
{
- note(format("Too many (%u) monster races!", tmp16u));
- return (FALSE);
+ note("Too many town per dungeons!");
+ return false;
}
- /* Read the available records */
- for (i = 0; i < tmp16u; i++)
+ for (std::size_t i = 0; i < max_towns_ldsv; i++)
{
- /* Read the lore */
- do_lore(i, flag);
+ for (std::size_t j = 0; j < max_quests_ldsv; j++)
+ {
+ do_s16b(&(d_info[i].t_idx[j]), flag);
+ do_s16b(&(d_info[i].t_level[j]), flag);
+ }
+ do_s16b(&(d_info[i].t_num), flag);
}
- /* Object Memory */
- if (flag == ls_flag_t::SAVE) tmp16u = max_k_idx;
- do_u16b(&tmp16u, flag);
+ return true;
+}
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (tmp16u > max_k_idx))
- {
- note(format("Too many (%u) object kinds!", tmp16u));
- return (FALSE);
- }
+static bool do_quests(ls_flag_t flag)
+{
+ do_array("quests", flag, quest, MAX_Q_IDX,
+ [](auto q, auto flag) {
+ // Load/save the data
+ do_s16b(&q->status, flag);
+ for (auto &quest_data : q->data)
+ {
+ do_s32b(&quest_data, flag);
+ }
+ // Initialize if necessary
+ if ((flag == ls_flag_t::LOAD) && (q->init != NULL))
+ {
+ q->init();
+ }
+ }
+ );
+
+ return true;
+}
+
+static bool do_wilderness(ls_flag_t flag)
+{
+ auto &wilderness = game->wilderness;
+
+ // Player position and "mode" wrt. wilderness
+ do_s32b(&p_ptr->wilderness_x, flag);
+ do_s32b(&p_ptr->wilderness_y, flag);
+ do_bool(&p_ptr->wild_mode, flag);
+ do_bool(&p_ptr->old_wild_mode, flag);
- /* Read the object memory */
- for (i = 0; i < tmp16u; i++) do_xtra(i, flag);
- if (flag == ls_flag_t::LOAD) junkinit();
+ // Size of the wilderness
+ u16b wild_x_size = wilderness.width();
+ u16b wild_y_size = wilderness.height();
+ do_u16b(&wild_x_size, flag);
+ do_u16b(&wild_y_size, flag);
+ if (flag == ls_flag_t::LOAD)
{
- u16b max_towns_ldsv;
- u16b max_quests_ldsv;
- if (flag == ls_flag_t::SAVE) max_towns_ldsv = max_towns;
- /* Number of towns */
- do_u16b(&max_towns_ldsv, flag);
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_towns))
+ if ((wild_x_size > wilderness.width()) || (wild_y_size > wilderness.height()))
{
- note(format("Too many (%u) towns!", max_towns_ldsv));
- return (FALSE);
+ note("Wilderness is too big!");
+ return false;
}
- /* Min of random towns */
- if (flag == ls_flag_t::SAVE) max_towns_ldsv = TOWN_RANDOM;
- do_u16b(&max_towns_ldsv, flag);
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv != TOWN_RANDOM))
+ }
+
+ // Save/load wilderness tile state
+ for (std::size_t x = 0; x < wild_x_size; x++)
+ {
+ for (std::size_t y = 0; y < wild_y_size; y++)
{
- note(format("Different random towns base (%u)!", max_towns_ldsv));
- return (FALSE);
+ auto w = &wilderness(x, y);
+ do_seed(&w->seed, flag);
+ do_u16b(&w->entrance, flag);
+ do_bool(&w->known, flag);
}
+ }
- for (i = 0; i < max_towns; i++)
- {
- do_byte((byte*)&town_info[i].destroyed, flag);
+ return true;
+}
- if (i >= TOWN_RANDOM)
- {
- do_u32b(&town_info[i].seed, flag);
- do_byte(&town_info[i].numstores, flag);
- do_byte(&town_info[i].flags, flag);
+static void do_randart(random_artifact *ra_ptr, ls_flag_t flag)
+{
+ do_std_string(ra_ptr->name_full, flag);
+ do_std_string(ra_ptr->name_short, flag);
+ do_byte(&ra_ptr->level, flag);
+ do_byte(&ra_ptr->attr, flag);
+ do_u32b(&ra_ptr->cost, flag);
+ do_byte(&ra_ptr->activation, flag);
+ do_byte(&ra_ptr->generated, flag);
+}
- /* If the town is realy used create a sock */
- if ((town_info[i].flags & (TOWN_REAL)) && (flag == ls_flag_t::LOAD))
- {
- create_stores_stock(i);
- }
- }
+static bool do_randarts(ls_flag_t flag)
+{
+ do_vector(flag, game->random_artifacts, do_randart);
+ return true;
+}
+
+static bool do_artifacts(ls_flag_t flag)
+{
+ auto &a_info = game->edit_data.a_info;
+
+ do_array("artifacts", flag, a_info, a_info.size(),
+ [](auto a_ptr, auto flag) {
+ do_byte(&a_ptr->cur_num, flag);
}
+ );
- /* Number of dungeon */
- if (flag == ls_flag_t::SAVE) max_towns_ldsv = max_d_idx;
- do_u16b(&max_towns_ldsv, flag);
+ return true;
+}
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_d_idx))
- {
- note(format("Too many dungeon types (%u)!", max_towns_ldsv));
- return (FALSE);
+static bool do_fates(ls_flag_t flag)
+{
+ do_array("fates", flag, fates, MAX_FATES,
+ [](auto fate, auto flag) {
+ do_byte(&fate->fate, flag);
+ do_byte(&fate->level, flag);
+ do_byte(&fate->serious, flag);
+ do_s16b(&fate->o_idx, flag);
+ do_s16b(&fate->e_idx, flag);
+ do_s16b(&fate->a_idx, flag);
+ do_s16b(&fate->v_idx, flag);
+ do_s16b(&fate->r_idx, flag);
+ do_s16b(&fate->count, flag);
+ do_s16b(&fate->time, flag);
+ do_bool(&fate->know, flag);
}
+ );
- /* Number of towns per dungeon */
- if (flag == ls_flag_t::SAVE) max_quests_ldsv = TOWN_DUNGEON;
- do_u16b(&max_quests_ldsv, flag);
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv > TOWN_DUNGEON))
- {
- note(format("Too many town per dungeons (%u)!", max_quests_ldsv));
- return (FALSE);
+ return true;
+}
+
+static bool do_floor_inscriptions(ls_flag_t flag)
+{
+ do_array("inscriptions", flag, p_ptr->inscriptions, MAX_INSCRIPTIONS,
+ [](auto i_ptr, auto flag) {
+ do_std_bool(i_ptr, flag);
}
+ );
- for (i = 0; i < max_towns_ldsv; i++)
- {
- for (j = 0; j < max_quests_ldsv; j++)
- {
- do_s16b(&(d_info[i].t_idx[j]), flag);
- do_s16b(&(d_info[i].t_level[j]), flag);
- }
- do_s16b(&(d_info[i].t_num), flag);
+ return true;
+}
+
+static bool do_player_hd(ls_flag_t flag)
+{
+ auto &player_hp = game->player_hp;
+
+ do_array("hit dice entries", flag, player_hp, PY_MAX_LEVEL,
+ [](auto hp_ptr, auto flag) {
+ do_s16b(hp_ptr, flag);
}
+ );
- /* Sanity check number of quests */
- if (flag == ls_flag_t::SAVE) max_quests_ldsv = MAX_Q_IDX;
- do_u16b(&max_quests_ldsv, flag);
+ return true;
+}
+
+
+/*
+ * Actually read the savefile
+ */
+static bool_ do_savefile_aux(ls_flag_t flag)
+{
+ auto &class_info = game->edit_data.class_info;
+ auto const &race_info = game->edit_data.race_info;
+ auto const &race_mod_info = game->edit_data.race_mod_info;
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv != MAX_Q_IDX))
+ /* Mention the savefile version */
+ if (flag == ls_flag_t::LOAD)
+ {
+ if (vernum != SAVEFILE_VERSION)
{
- note(format("Invalid number of quests (%u)!", max_quests_ldsv));
- return (FALSE);
+ note("Incompatible save file version");
+ return FALSE;
}
+ }
- for (i = 0; i < MAX_Q_IDX; i++)
- {
- do_s16b(&quest[i].status, flag);
- for (auto &quest_data : quest[i].data)
- {
- do_s32b(&quest_data, flag);
- }
+ /* Handle version bytes */
+ if (flag == ls_flag_t::LOAD)
+ {
+ /* Discard all this, we've already read it */
+ u32b mt32b;
+ do_u32b(&mt32b, flag);
+ }
+ if (flag == ls_flag_t::SAVE)
+ {
+ u32b saver;
+ saver = SAVEFILE_VERSION;
+ do_u32b(&saver, flag);
+ }
- /* Init the hooks */
- if ((flag == ls_flag_t::LOAD) && (quest[i].init != NULL))
- {
- quest[i].init(i);
- }
- }
+ /* Game module */
+ {
+ std::string loaded_game_module;
- /* Position in the wilderness */
- do_s32b(&p_ptr->wilderness_x, flag);
- do_s32b(&p_ptr->wilderness_y, flag);
- do_byte((byte*)&p_ptr->wild_mode, flag);
- do_byte((byte*)&p_ptr->old_wild_mode, flag);
+ if (flag == ls_flag_t::SAVE)
+ {
+ loaded_game_module = game_module;
+ }
+ do_std_string(loaded_game_module, flag);
+ // Check for incompatible module
+ if (flag == ls_flag_t::LOAD)
{
- s32b wild_x_size, wild_y_size;
- if (flag == ls_flag_t::SAVE)
+ if (!module_savefile_loadable(loaded_game_module))
{
- wild_x_size = max_wild_x;
- wild_y_size = max_wild_y;
- }
- /* Size of the wilderness */
- do_s32b(&wild_x_size, flag);
- do_s32b(&wild_y_size, flag);
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) &&
- ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y)))
- {
- note(format("Wilderness is too big (%u/%u)!",
- wild_x_size, wild_y_size));
- return (FALSE);
- }
- /* Wilderness seeds */
- for (i = 0; i < wild_x_size; i++)
- {
- for (j = 0; j < wild_y_size; j++)
- {
- do_u32b(&wild_map[j][i].seed, flag);
- do_u16b(&wild_map[j][i].entrance, flag);
- do_byte((byte*)&wild_map[j][i].known, flag);
- }
+ note(fmt::format("Bad game module. Savefile was saved with module '{:s}' but game is '{:s}'.",
+ loaded_game_module,
+ game_module).c_str());
+ return FALSE;
}
}
}
- /* Load the random artifacts. */
- if (flag == ls_flag_t::SAVE) tmp16u = MAX_RANDARTS;
- do_u16b(&tmp16u, flag);
- if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_RANDARTS))
+ /* Timers */
+ do_timers(flag);
+
+ /* Read RNG state */
+ do_randomizer(flag);
+
+ /* Automatizer state */
+ do_bool(&automatizer_enabled, flag);
+
+ /* Then the options */
+ do_options(flag);
+
+ /* Then the "messages" */
+ do_messages(flag);
+
+ if (!do_monster_lore(flag))
{
- note(format("Too many (%u) random artifacts!", tmp16u));
- return (FALSE);
+ return FALSE;
}
- for (i = 0; i < tmp16u; i++)
- {
- random_artifact *ra_ptr = &random_artifacts[i];
- do_string(ra_ptr->name_full, 80, flag);
- do_string(ra_ptr->name_short, 80, flag);
- do_byte(&ra_ptr->level, flag);
- do_byte(&ra_ptr->attr, flag);
- do_u32b(&ra_ptr->cost, flag);
- do_byte(&ra_ptr->activation, flag);
- do_byte(&ra_ptr->generated, flag);
+ if (!do_object_lore(flag))
+ {
+ return FALSE;
}
- /* Load the Artifacts */
- if (flag == ls_flag_t::SAVE) tmp16u = max_a_idx;
- do_u16b(&tmp16u, flag);
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (tmp16u > max_a_idx))
+ if (!do_towns(flag))
{
- note(format("Too many (%u) artifacts!", tmp16u));
- return (FALSE);
+ return FALSE;
}
- /* Read the artifact flags */
- for (i = 0; i < tmp16u; i++)
+ if (!do_quests(flag))
{
- do_byte(&(&a_info[i])->cur_num, flag);
+ return FALSE;
}
- /* Fates */
- if (flag == ls_flag_t::SAVE) tmp16u = MAX_FATES;
- do_u16b(&tmp16u, flag);
-
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_FATES))
+ if (!do_wilderness(flag))
{
- note(format("Too many (%u) fates!", tmp16u));
- return (FALSE);
+ return FALSE;
}
- /* Read the fate flags */
- for (i = 0; i < tmp16u; i++)
+ if (!do_randarts(flag))
{
- do_fate(i, flag);
+ return FALSE;
}
- /* Load the Traps */
- if (flag == ls_flag_t::SAVE) tmp16u = max_t_idx;
- do_u16b(&tmp16u, flag);
-
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (tmp16u > max_t_idx))
+ if (!do_artifacts(flag))
{
- note(format("Too many (%u) traps!", tmp16u));
- return (FALSE);
+ return FALSE;
}
- /* fate flags */
- for (i = 0; i < tmp16u; i++)
+ if (!do_fates(flag))
{
- do_byte((byte*)&t_info[i].ident, flag);
+ return FALSE;
}
- /* inscription knowledge */
- if (flag == ls_flag_t::SAVE) tmp16u = MAX_INSCRIPTIONS;
- do_u16b(&tmp16u, flag);
-
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_INSCRIPTIONS))
+ if (!do_floor_inscriptions(flag))
{
- note(format("Too many (%u) inscriptions!", tmp16u));
- return (FALSE);
+ return FALSE;
}
- /* Read the inscription flag */
- for (i = 0; i < tmp16u; i++)
- do_byte((byte*)&inscription_info[i].know, flag);
-
-
- /* Read the extra stuff */
if (!do_extra(flag))
+ {
return FALSE;
+ }
-
- /* player_hp array */
- if (flag == ls_flag_t::SAVE) tmp16u = PY_MAX_LEVEL;
- do_u16b(&tmp16u, flag);
- /* Incompatible save files */
- if ((flag == ls_flag_t::LOAD) && (tmp16u > PY_MAX_LEVEL))
+ if (!do_player_hd(flag))
{
- note(format("Too many (%u) hitpoint entries!", tmp16u));
- return (FALSE);
+ return FALSE;
}
- /* Read the player_hp array */
- for (i = 0; i < tmp16u; i++)
+ if (flag == ls_flag_t::LOAD)
{
- do_s16b(&player_hp[i], flag);
+ // Make sure that the auxiliary pointers for player
+ // class, race, etc. point to the right places.
+ rp_ptr = &race_info[p_ptr->prace];
+ rmp_ptr = &race_mod_info[p_ptr->pracem];
+ cp_ptr = &class_info[p_ptr->pclass];
+ spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec];
}
- if (flag == ls_flag_t::LOAD) morejunk();
-
/* Read the pet command settings */
do_byte(&p_ptr->pet_follow_distance, flag);
do_byte(&p_ptr->pet_open_doors, flag);
@@ -2638,10 +2316,13 @@ static bool_ do_savefile_aux(ls_flag_t flag)
do_s16b(&p_ptr->dripping_tread, flag);
/* Read the inventory */
- if (!do_inventory(flag) && (flag == ls_flag_t::LOAD)) /* do NOT reverse this ordering */
+ if (!do_inventory(flag))
{
- note("Unable to read inventory");
- return (FALSE);
+ if (flag == ls_flag_t::LOAD)
+ {
+ note("Unable to read inventory");
+ return FALSE;
+ }
}
/* Stores */
@@ -2651,35 +2332,25 @@ static bool_ do_savefile_aux(ls_flag_t flag)
if (!death)
{
/* Dead players have no dungeon */
- if (flag == ls_flag_t::LOAD) note("Restoring Dungeon...");
- if ((flag == ls_flag_t::LOAD) && (!do_dungeon(ls_flag_t::LOAD, FALSE)))
+ if (flag == ls_flag_t::LOAD)
+ {
+ note("Restoring Dungeon...");
+ }
+
+ if ((flag == ls_flag_t::LOAD) && (!do_dungeon(ls_flag_t::LOAD, false)))
{
note("Error reading dungeon data");
- return (FALSE);
+ return FALSE;
}
- if (flag == ls_flag_t::SAVE) do_dungeon(ls_flag_t::SAVE, FALSE);
- my_sentinel("Before ghost data", 435, flag);
- my_sentinel("After ghost data", 320, flag);
- }
- {
- byte foo = 0;
if (flag == ls_flag_t::SAVE)
{
- /*
- * Safety Padding. It's there
- * for a good reason. Trust me on
- * this. Keep this at the *END*
- * of the file, and do *NOT* try to
- * read it. Insert any new stuff before
- * this position.
- */
- do_byte(&foo, ls_flag_t::SAVE);
+ do_dungeon(ls_flag_t::SAVE, false);
}
}
/* Success */
- return (TRUE);
+ return TRUE;
}
@@ -2687,7 +2358,7 @@ static bool_ do_savefile_aux(ls_flag_t flag)
/*
* Actually read the savefile
*/
-static errr rd_savefile(void)
+static errr rd_savefile()
{
errr err = 0;
@@ -2725,10 +2396,8 @@ static errr rd_savefile(void)
* Note that we always try to load the "current" savefile, even if
* there is no such file, so we must check for "empty" savefile names.
*/
-bool_ load_player(void)
+bool_ load_player()
{
- int fd = -1;
-
errr err = 0;
cptr what = "generic";
@@ -2747,7 +2416,7 @@ bool_ load_player(void)
/* XXX XXX XXX Fix this */
/* Verify the existance of the savefile */
- if (!file_exist(savefile))
+ if (!boost::filesystem::exists(savefile))
{
/* Give a message */
msg_format("Savefile does not exist: %s", savefile);
@@ -2761,45 +2430,34 @@ bool_ load_player(void)
if (!err)
{
/* Open the savefile */
- fd = fd_open(savefile, O_RDONLY);
+ int fd = fd_open(savefile, O_RDONLY);
/* No file */
if (fd < 0) err = -1;
/* Message (below) */
if (err) what = "Cannot open savefile";
+
+ /* Close the file */
+ if (!err) fd_close(fd);
}
/* Process file */
if (!err)
{
- byte tmp8u = 0;
-
/* Open the file XXX XXX XXX XXX Should use Angband file interface */
fff = my_fopen(savefile, "rb");
-/* fff = fdopen(fd, "r"); */
/* Read the first four bytes */
do_u32b(&vernum, ls_flag_t::LOAD);
- do_byte(&tmp8u, ls_flag_t::LOAD); // For comatibility with old savefiles
- /* XXX XXX XXX XXX Should use Angband file interface */
my_fclose(fff);
- /* fclose(fff) */
- /* Close the file */
- fd_close(fd);
}
/* Process file */
if (!err)
{
-
- /* Extract version */
- sf_major = VERSION_MAJOR;
- sf_minor = VERSION_MINOR;
- sf_patch = VERSION_PATCH;
-
/* Clear screen */
Term_clear();
@@ -2840,9 +2498,6 @@ bool_ load_player(void)
return (TRUE);
}
- /* Count lives */
- sf_lives++;
-
/* Forget turns */
turn = old_turn = 0;
@@ -2857,7 +2512,7 @@ bool_ load_player(void)
if (p_ptr->chp >= 0)
{
/* Reset cause of death */
- (void)strcpy(died_from, "(alive and well)");
+ game->died_from = "(alive and well)";
}
/* Success */
@@ -2866,8 +2521,8 @@ bool_ load_player(void)
/* Message */
- msg_format("Error (%s) reading %d.%d.%d savefile.",
- what, sf_major, sf_minor, sf_patch);
+ msg_format("Error (%s) reading savefile (version " FMTu32b ").",
+ what, vernum);
msg_print(NULL);
/* Oops */
@@ -2895,7 +2550,7 @@ static bool_ save_player_aux(char *name)
if (fd >= 0)
{
/* Close the "fd" */
- (void)fd_close(fd);
+ fd_close(fd);
/* Open the savefile */
fff = my_fopen(name, "wb");
@@ -2914,7 +2569,7 @@ static bool_ save_player_aux(char *name)
if (!ok)
{
/* Remove "broken" files */
- (void)fd_kill(name);
+ fd_kill(name);
}
}
@@ -2928,7 +2583,7 @@ static bool_ save_player_aux(char *name)
/*
* Attempt to save the player in a savefile
*/
-bool_ save_player(void)
+bool_ save_player()
{
int result = FALSE;
char safe[1024];
diff --git a/src/loadsave.h b/src/loadsave.h
index 61bfced7..52782dac 100644
--- a/src/loadsave.h
+++ b/src/loadsave.h
@@ -7,9 +7,8 @@
extern "C" {
#endif
-/* loadsave.c */
-extern void save_dungeon(void);
-extern bool_ save_player(void);
+void save_dungeon();
+bool_ save_player();
#ifdef __cplusplus
} // extern "C"
diff --git a/src/loadsave.hpp b/src/loadsave.hpp
index a9eb9dc8..d28d437e 100644
--- a/src/loadsave.hpp
+++ b/src/loadsave.hpp
@@ -2,6 +2,5 @@
#include "h-basic.h"
-extern bool_ file_exist(cptr buf);
-extern bool_ load_dungeon(char *ext);
-extern bool_ load_player(void);
+bool_ load_dungeon(char *ext);
+bool_ load_player();
diff --git a/src/lua_bind.cc b/src/lua_bind.cc
index aa2c3a2a..3ca43716 100644
--- a/src/lua_bind.cc
+++ b/src/lua_bind.cc
@@ -10,6 +10,7 @@
#include "cmd7.hpp"
#include "corrupt.hpp"
+#include "game.hpp"
#include "init1.hpp"
#include "monster2.hpp"
#include "player_type.hpp"
@@ -85,6 +86,8 @@ s32b lua_get_level(spell_type *spell, s32b lvl, s32b max, s32b min, s32b bonus)
static s32b get_level_device_1(spell_type *spell, s32b max, s32b min)
{
+ auto const &s_info = game->s_info;
+
// Must be in "device" mode.
assert(get_level_use_stick > -1);
// Delegate
@@ -146,7 +149,7 @@ static s32b spell_chance_school(s32b s)
minfail = adj_mag_fail[stat_ind];
/* Must have Perfect Casting to get below 5% */
- if (!(has_ability(AB_PERFECT_CASTING)))
+ if (!(p_ptr->has_ability(AB_PERFECT_CASTING)))
{
if (minfail < 5) minfail = 5;
}
@@ -185,7 +188,7 @@ s32b spell_chance_book(s32b s)
return spell_chance_school(s);
}
-s32b get_level(s32b s, s32b max, s32b min)
+static s32b get_level_full(s32b s, s32b max, s32b min)
{
auto spell = spell_at(s);
/** Ahah shall we use Magic device instead ? */
@@ -196,6 +199,16 @@ s32b get_level(s32b s, s32b max, s32b min)
}
}
+s32b get_level(s32b s, s32b max)
+{
+ return get_level_full(s, max, 0);
+}
+
+s32b get_level_s(int sp, int max)
+{
+ return get_level_full(sp, max, 1);
+}
+
/* Level gen */
void get_map_size(const char *name, int *ysize, int *xsize)
{
@@ -217,31 +230,6 @@ void load_map(const char *name, int *y, int *x)
process_dungeon_file(name, y, x, cur_hgt, cur_wid, TRUE, TRUE);
}
-/*
- * Some misc functions
- */
-char *lua_input_box(cptr title, int max)
-{
- static char buf[80];
- int wid, hgt;
-
- strcpy(buf, "");
- Term_get_size(&wid, &hgt);
- if (!input_box(title, hgt / 2, wid / 2, buf, (max > 79) ? 79 : max))
- return buf;
- return buf;
-}
-
-char lua_msg_box(cptr title)
-{
- int wid, hgt;
-
- Term_get_size(&wid, &hgt);
- return msg_box(title, hgt / 2, wid / 2);
-}
-
-
-
void increase_mana(int delta)
{
p_ptr->csp += delta;
@@ -261,7 +249,7 @@ timer_type *TIMER_AGGRAVATE_EVIL = 0;
void timer_aggravate_evil_enable()
{
- TIMER_AGGRAVATE_EVIL->enabled = TRUE;
+ TIMER_AGGRAVATE_EVIL->enable();
}
void timer_aggravate_evil_callback()
diff --git a/src/lua_bind.hpp b/src/lua_bind.hpp
index b2a6c9a7..39fc2159 100644
--- a/src/lua_bind.hpp
+++ b/src/lua_bind.hpp
@@ -5,28 +5,26 @@
#include "timer_type_fwd.hpp"
/** Calculate spell failure rate for a device, i.e. a wand or staff. */
-extern s32b spell_chance_device(spell_type *spell_ptr);
+s32b spell_chance_device(spell_type *spell_ptr);
/** Calculate spell failure rate for a spell book. */
-extern s32b spell_chance_book(s32b s);
+s32b spell_chance_book(s32b s);
-extern s32b lua_get_level(struct spell_type *spell, s32b lvl, s32b max, s32b min, s32b bonus);
-extern int get_mana(s32b s);
-extern s32b get_power(s32b s);
-extern s32b get_level(s32b s, s32b max, s32b min);
-extern void get_level_school(struct spell_type *spell, s32b max, s32b min, s32b *level, bool_ *na);
+s32b lua_get_level(struct spell_type *spell, s32b lvl, s32b max, s32b min, s32b bonus);
+int get_mana(s32b s);
+s32b get_power(s32b s);
+s32b get_level(s32b s, s32b max);
+s32b get_level_s(int sp, int max);
+void get_level_school(struct spell_type *spell, s32b max, s32b min, s32b *level, bool_ *na);
extern s32b get_level_max_stick;
extern s32b get_level_use_stick;
-extern void get_map_size(const char *name, int *ysize, int *xsize);
-extern void load_map(const char *name, int *y, int *x);
+void get_map_size(const char *name, int *ysize, int *xsize);
+void load_map(const char *name, int *y, int *x);
-extern char *lua_input_box(cptr title, int max);
-extern char lua_msg_box(cptr title);
-
-extern void increase_mana(int delta);
+void increase_mana(int delta);
extern timer_type *TIMER_AGGRAVATE_EVIL;
diff --git a/src/main-gcu.c b/src/main-gcu.c
index c253daf2..ac41272c 100644
--- a/src/main-gcu.c
+++ b/src/main-gcu.c
@@ -38,12 +38,11 @@
* Consider the use of "savetty()" and "resetty()". XXX XXX XXX
*/
+#include "main.h"
#include "util.h"
#include "variable.h"
-#ifdef USE_GCU
-
#include <limits.h>
/*
@@ -794,7 +793,7 @@ static void hook_quit(cptr str)
*
* Someone should really check the semantics of "initscr()"
*/
-errr init_gcu(int argc, char **argv)
+int init_gcu(int argc, char **argv)
{
int i;
@@ -1015,7 +1014,12 @@ errr init_gcu(int argc, char **argv)
return (0);
}
-
-#endif /* USE_GCU */
-
-
+int main(int argc, char *argv[])
+{
+ return main_real(
+ argc,
+ argv,
+ "gcu",
+ init_gcu,
+ " -- -b Requests big screen\n");
+}
diff --git a/src/main-gtk2.c b/src/main-gtk2.c
index ca3eff60..124802c3 100644
--- a/src/main-gtk2.c
+++ b/src/main-gtk2.c
@@ -31,16 +31,11 @@
*/
#include "files.h"
+#include "main.h"
#include "util.h"
#include "variable.h"
-/*
- * Activate variant-specific features
- */
-
-#ifdef USE_GTK2
-
/* Force ANSI standard */
/* #define __STRICT_ANSI__ */
@@ -1897,7 +1892,7 @@ static void hook_quit(cptr str)
/*
* Initialization function
*/
-errr init_gtk2(int argc, char **argv)
+int init_gtk2(int argc, char **argv)
{
int i;
@@ -1974,4 +1969,17 @@ errr init_gtk2(int argc, char **argv)
return (0);
}
-#endif /* USE_GTK2 */
+/**
+ * Main
+ */
+int main(int argc, char *argv[])
+{
+ return main_real(
+ argc,
+ argv,
+ "gtk2",
+ init_gtk2,
+ // Usage:
+ " -- -n# Number of terms to use\n"
+ " -- -b Turn off software backing store\n");
+}
diff --git a/src/main-sdl.c b/src/main-sdl.c
index 9a177cbb..9f429088 100644
--- a/src/main-sdl.c
+++ b/src/main-sdl.c
@@ -23,9 +23,8 @@
// in this Software without prior written authorization from the author(s).
*/
-#ifdef USE_SDL
-
#include "loadsave.h"
+#include "main.h"
#include "util.h"
#include "variable.h"
@@ -39,7 +38,7 @@
/*************************************************
GLOBAL SDL-ToME PROPERTIES
*************************************************/
-
+
/* Default window properties - used if none are available
from other places*/
#define DEF_SCREEN_WIDTH 800
@@ -60,6 +59,10 @@ These properties are the size and also default font to load. */
#define DEF_FONT_SIZE 14
#define DEF_FONT_FILE "VeraMono.ttf"
+#ifndef PATH_MAX
+#define PATH_MAX 4096 /* # chars in a path name including nul */
+#endif
+
/* The font properties that may perhaps be changed at runtime,
due to environmental variables, preference files, or in-program
commands.*/
@@ -110,7 +113,7 @@ can be stored up before doing an update. This
should cut down on screen flicker */
static bool_ suspendUpdate = FALSE;
-/* some helper surfaces that are used for rendering
+/* some helper surfaces that are used for rendering
characters */
static SDL_Surface *worksurf;
static SDL_Surface *crayon;
@@ -133,7 +136,7 @@ int t_width = 0, t_height = 0;
/*************************************************
COLOR SETUP
*************************************************/
-
+
/* Simple black, mapped using the format of the main screen */
int screen_black;
@@ -191,15 +194,15 @@ struct _term_data
/* this rectangle is in screen coordinates */
int border_thick; /* thickness of border to draw around window */
- int border_color; /* current color of the border */
+ int border_color; /* current color of the border */
uint cushion_x_top, cushion_x_bot, cushion_y_top, cushion_y_bot;
/* empty space cushion between border and tiles */
-
+
uint tile_width; /* the width of each tile (graphic or otherwise)*/
uint tile_height; /* the height of each tile (graphic or otherwise)*/
SDL_Surface *surf; /* the surface that graphics for this screen are
- rendered to before blitting to main screen */
+ rendered to before blitting to main screen */
int black,white,purple; /* basic colors keyed to this terminal's surface */
};
@@ -254,14 +257,14 @@ whenever a rect needs updated */
/* A complete screen redraw macro */
#define SDL_REDRAW_SCREEN \
SDL_UpdateRect(screen,0,0,arg_width,arg_height)
-
+
/*************************************************
QUITTING
*************************************************/
/* function prototype */
void dumpWindowSettings(void);
-
+
/* SDL Quitting function... declare a few functions first.*/
void killFontAndAlphabet(void);
static void sdl_quit(cptr string)
@@ -274,11 +277,11 @@ static void sdl_quit(cptr string)
TTF_Quit();
/* Then exit SDL */
SDL_Quit();
-
+
/* Dump the window properties, if available */
if (window_properties_set)
dumpWindowSettings();
-
+
/* And now for the default quit behavior */
quit_aux = 0;
quit(string);
@@ -312,7 +315,7 @@ void killFontAndAlphabet(void)
text[i] = NULL;
}
}
-}
+}
/* loadAndRenderFont is responsible for loading and initializing
a font. First, SDL_ttf calls are made to load and set the style
@@ -348,7 +351,7 @@ void loadAndRenderFont(char *fname, int size)
t_height = TTF_FontHeight(font);
/* position of the y=0 line in each tile */
midline = TTF_FontAscent(font);
-
+
/* now... render each of the individual characters */
for (i=0;i<128;i++)
{
@@ -461,7 +464,7 @@ void handleEvent(SDL_Event *event)
*
* All of the things that happen are defined in pref-sdl.prf
*/
-
+
KEYPRESS_STRING("\["); /*Output the first part... */
/* See if a control key is down */
if (event->key.keysym.mod & KMOD_CTRL)
@@ -579,13 +582,13 @@ static errr Term_xtra_sdl(int n, int v)
*/
/* If terminal display has been held for any reason,
- then update the whole thing now!*/
+ then update the whole thing now!*/
DB("TERM_XTRA_FRESH");
if (suspendUpdate)
{
DB(" update WAS suspended... updating now");
td = (term_data*)(Term->data);
- suspendUpdate = FALSE;
+ suspendUpdate = FALSE;
drawTermStuff(td,NULL);
}
return (0);
@@ -686,12 +689,12 @@ SDL_Surface *createSurface(int width, int height)
{
SDL_Surface *surf;
int surface_type;
-
+
if (videoInfo->hw_available)
surface_type = SDL_HWSURFACE;
else
surface_type = SDL_SWSURFACE;
-
+
/* XXX need to make RGBA masks correspond to system pixel format! */
switch (arg_bpp)
{
@@ -726,10 +729,10 @@ SDL_Surface *createSurface(int width, int height)
break;
}
}
-
+
if (surf == NULL)
sdl_quit("Bad Surface Creation!");
-
+
return surf;
}
@@ -741,7 +744,7 @@ void term_to_screen(SDL_Rect *termrect, term_data *td)
termrect->y += td->rect.y;
}
-/* Do the opposite, take a rectangle in screen coordinates and transform
+/* Do the opposite, take a rectangle in screen coordinates and transform
it into the terminal coordinates of the given term_data */
void screen_to_term(SDL_Rect *scrrect, term_data *td)
{
@@ -760,7 +763,7 @@ void screen_to_term(SDL_Rect *scrrect, term_data *td)
( (r1.y > (r2.y+r2.h)) | (r2.y > (r1.y+r1.h)) ) )
/* A function to calculate the intersection of two rectangles. Takes base
-rectangle and then updates it to include only the rectangles that intersect
+rectangle and then updates it to include only the rectangles that intersect
with the test rectangle. If there is an intersection, the function returns
TRUE and base now contains the intersecting rectangle. If there is no
intersection, then the function returns FALSE */
@@ -774,7 +777,7 @@ bool_ intersectRects(SDL_Rect *base, SDL_Rect *test)
base->w -= test->x - base->x;
base->x = test->x;
}
- /* Scoot the x-coordinates for the right side*/
+ /* Scoot the x-coordinates for the right side*/
if ( (test->x + test->w) < (base->x + base->w) )
{
base->w = test->x + test->w - base->x;
@@ -785,7 +788,7 @@ bool_ intersectRects(SDL_Rect *base, SDL_Rect *test)
base->h -= test->y - base->y;
base->y = test->y;
}
- /* Scoot the lower y-coordinates */
+ /* Scoot the lower y-coordinates */
if ( (test->y + test->h) < (base->y + base->h) )
{
base->h = test->y + test->h - base->y;
@@ -803,7 +806,7 @@ changed to the joined rectangle */
SDL_Rect joinRects(SDL_Rect *r1, SDL_Rect *r2)
{
SDL_Rect out = {0,0,0,0};
-
+
if ( (r1 != NULL) & (r2 != NULL) )
{
/* Lower x-coordinate */
@@ -828,7 +831,7 @@ SDL_Rect joinRects(SDL_Rect *r1, SDL_Rect *r2)
}
return out;
}
-
+
/* Given a term_data (and its associated screen) and a rectangle in terminal
coordinates (with NULL signifying to take the whole terminal surface), blit
graphics from the term_data surface to the screen, using the term_data's rect
@@ -854,7 +857,7 @@ void drawTermStuff(term_data *td, SDL_Rect *rect)
}
if (n == MAX_CONSOLE_COUNT)
printf("Could not find terminal in display list...\n");
- /* now loop through and see if any terminals completely occlude
+ /* now loop through and see if any terminals completely occlude
the desired spot; if num=0, note that this will be skipped */
if (rect == NULL)
{
@@ -907,7 +910,7 @@ void drawTermStuff(term_data *td, SDL_Rect *rect)
/* this terminal intersects... re-blit */
/* first, convert to term coordinates */
isect_term.x = isect_scr.x; isect_term.y = isect_scr.y;
- isect_term.w = isect_scr.w; isect_term.h = isect_scr.h;
+ isect_term.w = isect_scr.w; isect_term.h = isect_scr.h;
screen_to_term(&isect_term,term_order[n]);
/* blit from term coordinates to screen coordinates */
SDL_BlitSurface(term_order[n]->surf,&isect_term,\
@@ -921,7 +924,7 @@ void drawTermStuff(term_data *td, SDL_Rect *rect)
}
}
}
-
+
/* utility routine for creating and setting the color of the cursor;
it could be useful for setting a new cursor color if desired.
Could later be expanded to do other stuff with the cursor,
@@ -934,10 +937,10 @@ void createCursor(byte r, byte g, byte b, byte a)
/* and create it anew! (or the first time) */
cursor = createSurface(t_width,t_height);
-
+
/* be sure to use alpha channel when blitting! */
SDL_SetAlpha(cursor,SDL_SRCALPHA,0);
-
+
/* just set the color for now - drawing rectangles
needs surface locking for some setups */
cursor_color = SDL_MapRGBA(cursor->format,r,g,b,a);
@@ -958,7 +961,7 @@ static errr Term_curs_sdl(int x, int y)
base.y = td->surf->clip_rect.y + y*t_height;
base.w = t_width;
base.h = t_height;
-
+
/* blit the cursor over top of the given spot;
note that surface should not be locked
(see note in Term_text_sdl() below) */
@@ -979,21 +982,21 @@ void eraseTerminal(void)
/* temporarily remove clipping rectangle */
SDL_SetClipRect(td->surf,NULL);
- SDL_LOCK(td->surf);
+ SDL_LOCK(td->surf);
/* flood terminal with border color */
SDL_FillRect(td->surf,NULL,td->border_color);
-
+
/* get smaller rectangle to hollow out window */
base.x = td->border_thick;
base.y = td->border_thick;
base.w = td->rect.w - 2*td->border_thick;
base.h = td->rect.h - 2*td->border_thick;
-
+
/* hollow out terminal */
SDL_FillRect(td->surf,&base,td->black);
SDL_UNLOCK(screen);
-
+
/* reset clipping rectangle */
base.x += td->cushion_x_top;
base.y += td->cushion_y_top;
@@ -1003,7 +1006,7 @@ void eraseTerminal(void)
printf("Clip rect: %d %d %d %d\n",base.x,base.y,base.w,base.h);
/* And... UPDATE the whole thing */
drawTermStuff(td,NULL);
-
+
}
/*
@@ -1154,7 +1157,7 @@ Details to follow below! */
void resizeTerminal(int width, int height)
{
term_data *td = (term_data*)(Term->data);
-
+
/* First of all, bound the input width and height to satisfy
these conditions:
- The main ToME window should be at least 80 cols, 24 rows
@@ -1191,39 +1194,39 @@ void resizeTerminal(int width, int height)
BOUND(height,1,MAX_HEIGHT(td));
}
}
-
- /* Okay, now make sure that something has ACTUALLY changed
+
+ /* Okay, now make sure that something has ACTUALLY changed
before doing anything */
if ((width != td->cols) || (height != td->rows))
{
-
+
/* Now, ask zterm to please resize the term structure! */
Term_resize(width,height);
/* Reactivate, since Term_resize seems to activate the
main window again...*/
Term_activate(&td->t);
-
+
/* It might not have resized completely to the new
size we wanted (some windows have size limits it seems,
like the message window). So, update our structure with
the size that were actually obtained.*/
td->cols = Term->wid;
td->rows = Term->hgt;
-
+
/* And recalculate the sizes */
- UPDATE_SIZE(td);
-
+ UPDATE_SIZE(td);
+
/* Create a new surface that can hold the updated size */
SDL_FreeSurface(td->surf);
td->surf = createSurface(td->rect.w,td->rect.h);
/* Now we should be in business for a complete redraw! */
Term_redraw();
-
+
/* Re-blit everything so it looks good */
recompose();
-
+
/* That's it! */
}
}
@@ -1233,7 +1236,7 @@ just changing the pos_x/pos_y values and redrawing!*/
void moveTerminal(int x, int y)
{
term_data *td = (term_data*)(Term->data);
-
+
/* Now, the window is being shifted about... much simpler
situation to handle! But of course, the window must not
drift too far or else parts will be hanging off the screen
@@ -1248,7 +1251,7 @@ void moveTerminal(int x, int y)
{
BOUND(y,0,MAX_Y(td));
}
-
+
/* Okay, now make sure that something changed before doing
anything */
if ((x != td->rect.x) || (y != td->rect.y))
@@ -1256,10 +1259,10 @@ void moveTerminal(int x, int y)
/* Now update OUR structure */
td->rect.x = x;
td->rect.y = y;
-
+
/* Then do a reblit to see the results */
recompose();
-
+
/* That's it! */
}
}
@@ -1270,17 +1273,17 @@ void bringToTop(int current)
term_data *td;
int n = 0;
int i;
-
+
/* Get the pointer to the desired term_data from the data structure */
td = &data[current];
-
+
printf("Current stack: \n");
for (i=0;i<arg_console_count;i++)
{
printf(" %d: %p\n",i,term_order[i]);
}
printf("\n");
-
+
/* Find the number in the term_order stack */
while ((term_order[n] != td) & (n < MAX_CONSOLE_COUNT))
{
@@ -1288,9 +1291,9 @@ void bringToTop(int current)
}
if (n == MAX_CONSOLE_COUNT)
printf("Could not find terminal in display list...\n");
-
+
printf("Order is %d\n",n);
-
+
/* Now move all lower-indexed pointers up one index */
while (n)
{
@@ -1302,14 +1305,14 @@ void bringToTop(int current)
}
/* And stick this term_data pointer on top */
term_order[0] = td;
-
+
printf("Final stack: \n");
for (i=0;i<arg_console_count;i++)
{
printf(" %d: %p\n",i,term_order[i]);
}
printf("\n");
-
+
}
/* This utility routine will cycle the active term to the
@@ -1323,14 +1326,14 @@ int cycleTerminal(int current)
border */
data[current].border_color = data[current].white;
Term_redraw();
-
+
/* increment the terminal number*/
current++;
- /* now do a little modulo cycle action and
+ /* now do a little modulo cycle action and
activate the next term! */
current %= arg_console_count;
Term_activate(&(data[current].t));
-
+
/* before redrawing, set the border color to purple to
indicate that this terminal is being manipulated*/
data[current].border_color = data[current].purple;
@@ -1338,10 +1341,10 @@ int cycleTerminal(int current)
/* then bring this terminal to the top of the order, so it is drawn on
top during manipulation mode */
bringToTop(current);
-
+
/* and do a complete redraw */
Term_redraw();
-
+
/* return the current terminal... */
return current;
}
@@ -1355,13 +1358,13 @@ void recompose(void)
SDL_LOCK(screen);
SDL_FillRect(screen,NULL,screen_black);
SDL_UNLOCK(screen);
-
+
/* cycle through the term_order */
while (i--)
{
SDL_BlitSurface(term_order[i]->surf,NULL,screen,&(term_order[i]->rect));
}
-
+
/* Update everything */
SDL_REDRAW_SCREEN;
}
@@ -1385,14 +1388,14 @@ void redrawAllTerminals(void)
/* Re-order the terminals */
term_order[i] = &data[i];
}
-
+
i = arg_console_count;
/* cycle down through each terminal */
while (i--)
{
/* Activate this terminal */
Term_activate(&(data[i].t));
-
+
/* Make its border white since manipulation mode is over */
data[i].border_color = data[i].white;
@@ -1407,7 +1410,7 @@ void redrawAllTerminals(void)
printf(" %d: %p\n",i,term_order[i]);
}
printf("\n");
-
+
/* now update the screen completely, just in case*/
SDL_REDRAW_SCREEN;
}
@@ -1448,18 +1451,18 @@ void manipulationMode(void)
/* start with the main terminal */
current_term = 0;
-
+
/* get the pointer */
td = &data[0];
-
+
/* before redrawing, set the border color to purple to
indicate that this terminal is being manipulated*/
td->border_color = td->purple;
-
+
/* and do a complete redraw */
DB("Term_redraw");
Term_redraw();
-
+
/* Now keep looping until Esc has been pressed. */
while (!done)
{
@@ -1488,10 +1491,10 @@ void manipulationMode(void)
/* Return... cycle the terminals!
update the current_term appropriately*/
current_term = cycleTerminal(current_term);
-
+
/* Get the new term_data */
td = &data[current_term];
-
+
break;
}
case SDLK_RIGHT:
@@ -1512,10 +1515,10 @@ void manipulationMode(void)
/* control is down... multiply by 10 */
value *= 10;
}
-
+
/* Now, behavior depends on which key was pressed
and whether we are in moveMode resize mode... */
-
+
/* First, set the delta_x/y based on key */
if (event.key.keysym.sym == SDLK_RIGHT)
{
@@ -1537,8 +1540,8 @@ void manipulationMode(void)
delta_x = 0;
delta_y = -1;
}
-
- /* Now either moveTerminal() or
+
+ /* Now either moveTerminal() or
resizeTerminal() based on value of
moveMode! */
if (moveMode)
@@ -1569,11 +1572,11 @@ void manipulationMode(void)
{
/* Mouse is moving... maybe move or resize the window, based
on the state of the mouse buttons */
-
+
/* To keep the motion quick, temporarily ignore all mouse motion
events until window moving is complete */
SDL_EventState(SDL_MOUSEMOTION,SDL_IGNORE);
-
+
if(event.motion.state & SDL_BUTTON(1))
{
/* the left mouse button is down, move the window,
@@ -1583,12 +1586,12 @@ void manipulationMode(void)
/* save the most current mouse location */
SDL_GetMouseState(&mouse_x,&mouse_y);
}
-
+
if(event.motion.state & SDL_BUTTON(3))
{
/* the right mouse button is down, so resize the window;
do a differential, but divide the number by the tile sizes */
-
+
/* see if at least one whole tile width/height has been
reached */
int delta_cols, delta_rows;
@@ -1605,10 +1608,10 @@ void manipulationMode(void)
SDL_GetMouseState(&mouse_x,&mouse_y);
}
}
-
+
/* Deal with mouse motion again */
SDL_EventState(SDL_MOUSEMOTION,SDL_ENABLE);
-
+
}
}
/* Perform the last redraw to take all changes
@@ -1626,11 +1629,11 @@ static errr term_data_init(term_data *td, int i)
char env_var[80];
cptr val;
-
+
/***** load position, size information */
-
- int cols, rows, x, y;
-
+
+ int cols, rows, x, y;
+
/* grab the column and row counts from
environmental variables for now */
sprintf(env_var,"TOME_NUM_COLS_%d",i);
@@ -1687,7 +1690,7 @@ static errr term_data_init(term_data *td, int i)
/* store these values in the term_data structure */
td->rows = rows;
td->cols = cols;
-
+
/* the position will be loaded from environmental
variables as well - for the time being*/
/* x-location */
@@ -1723,10 +1726,10 @@ static errr term_data_init(term_data *td, int i)
/* and store these values into the structure */
td->rect.x = x;
td->rect.y = y;
-
+
/*********** term structure initializing */
-
- /* Initialize the term
+
+ /* Initialize the term
gets: pointer to address, number of columns, number of rows, number
of keypresses to queue up (guess 24?)*/
term_init(t, cols, rows, 24);
@@ -1746,7 +1749,7 @@ static errr term_data_init(term_data *td, int i)
Term_activate(t);
/************* finish term_data intializing */
-
+
/* name of this term window */
td->name = angband_term_name[i];
@@ -1758,7 +1761,7 @@ static errr term_data_init(term_data *td, int i)
td->cushion_x_bot = 1;
td->cushion_y_top = 1;
td->cushion_y_bot = 1;
-
+
/* Now calculate the total width and height*/
UPDATE_SIZE(td);
@@ -1769,8 +1772,8 @@ static errr term_data_init(term_data *td, int i)
/* Key some colors to this surface */
td->black = SDL_MapRGB(td->surf->format, 0, 0, 0);
td->white = SDL_MapRGB(td->surf->format,255,255,255);
- td->purple = SDL_MapRGB(td->surf->format,255, 0,255);
-
+ td->purple = SDL_MapRGB(td->surf->format,255, 0,255);
+
/* Turn on a border, thickness specified by BORDER_THICKNESS */
td->border_thick = BORDER_THICKNESS;
@@ -1785,14 +1788,14 @@ static errr term_data_init(term_data *td, int i)
}
/* dumpWindowSettings is responsible for exporting all current
-values of the window positions, etc. to the screen, so that
+values of the window positions, etc. to the screen, so that
the user can see what the final values were after tweaking */
void dumpWindowSettings(void)
{
char name[80];
char value[8];
int i;
-
+
DB("Dumping settings");
printf("---------------------------\n");
/* cycle through each available terminal */
@@ -1806,15 +1809,15 @@ void dumpWindowSettings(void)
sprintf(name,"TOME_Y_POS_%d",i);
sprintf(value,"%d",data[i].rect.y);
- printf("%s=%s\n",name,value);
+ printf("%s=%s\n",name,value);
sprintf(name,"TOME_NUM_COLS_%d",i);
sprintf(value,"%d",data[i].cols);
- printf("%s=%s\n",name,value);
+ printf("%s=%s\n",name,value);
sprintf(name,"TOME_NUM_ROWS_%d",i);
sprintf(value,"%d",data[i].rows);
- printf("%s=%s\n",name,value);
+ printf("%s=%s\n",name,value);
/* Simple! */
printf("\n");
@@ -1824,19 +1827,19 @@ void dumpWindowSettings(void)
/* The main-sdl initialization routine!
This routine processes arguments, opens the SDL
window, loads fonts, etc. */
-errr init_sdl(int argc, char **argv)
+int init_sdl(int argc, char **argv)
{
int i;
char filename[PATH_MAX + 1];
const char file_sep = '.';
/* Flags to pass to SDL_SetVideoMode */
- int videoFlags;
+ int videoFlags;
/* Before sdl_quit could possible be called, need to make sure that the text
array is zeroed, so that sdl_quit->killFontAndAlphabet() doesn't try to free
SDL_Surfaces that don't exist ! */
memset(text,0,sizeof(text));
-
+
/* Also, clear out the term order array */
memset(term_order,0,sizeof(term_order));
@@ -1850,7 +1853,7 @@ errr init_sdl(int argc, char **argv)
/* get video info, to be used for determining if hardware acceleration is
available, pixel format, etc.... */
videoInfo = SDL_GetVideoInfo();
-
+
/* Environment calls to retrieve specific settings...
Note that these can be overridden by the command-line
arguments that are handled below */
@@ -1864,7 +1867,7 @@ errr init_sdl(int argc, char **argv)
arg_bpp = atoi(getenv("TOME_SCREEN_BPP"));
if(getenv("TOME_FONT_SIZE"))
arg_font_size = atoi(getenv("TOME_FONT_SIZE"));
-
+
/* Argument handling routine;
the argv pointer is already pointing at the '--'
argument, so just start from there, parsing each
@@ -1880,7 +1883,7 @@ errr init_sdl(int argc, char **argv)
printf("Argument missing for option -n\n");
return -1;
}
-
+
arg_console_count = atoi(argv[i]);
if (arg_console_count <= 0 || \
arg_console_count > MAX_CONSOLE_COUNT)
@@ -1897,7 +1900,7 @@ errr init_sdl(int argc, char **argv)
printf("Argument missing for option -w\n");
return -1;
}
-
+
arg_width = atoi(argv[i]);
}
/* Set the SDL window/screen height in pixels */
@@ -1908,7 +1911,7 @@ errr init_sdl(int argc, char **argv)
printf("Argument missing for option -h\n");
return -1;
}
-
+
arg_height = atoi(argv[i]);
}
/* Set the SDL window/screen color depth
@@ -1920,7 +1923,7 @@ errr init_sdl(int argc, char **argv)
printf("Argument missing for option -bpp\n");
return -1;
}
-
+
arg_bpp = atoi(argv[i]);
if ( (arg_bpp != 8) && (arg_bpp != 16) \
&& (arg_bpp != 24) && (arg_bpp != 32) )
@@ -1944,7 +1947,7 @@ errr init_sdl(int argc, char **argv)
printf("Please specify font size!\n");
return -1;
}
-
+
arg_font_size = atoi(argv[i]);
}
/* change the font to use */
@@ -1960,23 +1963,23 @@ errr init_sdl(int argc, char **argv)
printf("Please specify a true-type font found in /lib/xtra/font!\n");
return -1;
}
-
+
/* tokenize the font name so that no .ttf extension
is required */
strcpy(arg_font_name,\
strtok(argv[i],&file_sep));
-
+
/* and append the extension */
strcat(arg_font_name,".ttf");
/* print a little debug message, so
user sees what font was actually selected */
printf("\tUsing font: %s\n",arg_font_name);
-
+
/* maybe check to see if file is even
existant in /lib/xtra/font */
}
-
+
} /* end argument handling */
/* Make sure that the engine will shutdown SDL properly*/
@@ -2005,11 +2008,11 @@ errr init_sdl(int argc, char **argv)
}
DB("Video Mode Set!");
-
+
/* now switch into full screen if asked for */
if (arg_full_screen)
SDL_WM_ToggleFullScreen(screen);
-
+
DB("SDL Window Created!");
/* Now ready the fonts! */
@@ -2030,7 +2033,7 @@ errr init_sdl(int argc, char **argv)
worksurf = createSurface(t_width,t_height);
crayon = createSurface(t_width,t_height);
-
+
/* The working surface will blit using alpha values... */
SDL_SetAlpha(worksurf,SDL_SRCALPHA,0);
@@ -2069,12 +2072,12 @@ errr init_sdl(int argc, char **argv)
/* Save global entry */
angband_term[i] = Term;
-
+
/* Add into term_order */
term_order[i] = td;
-
+
}
-
+
/* And setup the basic screen colors -- these are keyed to the format of
the main terminal surface */
screen_black = SDL_MapRGB(screen->format, 0, 0, 0);
@@ -2082,14 +2085,14 @@ errr init_sdl(int argc, char **argv)
suspendUpdate = FALSE; /* now draw everything */
redrawAllTerminals();
/*SDL_REDRAW_SCREEN;*/
-
+
/* now that the windows have been set, their settings can
be dumped upon quit! */
window_properties_set = TRUE;
/* Enable UNICODE keysyms - needed for current eventHandling routine */
SDL_EnableUNICODE(1);
-
+
/* Enable key repeat! */
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
@@ -2097,4 +2100,18 @@ errr init_sdl(int argc, char **argv)
return 0;
}
-#endif
+int main(int argc, char *argv[])
+{
+ return main_real(
+ argc,
+ argv,
+ "sdl",
+ init_sdl,
+ " -- -n # Number of virtual consoles to use\n"
+ " -- -w # Request screen width in pixels\n"
+ " -- -h # Request screen height in pixels\n"
+ " -- -bpp # Request screen color depth in bits\n"
+ " -- -fs Start with full-screen display\n"
+ " -- -s # Request font size\n"
+ " -- -f <font> Request true-type font by name\n");
+}
diff --git a/src/main-win.c b/src/main-win.c
index a2daffbe..54336a37 100644
--- a/src/main-win.c
+++ b/src/main-win.c
@@ -74,9 +74,6 @@
#include "util.h"
#include "variable.h"
-#ifdef WINDOWS
-
-
/*
* Extract the "WIN32" flag from the compiler
*/
@@ -2066,7 +2063,7 @@ static void check_for_save_file(LPSTR cmd_line)
game_in_progress = TRUE;
/* Play game */
- play_game(FALSE);
+ play_game();
}
@@ -2099,7 +2096,7 @@ static void process_menus(WORD wCmd)
{
game_in_progress = TRUE;
Term_flush();
- play_game(TRUE);
+ play_game();
quit(NULL);
}
break;
@@ -2138,7 +2135,7 @@ ofn.lStructSize = sizeof(OPENFILENAME);
validate_file(savefile);
game_in_progress = TRUE;
Term_flush();
- play_game(FALSE);
+ play_game();
quit(NULL);
}
}
@@ -3326,7 +3323,7 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
check_for_save_file(lpCmdLine);
game_in_progress = TRUE;
- play_game(FALSE);
+ play_game();
/* Prompt the user */
Term_fresh();
@@ -3349,8 +3346,3 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
/* Paranoia */
return (0);
}
-
-
-#endif /* WINDOWS */
-
-
diff --git a/src/main-x11.c b/src/main-x11.c
index b4b242e5..19d2ac94 100644
--- a/src/main-x11.c
+++ b/src/main-x11.c
@@ -93,11 +93,10 @@
*/
#include "loadsave.h"
+#include "main.h"
#include "util.h"
#include "variable.h"
-#ifdef USE_X11
-
#ifndef __MAKEDEPEND__
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -556,7 +555,7 @@ int Term_queue_space(void)
*
* NB: The keys added here will be interpreted by any macros or keymaps.
*/
-errr type_string(char *str, uint len)
+static errr type_string(char *str, uint len)
{
char *s;
@@ -1741,8 +1740,6 @@ error:
XSendEvent(DPY, rq->requestor, FALSE, NoEventMask, &event);
}
-extern errr type_string(char *str, uint len);
-
/*
* Add the contents of the PRIMARY buffer to the input queue.
*
@@ -2584,5 +2581,13 @@ errr init_x11(int argc, char *argv[])
return (0);
}
-#endif /* USE_X11 */
-
+int main(int argc, char *argv[])
+{
+ return main_real(
+ argc,
+ argv,
+ "x11",
+ init_x11,
+ " -- -n# Number of terms to use\n"
+ " -- -d<name> Display to use\n");
+}
diff --git a/src/main.c b/src/main.c
deleted file mode 100644
index 680e5c5a..00000000
--- a/src/main.c
+++ /dev/null
@@ -1,374 +0,0 @@
-/* File: main.c */
-
-/*
- * Copyright (c) 1997 Ben Harrison, and others
- *
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies.
- */
-
-#include "birth.h"
-#include "dungeon.h"
-#include "files.h"
-#include "init2.h"
-#include "modules.h"
-#include "script.h"
-#include "util.h"
-#include "variable.h"
-
-
-
-/*
- * Some machines have a "main()" function in their "main-xxx.c" file,
- * all the others use this file for their "main()" function.
- */
-
-
-#if !defined(WINDOWS)
-
-
-/*
- * A hook for "quit()".
- *
- * Close down, then fall back into "quit()".
- */
-static void quit_hook(cptr s)
-{
- int j;
-
- /* Scan windows */
- for (j = 8 - 1; j >= 0; j--)
- {
- /* Unused */
- if (!angband_term[j]) continue;
-
- /* Nuke it */
- term_nuke(angband_term[j]);
- }
-}
-
-
-
-/*
- * Check existence of ".ToME/" directory in the user's
- * home directory or try to create it if it doesn't exist.
- * Returns FALSE if all the attempts fail.
- */
-static void init_save_dir(void)
-{
- char dirpath[1024];
- char versionpath[1024];
- char savepath[1024];
-
- /* Get an absolute path from the filename */
- path_parse(dirpath, 1024, PRIVATE_USER_PATH);
- strcpy(versionpath, dirpath);
- strcat(versionpath, USER_PATH_VERSION);
- strcpy(savepath, versionpath);
- strcat(savepath, "/save");
-
- if (!private_check_user_directory(dirpath))
- {
- quit_fmt("Cannot create directory '%s'", dirpath);
- }
-
- if (!private_check_user_directory(versionpath))
- {
- quit_fmt("Cannot create directory '%s'", versionpath);
- }
-
- if (!private_check_user_directory(savepath))
- {
- quit_fmt("Cannot create directory '%s'", savepath);
- }
-}
-
-
-static void init_player_name()
-{
- /* Get the user id (?) */
- int player_uid = getuid();
-
- /* Acquire the "user name" as a default player name */
- user_name(player_name, player_uid);
-}
-
-
-
-/*
- * Simple "main" function for multiple platforms.
- *
- * Note the special "--" option which terminates the processing of
- * standard options. All non-standard options (if any) are passed
- * directly to the "init_xxx()" function.
- */
-int main(int argc, char *argv[])
-{
- int i;
-
- bool_ done = FALSE;
-
- bool_ new_game = FALSE;
-
- cptr mstr = NULL;
-
- bool_ args = TRUE;
-
- /* Get the file paths */
- init_file_paths_with_env();
-
- /* Initialize the player name */
- init_player_name();
-
- /* Make sure save directory exists */
- init_save_dir();
-
-
- /* Process the command line arguments */
- for (i = 1; args && (i < argc); i++)
- {
- /* Require proper options */
- if (argv[i][0] != '-') goto usage;
-
- /* Analyze option */
- switch (argv[i][1])
- {
- case 'N':
- case 'n':
- {
- new_game = TRUE;
- break;
- }
-
- case 'W':
- case 'w':
- {
- arg_wizard = TRUE;
- break;
- }
-
- case 'R':
- case 'r':
- {
- arg_force_roguelike = TRUE;
- break;
- }
-
- case 'O':
- case 'o':
- {
- arg_force_original = TRUE;
- break;
- }
-
- case 'u':
- case 'U':
- {
- if (!argv[i][2]) goto usage;
- strcpy(player_name, &argv[i][2]);
- strcpy(player_base, &argv[i][2]);
- no_begin_screen = TRUE;
- break;
- }
-
- case 'm':
- {
- if (!argv[i][2]) goto usage;
- mstr = &argv[i][2];
- break;
- }
-
- case 'M':
- {
- if (!argv[i][2]) goto usage;
- force_module = &argv[i][2];
- break;
- }
-
- case 'h':
- {
- goto usage;
- break;
- }
-
- case 'H':
- {
- char *s;
- int j;
-
- init_lua_init();
-
- for (j = i + 1; j < argc; j++)
- {
- s = argv[j];
-
- while (*s != '.') s++;
- *s = '\0';
- s++;
- txt_to_html("head.aux", "foot.aux", argv[j], s, FALSE, FALSE);
- }
-
- return 0;
- }
-
- case '-':
- {
- if (argv[i][2] == 'h' && !strcmp((argv[i] + 2), "help"))
- goto usage;
- else
- {
- argv[i] = argv[0];
- argc = argc - i;
- argv = argv + i;
- args = FALSE;
- break;
- }
- }
-
- default:
-usage:
- {
- int j;
-
- /* Dump usage information */
- for (j = 0; j < argc; j++) printf("%s ", argv[j]);
- printf("\n");
- puts("Usage: tome [options] [-- subopts]");
- puts(" -h This help");
- puts(" -n Start a new character");
- puts(" -w Request wizard mode");
- puts(" -o Request original keyset");
- puts(" -r Request rogue-like keyset");
- puts(" -H <list of files> Convert helpfile to html");
- puts(" -u<who> Use your <who> savefile");
- puts(" -M<which> Use the <which> module");
- puts(" -m<sys> Force 'main-<sys>.c' usage");
-
-#ifdef USE_GTK2
- puts(" -mgtk2 To use GTK2");
- puts(" -- Sub options");
- puts(" -- -n# Number of terms to use");
- puts(" -- -b Turn off software backing store");
-#endif /* USE_GTK2 */
-
-#ifdef USE_X11
- puts(" -mx11 To use X11");
- puts(" -- Sub options");
- puts(" -- -n# Number of terms to use");
- puts(" -- -d<name> Display to use");
-#endif /* USE_X11 */
-
-#ifdef USE_GCU
- puts(" -mgcu To use curses");
- puts(" -- Sub options");
- puts(" -- -b Requests big screen");
-#endif /* USE_GCU */
-
-#ifdef USE_SDL
- puts(" -msdl To use SDL");
- puts(" -- Sub options");
- puts(" -- -n # Number of virtual consoles to use");
- puts(" -- -w # Request screen width in pixels");
- puts(" -- -h # Request screen height in pixels");
- puts(" -- -bpp # Request screen color depth in bits");
- puts(" -- -fs Start with full-screen display");
- puts(" -- -s # Request font size");
- puts(" -- -f <font> Request true-type font by name");
-#endif /* USE_SDL */
-
- /* Actually abort the process */
- quit(NULL);
- }
- }
- }
-
- /* Hack -- Forget standard args */
- if (args)
- {
- argc = 1;
- argv[1] = NULL;
- }
-
-
- /* Process the player name */
- process_player_name(TRUE);
-
-
- /* Install "quit" hook */
- quit_aux = quit_hook;
-
-
-#ifdef USE_GTK2
- /* Attempt to use the "main-gtk2.c" support */
- if (!done && (!mstr || (streq(mstr, "gtk2"))))
- {
- extern errr init_gtk2(int, char**);
- if (0 == init_gtk2(argc, argv))
- {
- ANGBAND_SYS = "gtk2";
- done = TRUE;
- }
- }
-#endif
-
-#ifdef USE_X11
- /* Attempt to use the "main-x11.c" support */
- if (!done && (!mstr || (streq(mstr, "x11"))))
- {
- extern errr init_x11(int, char**);
- if (0 == init_x11(argc, argv))
- {
- ANGBAND_SYS = "x11";
- done = TRUE;
- }
- }
-#endif
-
-#ifdef USE_GCU
- /* Attempt to use the "main-gcu.c" support */
- if (!done && (!mstr || (streq(mstr, "gcu"))))
- {
- extern errr init_gcu(int, char**);
- if (0 == init_gcu(argc, argv))
- {
- ANGBAND_SYS = "gcu";
- done = TRUE;
- }
- }
-#endif
-
-#ifdef USE_SDL
- /* Attempt to use the "main-sdl.c" support */
- if (!done && (!mstr || (streq(mstr, "sdl"))))
- {
- extern errr init_sdl(int, char**);
- if (0 == init_sdl(argc, argv))
- {
- ANGBAND_SYS = "sdl";
- done = TRUE;
- }
- }
-#endif
-
- /* Make sure we have a display! */
- if (!done) quit("Unable to prepare any 'display module'!");
-
-
- /* Initialize */
- init_angband();
-
- /* Wait for response */
- pause_line(23);
-
- /* Play the game */
- play_game(new_game);
-
- /* Quit */
- quit(NULL);
-
- /* Exit */
- return (0);
-}
-
-#endif
diff --git a/src/main.cc b/src/main.cc
new file mode 100644
index 00000000..c0ac3826
--- /dev/null
+++ b/src/main.cc
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 1997 Ben Harrison, and others
+ *
+ * This software may be copied and distributed for educational, research,
+ * and not for profit purposes provided that this copyright and statement
+ * are included in all such copies.
+ */
+
+#include "main.h"
+
+#include "birth.hpp"
+#include "dungeon.h"
+#include "files.hpp"
+#include "game.hpp"
+#include "init2.h"
+#include "modules.hpp"
+#include "util.h"
+#include "util.hpp"
+#include "variable.h"
+#include "variable.hpp"
+
+
+/*
+ * A hook for "quit()".
+ *
+ * Close down, then fall back into "quit()".
+ */
+static void quit_hook(cptr s)
+{
+ int j;
+
+ /* Scan windows */
+ for (j = 8 - 1; j >= 0; j--)
+ {
+ /* Unused */
+ if (!angband_term[j]) continue;
+
+ /* Nuke it */
+ term_nuke(angband_term[j]);
+ }
+}
+
+
+
+/*
+ * Check existence of ".ToME/" directory in the user's
+ * home directory or try to create it if it doesn't exist.
+ * Returns FALSE if all the attempts fail.
+ */
+static void init_save_dir()
+{
+ char dirpath[1024];
+ char versionpath[1024];
+ char savepath[1024];
+
+ /* Get an absolute path from the filename */
+ path_parse(dirpath, 1024, PRIVATE_USER_PATH);
+ strcpy(versionpath, dirpath);
+ strcat(versionpath, USER_PATH_VERSION);
+ strcpy(savepath, versionpath);
+ strcat(savepath, "/save");
+
+ if (!private_check_user_directory(dirpath))
+ {
+ quit_fmt("Cannot create directory '%s'", dirpath);
+ }
+
+ if (!private_check_user_directory(versionpath))
+ {
+ quit_fmt("Cannot create directory '%s'", versionpath);
+ }
+
+ if (!private_check_user_directory(savepath))
+ {
+ quit_fmt("Cannot create directory '%s'", savepath);
+ }
+}
+
+/*
+ * Initialize and verify the file paths, and the score file.
+ *
+ * Use the ANGBAND_PATH environment var if possible, else use
+ * DEFAULT_PATH, and in either case, branch off appropriately.
+ *
+ * First, we'll look for the ANGBAND_PATH environment variable,
+ * and then look for the files in there. If that doesn't work,
+ * we'll try the DEFAULT_PATH constant. So be sure that one of
+ * these two things works...
+ *
+ * We must ensure that the path ends with "PATH_SEP" if needed,
+ * since the "init_file_paths()" function will simply append the
+ * relevant "sub-directory names" to the given path.
+ */
+static void init_file_paths_with_env()
+{
+ char path[1024];
+
+ /* Get the environment variable */
+ cptr tail = getenv("TOME_PATH");
+
+ /* Use the angband_path, or a default */
+ strcpy(path, tail ? tail : DEFAULT_PATH);
+
+ /* Hack -- Add a path separator (only if needed) */
+ if (!suffix(path, PATH_SEP)) strcat(path, PATH_SEP);
+
+ /* Initialize */
+ init_file_paths(path);
+}
+
+
+/*
+ * Simple "main" function for multiple platforms.
+ *
+ * Note the special "--" option which terminates the processing of
+ * standard options. All non-standard options (if any) are passed
+ * directly to the platform initialization function.
+ */
+int main_real(int argc, char *argv[], char const *platform_sys, int (*init_platform)(int, char *[]), char const *platform_usage)
+{
+ int i;
+
+ bool_ args = TRUE;
+
+ // Initialize game structure
+ game = new Game();
+
+ /* Get the file paths */
+ init_file_paths_with_env();
+
+ /* Initialize the player name */
+ game->player_name = user_name();
+
+ /* Make sure save directory exists */
+ init_save_dir();
+
+
+ /* Process the command line arguments */
+ for (i = 1; args && (i < argc); i++)
+ {
+ /* Require proper options */
+ if (argv[i][0] != '-') goto usage;
+
+ /* Analyze option */
+ switch (argv[i][1])
+ {
+ case 'W':
+ case 'w':
+ {
+ arg_wizard = TRUE;
+ break;
+ }
+
+ case 'R':
+ case 'r':
+ {
+ arg_force_roguelike = TRUE;
+ break;
+ }
+
+ case 'O':
+ case 'o':
+ {
+ arg_force_original = TRUE;
+ break;
+ }
+
+ case 'u':
+ case 'U':
+ {
+ if (!argv[i][2]) goto usage;
+ game->player_name = &argv[i][2];
+ game->player_base = &argv[i][2];
+ no_begin_screen = TRUE;
+ break;
+ }
+
+ case 'M':
+ {
+ if (!argv[i][2]) goto usage;
+ force_module = &argv[i][2];
+ break;
+ }
+
+ case 'h':
+ {
+ goto usage;
+ }
+
+ case '-':
+ {
+ if (argv[i][2] == 'h' && !strcmp((argv[i] + 2), "help"))
+ {
+ goto usage;
+ }
+ else
+ {
+ argv[i] = argv[0];
+ argc = argc - i;
+ argv = argv + i;
+ args = FALSE;
+ break;
+ }
+ }
+
+ default:
+usage:
+ {
+ int j;
+
+ /* Dump usage information */
+ for (j = 0; j < argc; j++) printf("%s ", argv[j]);
+ printf("\n");
+ puts("Usage: tome [options] [-- subopts]");
+ puts(" -h This help");
+ puts(" -w Request wizard mode");
+ puts(" -o Request original keyset");
+ puts(" -r Request rogue-like keyset");
+ puts(" -u<who> Use your <who> savefile");
+ puts(" -M<which> Use the <which> module");
+
+ puts(" -- Sub options");
+ puts(platform_usage);
+
+ /* Actually abort the process */
+ quit(NULL);
+ }
+ }
+ }
+
+ /* Hack -- Forget standard args */
+ if (args)
+ {
+ argc = 1;
+ argv[1] = NULL;
+ }
+
+
+ /* Process the player name */
+ process_player_name(TRUE);
+
+
+ /* Install "quit" hook */
+ quit_aux = quit_hook;
+
+ /* Run the platform main initialization */
+ if (init_platform(argc, argv))
+ {
+ quit("Unable to prepare any 'display module'!");
+ }
+ else
+ {
+ ANGBAND_SYS = platform_sys;
+
+ /* Initialize */
+ init_angband();
+
+ /* Wait for response */
+ pause_line(23);
+
+ /* Play the game */
+ play_game();
+
+ /* Quit */
+ quit(NULL);
+
+ }
+ /* Exit */
+ return (0);
+}
diff --git a/src/main.h b/src/main.h
new file mode 100644
index 00000000..edc590b3
--- /dev/null
+++ b/src/main.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int main_real(int argc, char *argv[], char const *platform_sys, int (*init_platform)(int, char *[]), char const *platform_usage);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/src/melee1.cc b/src/melee1.cc
index bb4c06d1..58ebfbaa 100644
--- a/src/melee1.cc
+++ b/src/melee1.cc
@@ -10,11 +10,13 @@
#include "cave.hpp"
#include "cmd5.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "mimic.hpp"
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
@@ -222,7 +224,9 @@ int get_attack_power(int effect)
*/
bool_ carried_make_attack_normal(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
int ap_cnt;
@@ -230,12 +234,12 @@ bool_ carried_make_attack_normal(int r_idx)
int do_cut, do_stun;
char ddesc[80] = "your symbiote";
- cptr sym_name = symbiote_name(TRUE);
+ auto sym_name = symbiote_name(true);
- bool_ touched = FALSE, alive = TRUE;
+ bool_ alive = TRUE;
/* Not allowed to attack */
- if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
+ if (r_ptr->flags & RF_NEVER_BLOW) return (FALSE);
/* Total armor */
ac = p_ptr->ac + p_ptr->to_a;
@@ -246,9 +250,6 @@ bool_ carried_make_attack_normal(int r_idx)
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool_ visible = FALSE;
- bool_ obvious = FALSE;
-
int power = 0;
int damage = 0;
@@ -271,9 +272,6 @@ bool_ carried_make_attack_normal(int r_idx)
/* Handle "leaving" */
if (p_ptr->leaving) break;
- /* Extract visibility (before blink) */
- visible = TRUE;
-
/* Extract the attack "power" */
power = get_attack_power(effect);
@@ -282,35 +280,16 @@ bool_ carried_make_attack_normal(int r_idx)
if (!effect || check_hit(power, rlev))
{
/* Always disturbing */
- disturb(1);
+ disturb();
/* Hack -- Apply "protection from evil" */
if ((p_ptr->protevil > 0) &&
- (r_ptr->flags3 & (RF3_EVIL)) &&
+ (r_ptr->flags & RF_EVIL) &&
(p_ptr->lev >= rlev) &&
((rand_int(100) + p_ptr->lev) > 50))
{
- /* Remember the Evil-ness */
- r_ptr->r_flags3 |= (RF3_EVIL);
-
/* Message */
- msg_format("%s is repelled.", sym_name);
-
- /* Hack -- Next attack */
- continue;
- }
-
- /* Hack -- Apply "protection from good" */
- if ((p_ptr->protgood > 0) &&
- (r_ptr->flags3 & (RF3_GOOD)) &&
- (p_ptr->lev >= rlev) &&
- ((rand_int(100) + p_ptr->lev) > 50))
- {
- /* Remember the Good-ness */
- r_ptr->r_flags3 |= (RF3_GOOD);
-
- /* Message */
- msg_format("%s is repelled.", sym_name);
+ msg_format("%s is repelled.", sym_name.c_str());
/* Hack -- Next attack */
continue;
@@ -326,43 +305,33 @@ bool_ carried_make_attack_normal(int r_idx)
{
act = "hits you.";
do_cut = do_stun = 1;
- touched = TRUE;
- sound(SOUND_HIT);
break;
}
case RBM_TOUCH:
{
act = "touches you.";
- touched = TRUE;
- sound(SOUND_TOUCH);
break;
}
case RBM_PUNCH:
{
act = "punches you.";
- touched = TRUE;
do_stun = 1;
- sound(SOUND_HIT);
break;
}
case RBM_KICK:
{
act = "kicks you.";
- touched = TRUE;
do_stun = 1;
- sound(SOUND_HIT);
break;
}
case RBM_CLAW:
{
act = "claws you.";
- touched = TRUE;
do_cut = 1;
- sound(SOUND_CLAW);
break;
}
@@ -370,16 +339,12 @@ bool_ carried_make_attack_normal(int r_idx)
{
act = "bites you.";
do_cut = 1;
- touched = TRUE;
- sound(SOUND_BITE);
break;
}
case RBM_STING:
{
act = "stings you.";
- touched = TRUE;
- sound(SOUND_STING);
break;
}
@@ -393,8 +358,6 @@ bool_ carried_make_attack_normal(int r_idx)
{
act = "butts you.";
do_stun = 1;
- touched = TRUE;
- sound(SOUND_HIT);
break;
}
@@ -402,46 +365,36 @@ bool_ carried_make_attack_normal(int r_idx)
{
act = "crushes you.";
do_stun = 1;
- touched = TRUE;
- sound(SOUND_CRUSH);
break;
}
case RBM_ENGULF:
{
act = "engulfs you.";
- touched = TRUE;
- sound(SOUND_CRUSH);
break;
}
case RBM_CHARGE:
{
act = "charges you.";
- touched = TRUE;
- sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
break;
}
case RBM_CRAWL:
{
act = "crawls on you.";
- touched = TRUE;
- sound(SOUND_SLIME);
break;
}
case RBM_DROOL:
{
act = "drools on you.";
- sound(SOUND_SLIME);
break;
}
case RBM_SPIT:
{
act = "spits on you.";
- sound(SOUND_SLIME);
break;
}
@@ -460,14 +413,12 @@ bool_ carried_make_attack_normal(int r_idx)
case RBM_WAIL:
{
act = "wails at you.";
- sound(SOUND_WAIL);
break;
}
case RBM_SPORE:
{
act = "releases spores at you.";
- sound(SOUND_SLIME);
break;
}
@@ -480,21 +431,18 @@ bool_ carried_make_attack_normal(int r_idx)
case RBM_BEG:
{
act = "begs you for money.";
- sound(SOUND_MOAN);
break;
}
case RBM_INSULT:
{
act = desc_insult[rand_int(8)];
- sound(SOUND_MOAN);
break;
}
case RBM_MOAN:
{
act = desc_moan[rand_int(4)];
- sound(SOUND_MOAN);
break;
}
@@ -504,18 +452,14 @@ bool_ carried_make_attack_normal(int r_idx)
act = "sings 'We are a happy family.'";
else
act = "sings 'I love you, you love me.'";
- sound(SOUND_SHOW);
break;
}
}
/* Message */
- if (act) msg_format("%s %s", sym_name, act);
+ if (act) msg_format("%s %s", sym_name.c_str(), act);
- /* Hack -- assume all attacks are obvious */
- obvious = TRUE;
-
/* Roll out the damage */
damage = damroll(d_dice, d_side);
@@ -524,9 +468,6 @@ bool_ carried_make_attack_normal(int r_idx)
{
case 0:
{
- /* Hack -- Assume obvious */
- obvious = TRUE;
-
/* Hack -- No damage */
damage = 0;
@@ -535,9 +476,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_HURT:
{
- /* Obvious */
- obvious = TRUE;
-
/* Hack -- Player armor reduces total damage */
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
@@ -550,9 +488,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_ABOMINATION:
{
- /* Obvious */
- obvious = TRUE;
-
/* Morph, but let mimicry skill have a chance to stop this */
if (magik(60 - get_skill(SKILL_MIMICRY)))
{
@@ -572,8 +507,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_SANITY:
{
- obvious = TRUE;
-
take_sanity_hit(damage, ddesc);
break;
}
@@ -587,10 +520,7 @@ bool_ carried_make_attack_normal(int r_idx)
/* Take "poison" effect */
if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
{
- if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5))
- {
- obvious = TRUE;
- }
+ set_poisoned(p_ptr->poisoned + randint(rlev) + 5);
}
break;
@@ -606,7 +536,7 @@ bool_ carried_make_attack_normal(int r_idx)
if (!p_ptr->resist_disen)
{
/* Apply disenchantment */
- if (apply_disenchant(0)) obvious = TRUE;
+ apply_disenchant(0);
}
break;
@@ -654,9 +584,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_ACID:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are covered in acid!");
@@ -669,9 +596,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_ELEC:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are struck by electricity!");
@@ -685,9 +609,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_FIRE:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are enveloped in flames!");
@@ -701,9 +622,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_COLD:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are covered with frost!");
@@ -724,10 +642,7 @@ bool_ carried_make_attack_normal(int r_idx)
/* Increase "blind" */
if (!p_ptr->resist_blind)
{
- if (set_blind(p_ptr->blind + 10 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_blind(p_ptr->blind + 10 + randint(rlev));
}
@@ -743,10 +658,7 @@ bool_ carried_make_attack_normal(int r_idx)
/* Increase "confused" */
if (!p_ptr->resist_conf)
{
- if (set_confused(p_ptr->confused + 3 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_confused(p_ptr->confused + 3 + randint(rlev));
}
@@ -763,19 +675,14 @@ bool_ carried_make_attack_normal(int r_idx)
if (p_ptr->resist_fear)
{
msg_print("You stand your ground!");
- obvious = TRUE;
}
else if (rand_int(100) < p_ptr->skill_sav)
{
msg_print("You stand your ground!");
- obvious = TRUE;
}
else
{
- if (set_afraid(p_ptr->afraid + 3 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_afraid(p_ptr->afraid + 3 + randint(rlev));
}
@@ -795,19 +702,14 @@ bool_ carried_make_attack_normal(int r_idx)
if (p_ptr->free_act)
{
msg_print("You are unaffected!");
- obvious = TRUE;
}
else if (rand_int(100) < p_ptr->skill_sav)
{
msg_print("You resist the effects!");
- obvious = TRUE;
}
else
{
- if (set_paralyzed(3 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_paralyzed(3 + randint(rlev));
}
@@ -821,7 +723,7 @@ bool_ carried_make_attack_normal(int r_idx)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
break;
}
@@ -833,7 +735,7 @@ bool_ carried_make_attack_normal(int r_idx)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
break;
}
@@ -845,7 +747,7 @@ bool_ carried_make_attack_normal(int r_idx)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
break;
}
@@ -857,7 +759,7 @@ bool_ carried_make_attack_normal(int r_idx)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_DEX, STAT_DEC_NORMAL);
break;
}
@@ -869,7 +771,7 @@ bool_ carried_make_attack_normal(int r_idx)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_CON, STAT_DEC_NORMAL);
break;
}
@@ -881,7 +783,7 @@ bool_ carried_make_attack_normal(int r_idx)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_CHR, STAT_DEC_NORMAL);
break;
}
@@ -893,21 +795,18 @@ bool_ carried_make_attack_normal(int r_idx)
take_hit(damage, ddesc);
/* Damage (stats) */
- if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
+ do_dec_stat(A_DEX, STAT_DEC_NORMAL);
+ do_dec_stat(A_CON, STAT_DEC_NORMAL);
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
+ do_dec_stat(A_CHR, STAT_DEC_NORMAL);
break;
}
case RBE_SHATTER:
{
- /* Obvious */
- obvious = TRUE;
-
/* Hack -- Reduce damage based on the player armor class */
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
@@ -928,9 +827,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_EXP_10:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
carried_monster_hit = TRUE;
take_hit(damage, ddesc);
@@ -958,9 +854,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_EXP_20:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
carried_monster_hit = TRUE;
take_hit(damage, ddesc);
@@ -988,9 +881,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_EXP_40:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
carried_monster_hit = TRUE;
take_hit(damage, ddesc);
@@ -1018,9 +908,6 @@ bool_ carried_make_attack_normal(int r_idx)
case RBE_EXP_80:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
carried_monster_hit = TRUE;
take_hit(damage, ddesc);
@@ -1055,10 +942,7 @@ bool_ carried_make_attack_normal(int r_idx)
/* Take "poison" effect */
if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
{
- if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5))
- {
- obvious = TRUE;
- }
+ set_poisoned(p_ptr->poisoned + randint(rlev) + 5);
}
/* Damage CON (10% chance)*/
@@ -1066,16 +950,13 @@ bool_ carried_make_attack_normal(int r_idx)
{
/* 1% chance for perm. damage */
bool_ perm = (randint(10) == 1);
- if (dec_stat(A_CON, randint(10), perm)) obvious = TRUE;
+ dec_stat(A_CON, randint(10), perm);
}
break;
}
case RBE_PARASITE:
{
- /* Obvious */
- obvious = TRUE;
-
if (!p_ptr->parasite) set_parasite(damage, r_idx);
break;
@@ -1088,10 +969,7 @@ bool_ carried_make_attack_normal(int r_idx)
/* Increase "image" */
if (!p_ptr->resist_chaos)
{
- if (set_image(p_ptr->image + 3 + randint(rlev / 2)))
- {
- obvious = TRUE;
- }
+ set_image(p_ptr->image + 3 + randint(rlev / 2));
}
break;
@@ -1222,7 +1100,7 @@ bool_ carried_make_attack_normal(int r_idx)
}
/* Apply the cut */
- if (k) (void)set_cut(p_ptr->cut + k);
+ if (k) set_cut(p_ptr->cut + k);
}
/* Handle stun */
@@ -1263,21 +1141,7 @@ bool_ carried_make_attack_normal(int r_idx)
}
/* Apply the stun */
- if (k) (void)set_stun(p_ptr->stun + k);
- }
-
- if (touched)
- {
- if (p_ptr->sh_fire && alive)
- {
- r_ptr->r_flags3 |= RF3_IM_FIRE;
- }
-
- if (p_ptr->sh_elec && alive)
- {
- r_ptr->r_flags3 |= RF3_IM_ELEC;
- }
- touched = FALSE;
+ if (k) set_stun(p_ptr->stun + k);
}
}
@@ -1301,29 +1165,14 @@ bool_ carried_make_attack_normal(int r_idx)
case RBM_CHARGE:
/* Disturbing */
- disturb(1);
+ disturb();
/* Message */
- msg_format("%s misses you.", sym_name);
+ msg_format("%s misses you.", sym_name.c_str());
break;
}
}
-
-
- /* Analyze "visible" monsters only */
- if (visible)
- {
- /* Count "obvious" attacks (and ones that cause damage) */
- if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
- {
- /* Count attacks of this type */
- if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
- {
- r_ptr->r_blows[ap_cnt]++;
- }
- }
- }
}
/* Assume we attacked */
return (TRUE);
@@ -1335,7 +1184,7 @@ bool_ carried_make_attack_normal(int r_idx)
*/
void black_breath_attack(int chance)
{
- if (!p_ptr->protundead && randint(chance) == 1)
+ if (randint(chance) == 1)
{
msg_print("Your foe calls upon your soul!");
msg_print("You feel the Black Breath slowly draining you of life...");
@@ -1353,7 +1202,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
int ap_cnt;
int i, j, k, tmp, ac, rlev;
- int do_cut, do_stun, do_vampire;
+ int do_cut, do_stun;
s32b gold;
@@ -1371,7 +1220,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Not allowed to attack? */
auto r_ptr = m_ptr->race();
- if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
+ if (r_ptr->flags & RF_NEVER_BLOW) return (FALSE);
/* ...nor if friendly */
if (is_friend(m_ptr) >= 0)
@@ -1381,7 +1230,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
}
/* Cannot attack the player if mortal and player fated to never die by the ... */
- if ((r_ptr->flags7 & RF7_MORTAL) && (p_ptr->no_mortal)) return (FALSE);
+ if ((r_ptr->flags & RF_MORTAL) && (p_ptr->no_mortal)) return (FALSE);
/* Total armor */
ac = p_ptr->ac + p_ptr->to_a;
@@ -1403,9 +1252,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool_ visible = FALSE;
- bool_ obvious = FALSE;
-
int power = 0;
int damage = 0;
@@ -1428,9 +1274,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Handle "leaving" */
if (p_ptr->leaving) break;
- /* Extract visibility (before blink) */
- if (m_ptr->ml) visible = TRUE;
-
/* Extract the attack "power" */
switch (effect)
{
@@ -1545,7 +1388,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
int chance = p_ptr->dodge_chance - ((rlev * 5) / 6);
/* Always disturbing */
- disturb(1);
+ disturb();
if ((chance > 0) && magik(chance))
{
@@ -1563,11 +1406,8 @@ bool_ make_attack_normal(int m_idx, byte divis)
if (chance > 50000) chance = 50000;
chance -= rlev * 300;
- if ((randint(100000) < chance) && (r_ptr->flags3 & (RF3_EVIL)))
+ if ((randint(100000) < chance) && (r_ptr->flags & RF_EVIL))
{
- /* Remember the Evil-ness */
- r_ptr->r_flags3 |= (RF3_EVIL);
-
/* Message */
msg_format("The hand of Eru Iluvatar stops %s blow.", m_name);
@@ -1578,35 +1418,10 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Hack -- Apply "protection from evil" */
if ((p_ptr->protevil > 0) &&
- (r_ptr->flags3 & (RF3_EVIL)) &&
+ (r_ptr->flags & RF_EVIL) &&
(p_ptr->lev >= rlev) &&
((rand_int(100) + p_ptr->lev) > 50))
{
- /* Remember the Evil-ness */
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_EVIL);
- }
-
- /* Message */
- msg_format("%^s is repelled.", m_name);
-
- /* Hack -- Next attack */
- continue;
- }
-
- /* Hack -- Apply "protection from good" */
- if ((p_ptr->protgood > 0) &&
- (r_ptr->flags3 & (RF3_GOOD)) &&
- (p_ptr->lev >= rlev) &&
- ((rand_int(100) + p_ptr->lev) > 50))
- {
- /* Remember the Good-ness */
- if (m_ptr->ml)
- {
- r_ptr->r_flags3 |= (RF3_GOOD);
- }
-
/* Message */
msg_format("%^s is repelled.", m_name);
@@ -1615,7 +1430,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
}
/* Assume no cut or stun */
- do_cut = do_stun = do_vampire = 0;
+ do_cut = do_stun = 0;
/* Describe the attack method */
switch (method)
@@ -1625,7 +1440,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = "hits you.";
do_cut = do_stun = 1;
touched = TRUE;
- sound(SOUND_HIT);
break;
}
@@ -1633,7 +1447,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
act = "touches you.";
touched = TRUE;
- sound(SOUND_TOUCH);
break;
}
@@ -1642,7 +1455,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = "punches you.";
touched = TRUE;
do_stun = 1;
- sound(SOUND_HIT);
break;
}
@@ -1651,7 +1463,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = "kicks you.";
touched = TRUE;
do_stun = 1;
- sound(SOUND_HIT);
break;
}
@@ -1660,7 +1471,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = "claws you.";
touched = TRUE;
do_cut = 1;
- sound(SOUND_CLAW);
break;
}
@@ -1668,10 +1478,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
act = "bites you.";
do_cut = 1;
- if (magik(5) && iequals(r_ptr->name, "vampire"))
- do_vampire = TRUE;
touched = TRUE;
- sound(SOUND_BITE);
break;
}
@@ -1679,7 +1486,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
act = "stings you.";
touched = TRUE;
- sound(SOUND_STING);
break;
}
@@ -1694,7 +1500,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = "butts you.";
do_stun = 1;
touched = TRUE;
- sound(SOUND_HIT);
break;
}
@@ -1703,7 +1508,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = "crushes you.";
do_stun = 1;
touched = TRUE;
- sound(SOUND_CRUSH);
break;
}
@@ -1711,7 +1515,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
act = "engulfs you.";
touched = TRUE;
- sound(SOUND_CRUSH);
break;
}
@@ -1719,7 +1522,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
act = "charges you.";
touched = TRUE;
- sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
break;
}
@@ -1727,21 +1529,18 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
act = "crawls on you.";
touched = TRUE;
- sound(SOUND_SLIME);
break;
}
case RBM_DROOL:
{
act = "drools on you.";
- sound(SOUND_SLIME);
break;
}
case RBM_SPIT:
{
act = "spits on you.";
- sound(SOUND_SLIME);
break;
}
@@ -1761,14 +1560,12 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBM_WAIL:
{
act = "wails at you.";
- sound(SOUND_WAIL);
break;
}
case RBM_SPORE:
{
act = "releases spores at you.";
- sound(SOUND_SLIME);
break;
}
@@ -1781,14 +1578,12 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBM_BEG:
{
act = "begs you for money.";
- sound(SOUND_MOAN);
break;
}
case RBM_INSULT:
{
act = desc_insult[rand_int(8)];
- sound(SOUND_MOAN);
break;
}
@@ -1798,7 +1593,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = desc_moan[rand_int(3) + 4];
else
act = desc_moan[rand_int(4)];
- sound(SOUND_MOAN);
break;
}
@@ -1808,7 +1602,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
act = "sings 'We are a happy family.'";
else
act = "sings 'I love you, you love me.'";
- sound(SOUND_SHOW);
break;
}
}
@@ -1820,23 +1613,20 @@ bool_ make_attack_normal(int m_idx, byte divis)
* a successful blow. Uniques have a better chance. -LM-
* Nazgul have a 25% chance
*/
- if (r_ptr->flags7 & RF7_NAZGUL)
+ if (r_ptr->flags & RF_NAZGUL)
{
black_breath_attack(4);
}
- else if ((m_ptr->level >= 35) && (r_ptr->flags3 & (RF3_UNDEAD)) &&
- (r_ptr->flags1 & (RF1_UNIQUE)))
+ else if ((m_ptr->level >= 35) && (r_ptr->flags & RF_UNDEAD) &&
+ (r_ptr->flags & RF_UNIQUE))
{
black_breath_attack(300 - m_ptr->level);
}
- else if ((m_ptr->level >= 40) && (r_ptr->flags3 & (RF3_UNDEAD)))
+ else if ((m_ptr->level >= 40) && (r_ptr->flags & RF_UNDEAD))
{
black_breath_attack(450 - m_ptr->level);
}
- /* Hack -- assume all attacks are obvious */
- obvious = TRUE;
-
/* Roll out the damage */
damage = damroll(d_dice, d_side);
@@ -1848,9 +1638,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
case 0:
{
- /* Hack -- Assume obvious */
- obvious = TRUE;
-
/* Hack -- No damage */
damage = 0;
@@ -1859,9 +1646,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_HURT:
{
- /* Obvious */
- obvious = TRUE;
-
/* Hack -- Player armor reduces total damage */
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
@@ -1873,9 +1657,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_ABOMINATION:
{
- /* Obvious */
- obvious = TRUE;
-
/* Morph, but let mimicry skill have a chance to stop this */
if (magik(60 - get_skill(SKILL_MIMICRY)))
{
@@ -1895,8 +1676,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_SANITY:
{
- obvious = TRUE;
-
take_sanity_hit(damage, ddesc);
break;
}
@@ -1909,10 +1688,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Take "poison" effect */
if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
{
- if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5))
- {
- obvious = TRUE;
- }
+ set_poisoned(p_ptr->poisoned + randint(rlev) + 5);
}
/* Learn about the player */
@@ -1929,8 +1705,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Allow complete resist */
if (!p_ptr->resist_disen)
{
- /* Apply disenchantment */
- if (apply_disenchant(0)) obvious = TRUE;
+ apply_disenchant(0);
}
/* Learn about the player */
@@ -1966,9 +1741,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Message */
msg_print("Energy drains from your pack!");
- /* Obvious */
- obvious = TRUE;
-
/* Heal */
j = rlev;
m_ptr->hp += j * o_ptr->pval * o_ptr->number;
@@ -1999,9 +1771,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Take some damage */
take_hit(damage, ddesc);
- /* Obvious */
- obvious = TRUE;
-
/* Saving throw (unless paralyzed) based on dex and level */
if (!p_ptr->paralyzed &&
(rand_int(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
@@ -2084,9 +1853,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Occasional "blink" anyway */
blinked = TRUE;
- /* Obvious */
- obvious = TRUE;
-
/* Done */
break;
}
@@ -2104,7 +1870,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
if (!o_ptr->k_idx) continue;
/* Skip artifacts */
- if (artifact_p(o_ptr) || o_ptr->art_name) continue;
+ if (artifact_p(o_ptr)) continue;
/* Get a description */
object_desc(o_name, o_ptr, FALSE, 3);
@@ -2159,9 +1925,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Steal the items */
inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
- /* Obvious */
- obvious = TRUE;
-
/* Blink away */
blinked = TRUE;
@@ -2203,9 +1966,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Steal the items */
inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
- /* Obvious */
- obvious = TRUE;
-
/* Done */
break;
}
@@ -2232,7 +1992,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
if (!p_ptr->blind)
{
msg_print("Your light dims.");
- obvious = TRUE;
}
/* Window stuff */
@@ -2244,9 +2003,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_ACID:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are covered in acid!");
@@ -2261,9 +2017,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_ELEC:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are struck by electricity!");
@@ -2278,9 +2031,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_FIRE:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are enveloped in flames!");
@@ -2295,9 +2045,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_COLD:
{
- /* Obvious */
- obvious = TRUE;
-
/* Message */
msg_print("You are covered with frost!");
@@ -2318,10 +2065,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Increase "blind" */
if (!p_ptr->resist_blind)
{
- if (set_blind(p_ptr->blind + 10 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_blind(p_ptr->blind + 10 + randint(rlev));
}
/* Learn about the player */
@@ -2338,10 +2082,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Increase "confused" */
if (!p_ptr->resist_conf)
{
- if (set_confused(p_ptr->confused + 3 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_confused(p_ptr->confused + 3 + randint(rlev));
}
/* Learn about the player */
@@ -2359,19 +2100,14 @@ bool_ make_attack_normal(int m_idx, byte divis)
if (p_ptr->resist_fear)
{
msg_print("You stand your ground!");
- obvious = TRUE;
}
else if (rand_int(100) < p_ptr->skill_sav)
{
msg_print("You stand your ground!");
- obvious = TRUE;
}
else
{
- if (set_afraid(p_ptr->afraid + 3 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_afraid(p_ptr->afraid + 3 + randint(rlev));
}
/* Learn about the player */
@@ -2392,19 +2128,14 @@ bool_ make_attack_normal(int m_idx, byte divis)
if (p_ptr->free_act)
{
msg_print("You are unaffected!");
- obvious = TRUE;
}
else if (rand_int(100) < p_ptr->skill_sav)
{
msg_print("You resist the effects!");
- obvious = TRUE;
}
else
{
- if (set_paralyzed(3 + randint(rlev)))
- {
- obvious = TRUE;
- }
+ set_paralyzed(3 + randint(rlev));
}
/* Learn about the player */
@@ -2419,7 +2150,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
break;
}
@@ -2430,7 +2161,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
break;
}
@@ -2441,7 +2172,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
break;
}
@@ -2452,7 +2183,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_DEX, STAT_DEC_NORMAL);
break;
}
@@ -2463,7 +2194,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_CON, STAT_DEC_NORMAL);
break;
}
@@ -2474,7 +2205,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
take_hit(damage, ddesc);
/* Damage (stat) */
- if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_CHR, STAT_DEC_NORMAL);
break;
}
@@ -2485,21 +2216,18 @@ bool_ make_attack_normal(int m_idx, byte divis)
take_hit(damage, ddesc);
/* Damage (stats) */
- if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE;
- if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE;
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
+ do_dec_stat(A_DEX, STAT_DEC_NORMAL);
+ do_dec_stat(A_CON, STAT_DEC_NORMAL);
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
+ do_dec_stat(A_CHR, STAT_DEC_NORMAL);
break;
}
case RBE_SHATTER:
{
- /* Obvious */
- obvious = TRUE;
-
/* Hack -- Reduce damage based on the player armor class */
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
@@ -2519,9 +2247,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_EXP_10:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
take_hit(damage, ddesc);
@@ -2548,9 +2273,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_EXP_20:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
take_hit(damage, ddesc);
@@ -2577,9 +2299,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_EXP_40:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
take_hit(damage, ddesc);
@@ -2606,9 +2325,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
case RBE_EXP_80:
{
- /* Obvious */
- obvious = TRUE;
-
/* Take damage */
take_hit(damage, ddesc);
@@ -2641,10 +2357,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Take "poison" effect */
if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
{
- if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5))
- {
- obvious = TRUE;
- }
+ set_poisoned(p_ptr->poisoned + randint(rlev) + 5);
}
/* Damage CON (10% chance)*/
@@ -2652,7 +2365,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
/* 1% chance for perm. damage */
bool_ perm = (randint(10) == 1);
- if (dec_stat(A_CON, randint(10), perm)) obvious = TRUE;
+ dec_stat(A_CON, randint(10), perm);
}
break;
@@ -2665,10 +2378,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
/* Increase "image" */
if (!p_ptr->resist_chaos)
{
- if (set_image(p_ptr->image + 3 + randint(rlev / 2)))
- {
- obvious = TRUE;
- }
+ set_image(p_ptr->image + 3 + randint(rlev / 2));
}
/* Learn about the player */
@@ -2747,9 +2457,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
}
case RBE_PARASITE:
{
- /* Obvious */
- obvious = TRUE;
-
if (!p_ptr->parasite) set_parasite(damage, m_ptr->r_idx);
break;
@@ -2811,7 +2518,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
}
/* Apply the cut */
- if (k) (void)set_cut(p_ptr->cut + k);
+ if (k) set_cut(p_ptr->cut + k);
}
/* Handle stun */
@@ -2852,20 +2559,11 @@ bool_ make_attack_normal(int m_idx, byte divis)
}
/* Apply the stun */
- if (k) (void)set_stun(p_ptr->stun + k);
- }
-
- /* Do vampiric thingies */
- if (do_vampire)
- {
- /* Change to resist(but never total protection) */
-/* if (magik(3) || (magik(m_ptr->level - (p_ptr->lev / 2))))
- gain_corruption("Vampire");*/
+ if (k) set_stun(p_ptr->stun + k);
}
if (explode)
{
- sound(SOUND_EXPLODE);
if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
{
blinked = FALSE;
@@ -2877,7 +2575,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
{
if (p_ptr->sh_fire && alive)
{
- if (!(r_ptr->flags3 & RF3_IM_FIRE))
+ if (!(r_ptr->flags & RF_IM_FIRE))
{
msg_format("%^s is suddenly very hot!", m_name);
if (mon_take_hit(m_idx, damroll(2, 6), &fear,
@@ -2887,16 +2585,11 @@ bool_ make_attack_normal(int m_idx, byte divis)
alive = FALSE;
}
}
- else
- {
- if (m_ptr->ml)
- r_ptr->r_flags3 |= RF3_IM_FIRE;
- }
}
if (p_ptr->sh_elec && alive)
{
- if (!(r_ptr->flags3 & RF3_IM_ELEC))
+ if (!(r_ptr->flags & RF_IM_ELEC))
{
msg_format("%^s gets zapped!", m_name);
if (mon_take_hit(m_idx, damroll(2, 6), &fear,
@@ -2906,12 +2599,8 @@ bool_ make_attack_normal(int m_idx, byte divis)
alive = FALSE;
}
}
- else
- {
- if (m_ptr->ml)
- r_ptr->r_flags3 |= RF3_IM_ELEC;
- }
}
+
if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_COUNTER) && alive)
{
msg_format("%^s gets bashed by your mystic shield!", m_name);
@@ -2922,9 +2611,10 @@ bool_ make_attack_normal(int m_idx, byte divis)
alive = FALSE;
}
}
+
if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_FIRE) && alive)
{
- if (!(r_ptr->flags3 & RF3_IM_FIRE))
+ if (!(r_ptr->flags & RF_IM_FIRE))
{
msg_format("%^s gets burned by your fiery shield!", m_name);
if (mon_take_hit(m_idx, damroll(p_ptr->shield_power_opt, p_ptr->shield_power_opt2), &fear,
@@ -2934,12 +2624,8 @@ bool_ make_attack_normal(int m_idx, byte divis)
alive = FALSE;
}
}
- else
- {
- if (m_ptr->ml)
- r_ptr->r_flags3 |= RF3_IM_FIRE;
- }
}
+
if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_GREAT_FIRE) && alive)
{
msg_format("%^s gets burned by your fiery shield!", m_name);
@@ -2950,11 +2636,12 @@ bool_ make_attack_normal(int m_idx, byte divis)
alive = FALSE;
}
}
+
if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_FEAR) && alive)
{
int tmp;
- if ((!(r_ptr->flags1 & RF1_UNIQUE)) && (damroll(p_ptr->shield_power_opt, p_ptr->shield_power_opt2) - m_ptr->level > 0))
+ if ((!(r_ptr->flags & RF_UNIQUE)) && (damroll(p_ptr->shield_power_opt, p_ptr->shield_power_opt2) - m_ptr->level > 0))
{
msg_format("%^s gets scared away!", m_name);
@@ -2994,7 +2681,7 @@ bool_ make_attack_normal(int m_idx, byte divis)
if (m_ptr->ml)
{
/* Disturbing */
- disturb(1);
+ disturb();
/* Message */
msg_format("%^s misses you.", m_name);
@@ -3003,21 +2690,6 @@ bool_ make_attack_normal(int m_idx, byte divis)
break;
}
}
-
-
- /* Analyze "visible" monsters only */
- if (visible)
- {
- /* Count "obvious" attacks (and ones that cause damage) */
- if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
- {
- /* Count attacks of this type */
- if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
- {
- r_ptr->r_blows[ap_cnt]++;
- }
- }
- }
}
@@ -3028,16 +2700,9 @@ bool_ make_attack_normal(int m_idx, byte divis)
teleport_away(m_idx, MAX_SIGHT * 2 + 5);
}
-
- /* Always notice cause of death */
- if (death && (r_ptr->r_deaths < MAX_SHORT))
- {
- r_ptr->r_deaths++;
- }
-
+ /* Fear */
if (m_ptr->ml && fear)
{
- sound (SOUND_FLEE);
msg_format("%^s flees in terror!", m_name);
}
diff --git a/src/melee1.hpp b/src/melee1.hpp
index e84c8f03..90ece431 100644
--- a/src/melee1.hpp
+++ b/src/melee1.hpp
@@ -2,6 +2,6 @@
#include "h-basic.h"
-extern int get_attack_power(int effect);
-extern bool_ carried_make_attack_normal(int r_idx);
-extern bool_ make_attack_normal(int m_idx, byte divis);
+int get_attack_power(int effect);
+bool_ carried_make_attack_normal(int r_idx);
+bool_ make_attack_normal(int m_idx, byte divis);
diff --git a/src/melee2.cc b/src/melee2.cc
index b3aa5c61..d769355a 100644
--- a/src/melee2.cc
+++ b/src/melee2.cc
@@ -16,8 +16,11 @@
#include "cave.hpp"
#include "cave_type.hpp"
#include "cmd1.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hook_mon_speak_in.hpp"
#include "hook_monster_ai_in.hpp"
#include "hook_monster_ai_out.hpp"
@@ -27,18 +30,20 @@
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "options.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "skills.hpp"
#include "spells1.hpp"
#include "spells2.hpp"
#include "stats.hpp"
#include "tables.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "variable.hpp"
#include "xtra2.hpp"
@@ -51,7 +56,6 @@
#define FOLLOW_DISTANCE 6
-static void cmonster_msg(char a, cptr fmt, ...);
/*
* Based on mon_take_hit... all monster attacks on
@@ -61,12 +65,34 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note)
{
monster_type *m_ptr = &m_list[m_idx], *s_ptr = &m_list[s_idx];
+ /* Output */
+ auto cmonster_msg = [m_ptr](std::string const &suffix) {
+ auto &messages = game->messages;
+ // Build monster name
+ char m_name[80];
+ monster_desc(m_name, m_ptr, 0);
+ capitalize(m_name);
+ // Add suffix
+ auto msg = std::string(m_name);
+ msg += suffix;
+ // Display
+ if (options->disturb_other)
+ {
+ cmsg_print(TERM_L_RED, msg);
+ }
+ else
+ {
+ messages.add(msg, TERM_L_RED);
+ p_ptr->window |= PW_MESSAGE;
+ }
+ };
+
/* Redraw (later) if needed */
if (health_who == m_idx) p_ptr->redraw |= (PR_FRAME);
/* Some monsters are immune to death */
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags7 & RF7_NO_DEATH) return FALSE;
+ if (r_ptr->flags & RF_NO_DEATH) return FALSE;
/* Wake it up */
m_ptr->csleep = 0;
@@ -77,39 +103,24 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note)
/* It is dead now... or is it? */
if (m_ptr->hp < 0)
{
- if (((r_ptr->flags1 & RF1_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P)) ||
+ if (((r_ptr->flags & RF_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P)) ||
(m_ptr->mflag & MFLAG_QUEST))
{
m_ptr->hp = 1;
}
else
{
- char m_name[80];
s32b dive = s_ptr->level;
- if (!dive) dive = 1;
-
- /* Extract monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Make a sound */
- if ((r_ptr->flags3 & RF3_DEMON) ||
- (r_ptr->flags3 & RF3_UNDEAD) ||
- (r_ptr->flags2 & RF2_STUPID) ||
- (r_ptr->flags3 & RF3_NONLIVING) ||
- (strchr("Evg", r_ptr->d_char)))
- {
- sound(SOUND_N_KILL);
- }
- else
+ if (!dive)
{
- sound(SOUND_KILL);
+ dive = 1;
}
/* Death by Missile/Spell attack */
if (note)
{
- cmonster_msg(TERM_L_RED, "%^s%s", m_name, note);
+ cmonster_msg(note);
}
/* Death by Physical attack -- living monster */
else if (!m_ptr->ml)
@@ -117,17 +128,17 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note)
/* Do nothing */
}
/* Death by Physical attack -- non-living monster */
- else if ((r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags2 & (RF2_STUPID)) ||
- (r_ptr->flags3 & (RF3_NONLIVING)) ||
+ else if ((r_ptr->flags & RF_DEMON) ||
+ (r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_STUPID) ||
+ (r_ptr->flags & RF_NONLIVING) ||
(strchr("Evg", r_ptr->d_char)))
{
- cmonster_msg(TERM_L_RED, "%^s is destroyed.", m_name);
+ cmonster_msg(" is destroyed.");
}
else
{
- cmonster_msg(TERM_L_RED, "%^s is killed.", m_name);
+ cmonster_msg(" is killed.");
}
dive = r_ptr->mexp * m_ptr->level / dive;
@@ -171,7 +182,7 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note)
}
/* When an Unique dies, it stays dead */
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
r_ptr->max_num = 0;
}
@@ -228,7 +239,7 @@ void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear)
/* Sometimes a monster gets scared by damage */
auto const r_ptr = m_ptr->race();
- if (!m_ptr->monfear && !(r_ptr->flags3 & (RF3_NO_FEAR)))
+ if (!m_ptr->monfear && !(r_ptr->flags & RF_NO_FEAR))
{
int percentage;
@@ -289,7 +300,7 @@ void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear)
static bool_ int_outof(std::shared_ptr<monster_race> r_ptr, int prob)
{
/* Non-Smart monsters are half as "smart" */
- if (!(r_ptr->flags2 & (RF2_SMART))) prob = prob / 2;
+ if (!(r_ptr->flags & RF_SMART)) prob = prob / 2;
/* Roll the dice */
return (rand_int(100) < prob);
@@ -300,36 +311,32 @@ static bool_ int_outof(std::shared_ptr<monster_race> r_ptr, int prob)
/*
* Remove the "bad" spells from a spell list
*/
-static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p)
+static void remove_bad_spells(int m_idx, monster_spell_flag_set *spells_p)
{
monster_type *m_ptr = &m_list[m_idx];
-
- u32b f4 = (*f4p);
- u32b f5 = (*f5p);
- u32b f6 = (*f6p);
-
u32b smart = 0L;
+ // Shorthand
+ auto spells(*spells_p);
/* Too stupid to know anything? */
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags2 & (RF2_STUPID)) return;
-
+ if (r_ptr->flags & RF_STUPID)
+ {
+ return;
+ }
/* Must be cheating or learning */
- if (!smart_learn) return;
-
-
- /* Update acquired knowledge */
- if (smart_learn)
+ if (!options->smart_learn)
{
- /* Hack -- Occasionally forget player status */
- if (m_ptr->smart && magik(1)) m_ptr->smart = 0L;
-
- /* Use the memorized flags */
- smart = m_ptr->smart;
+ return;
}
+ /* Hack -- Occasionally forget player status */
+ if (m_ptr->smart && magik(1)) m_ptr->smart = 0L;
+
+ /* Use the memorized flags */
+ smart = m_ptr->smart;
/* Nothing known */
if (!smart) return;
@@ -337,201 +344,199 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p)
if (smart & (SM_IMM_ACID))
{
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_ACID);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_ACID);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ACID);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BR_ACID;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BA_ACID;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ACID;
}
else if ((smart & (SM_OPP_ACID)) && (smart & (SM_RES_ACID)))
{
- if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_ACID);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_ACID);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_ACID);
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BR_ACID;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BA_ACID;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BO_ACID;
}
else if ((smart & (SM_OPP_ACID)) || (smart & (SM_RES_ACID)))
{
- if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_ACID);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_ACID);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_ACID);
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BR_ACID;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BA_ACID;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BO_ACID;
}
if (smart & (SM_IMM_ELEC))
{
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_ELEC);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_ELEC);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ELEC);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BR_ELEC;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BA_ELEC;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ELEC;
}
else if ((smart & (SM_OPP_ELEC)) && (smart & (SM_RES_ELEC)))
{
- if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_ELEC);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_ELEC);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_ELEC);
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BR_ELEC;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BA_ELEC;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BO_ELEC;
}
else if ((smart & (SM_OPP_ELEC)) || (smart & (SM_RES_ELEC)))
{
- if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_ELEC);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_ELEC);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_ELEC);
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BR_ELEC;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BA_ELEC;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BO_ELEC;
}
if (smart & (SM_IMM_FIRE))
{
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_FIRE);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_FIRE);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_FIRE);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BR_FIRE;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BA_FIRE;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_FIRE;
}
else if ((smart & (SM_OPP_FIRE)) && (smart & (SM_RES_FIRE)))
{
- if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_FIRE);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_FIRE);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_FIRE);
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BR_FIRE;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BA_FIRE;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BO_FIRE;
}
else if ((smart & (SM_OPP_FIRE)) || (smart & (SM_RES_FIRE)))
{
- if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_FIRE);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_FIRE);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_FIRE);
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BR_FIRE;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BA_FIRE;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BO_FIRE;
}
if (smart & (SM_IMM_COLD))
{
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_COLD);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_COLD);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_COLD);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ICEE);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BR_COLD;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BA_COLD;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_COLD;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ICEE;
}
else if ((smart & (SM_OPP_COLD)) && (smart & (SM_RES_COLD)))
{
- if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_COLD);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_COLD);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_COLD);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_ICEE);
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BR_COLD;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BA_COLD;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BO_COLD;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BO_ICEE;
}
else if ((smart & (SM_OPP_COLD)) || (smart & (SM_RES_COLD)))
{
- if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_COLD);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_COLD);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_COLD);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_ICEE);
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BR_COLD;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BA_COLD;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BO_COLD;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BO_ICEE;
}
if ((smart & (SM_OPP_POIS)) && (smart & (SM_RES_POIS)))
{
- if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_POIS);
- if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_POIS);
- if (int_outof(r_ptr, 40)) f4 &= ~(RF4_BA_NUKE);
- if (int_outof(r_ptr, 40)) f4 &= ~(RF4_BR_NUKE);
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BR_POIS;
+ if (int_outof(r_ptr, 80)) spells &= ~SF_BA_POIS;
+ if (int_outof(r_ptr, 40)) spells &= ~SF_BA_NUKE;
+ if (int_outof(r_ptr, 40)) spells &= ~SF_BR_NUKE;
}
else if ((smart & (SM_OPP_POIS)) || (smart & (SM_RES_POIS)))
{
- if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_POIS);
- if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_POIS);
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BR_POIS;
+ if (int_outof(r_ptr, 30)) spells &= ~SF_BA_POIS;
}
if (smart & (SM_RES_NETH))
{
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_NETH);
- if (int_outof(r_ptr, 50)) f5 &= ~(RF5_BA_NETH);
- if (int_outof(r_ptr, 50)) f5 &= ~(RF5_BO_NETH);
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_NETH;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BA_NETH;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BO_NETH;
}
if (smart & (SM_RES_LITE))
{
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_LITE);
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_LITE;
}
if (smart & (SM_RES_DARK))
{
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_DARK);
- if (int_outof(r_ptr, 50)) f5 &= ~(RF5_BA_DARK);
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_DARK;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BA_DARK;
}
if (smart & (SM_RES_FEAR))
{
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_SCARE);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_SCARE;
}
if (smart & (SM_RES_CONF))
{
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_CONF);
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_CONF);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_CONF;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_CONF;
}
if (smart & (SM_RES_CHAOS))
{
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_CONF);
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_CONF);
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_CHAO);
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BA_CHAO);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_CONF;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_CONF;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_CHAO;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BA_CHAO;
}
if (smart & (SM_RES_DISEN))
{
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_DISE);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BR_DISE;
}
if (smart & (SM_RES_BLIND))
{
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BLIND);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BLIND;
}
if (smart & (SM_RES_NEXUS))
{
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_NEXU);
- if (int_outof(r_ptr, 50)) f6 &= ~(RF6_TELE_LEVEL);
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_NEXU;
+ if (int_outof(r_ptr, 50)) spells &= ~SF_TELE_LEVEL;
}
if (smart & (SM_RES_SOUND))
{
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_SOUN);
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_SOUN;
}
if (smart & (SM_RES_SHARD))
{
- if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_SHAR);
- if (int_outof(r_ptr, 20)) f4 &= ~(RF4_ROCKET);
+ if (int_outof(r_ptr, 50)) spells &= ~SF_BR_SHAR;
+ if (int_outof(r_ptr, 20)) spells &= ~SF_ROCKET;
}
if (smart & (SM_IMM_REFLECT))
{
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_COLD);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_FIRE);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ACID);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ELEC);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_POIS);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_NETH);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_WATE);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_MANA);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_PLAS);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ICEE);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_MISSILE);
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_1);
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_2);
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_3);
- if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_4);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_COLD;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_FIRE;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ACID;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ELEC;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_POIS;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_NETH;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_WATE;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_MANA;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_PLAS;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ICEE;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_MISSILE;
+ if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_1);
+ if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_2);
+ if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_3);
+ if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_4);
}
if (smart & (SM_IMM_FREE))
{
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_HOLD);
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_SLOW);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_HOLD;
+ if (int_outof(r_ptr, 100)) spells &= ~SF_SLOW;
}
if (smart & (SM_IMM_MANA))
{
- if (int_outof(r_ptr, 100)) f5 &= ~(RF5_DRAIN_MANA);
+ if (int_outof(r_ptr, 100)) spells &= ~SF_DRAIN_MANA;
}
/* XXX XXX XXX No spells left? */
/* if (!f4 && !f5 && !f6) ... */
- (*f4p) = f4;
- (*f5p) = f5;
- (*f6p) = f6;
+ *spells_p = spells;
}
@@ -622,122 +627,75 @@ static void bolt(int m_idx, int typ, int dam_hp)
int flg = PROJECT_STOP | PROJECT_KILL;
/* Target the player with a bolt attack */
- (void)project(m_idx, 0, p_ptr->py, p_ptr->px, dam_hp, typ, flg);
-}
-
-
-/*
- * Return TRUE if a spell is good for hurting the player (directly).
- */
-static bool_ spell_attack(byte spell)
-{
- /* All RF4 spells hurt (except for shriek, multiply, summon animal) */
- if (spell >= 96 + 3 && spell <= 96 + 31) return (TRUE);
-
- /* Various "ball" spells */
- if (spell >= 128 && spell <= 128 + 8) return (TRUE);
-
- /* "Cause wounds" and "bolt" spells */
- if (spell >= 128 + 12 && spell <= 128 + 26) return (TRUE);
-
- /* Hand of Doom */
- if (spell == 160 + 1) return (TRUE);
-
- /* Doesn't hurt */
- return (FALSE);
+ project(m_idx, 0, p_ptr->py, p_ptr->px, dam_hp, typ, flg);
}
/*
- * Return TRUE if a spell is good for escaping.
+ * Calculate the mask for "bolt" spells
*/
-static bool_ spell_escape(byte spell)
+static monster_spell_flag_set compute_bolt_mask()
{
- /* Blink or Teleport */
- if (spell == 160 + 4 || spell == 160 + 5) return (TRUE);
-
- /* Teleport the player away */
- if (spell == 160 + 7 || spell == 160 + 8) return (TRUE);
-
- /* Isn't good for escaping */
- return (FALSE);
-}
-
-/*
- * Return TRUE if a spell is good for annoying the player.
- */
-static bool_ spell_annoy(byte spell)
-{
- /* Shriek */
- if (spell == 96 + 0) return (TRUE);
-
- /* Brain smash, et al (added curses) */
- if (spell >= 128 + 9 && spell <= 128 + 14) return (TRUE);
-
- /* Scare, confuse, blind, slow, paralyze */
- if (spell >= 128 + 27 && spell <= 128 + 31) return (TRUE);
-
- /* Teleport to */
- if (spell == 160 + 6) return (TRUE);
-
- /* Darkness, make traps, cause amnesia */
- if (spell >= 160 + 9 && spell <= 160 + 11) return (TRUE);
-
- /* Doesn't annoy */
- return (FALSE);
-}
-
-/*
- * Return TRUE if a spell summons help.
- */
-static bool_ spell_summon(byte spell)
-{
- /* RF4_S_ANIMAL, RF6_S_ANIMALS */
- if (spell == 96 + 2 || spell == 160 + 3) return (TRUE);
- /* All other summon spells */
- if (spell >= 160 + 13 && spell <= 160 + 31) return (TRUE);
-
- /* Doesn't summon */
- return (FALSE);
+ monster_spell_flag_set flags;
+ for (auto const &monster_spell: monster_spells())
+ {
+ if (monster_spell->is_bolt)
+ {
+ flags |= monster_spell->flag_set;
+ }
+ }
+ return flags;
}
/*
- * Return TRUE if a spell is good in a tactical situation.
+ * Calculate mask for summoning spells
*/
-static bool_ spell_tactic(byte spell)
+static monster_spell_flag_set compute_summoning_mask()
{
- /* Blink */
- if (spell == 160 + 4) return (TRUE);
-
- /* Not good */
- return (FALSE);
+ monster_spell_flag_set flags;
+ for (auto const &monster_spell: monster_spells())
+ {
+ if (monster_spell->is_summon)
+ {
+ flags |= monster_spell->flag_set;
+ }
+ }
+ return flags;
}
/*
- * Return TRUE if a spell hastes.
+ * Calculate mask for spells requiring SMART flag
*/
-static bool_ spell_haste(byte spell)
+static monster_spell_flag_set compute_smart_mask()
{
- /* Haste self */
- if (spell == 160 + 0) return (TRUE);
-
- /* Not a haste spell */
- return (FALSE);
+ monster_spell_flag_set flags;
+ for (auto const &monster_spell: monster_spells())
+ {
+ if (monster_spell->is_smart)
+ {
+ flags |= monster_spell->flag_set;
+ }
+ }
+ return flags;
}
/*
- * Return TRUE if a spell is good for healing.
+ * Calculate mask for spells requiring SMART flag
*/
-static bool_ spell_heal(byte spell)
+static monster_spell_flag_set compute_innate_mask()
{
- /* Heal */
- if (spell == 160 + 2) return (TRUE);
-
- /* No healing */
- return (FALSE);
+ monster_spell_flag_set flags;
+ for (auto const &monster_spell: monster_spells())
+ {
+ if (monster_spell->is_innate)
+ {
+ flags |= monster_spell->flag_set;
+ }
+ }
+ return flags;
}
@@ -755,49 +713,71 @@ static bool_ spell_heal(byte spell)
*
* This function may well be an efficiency bottleneck.
*/
-static int choose_attack_spell(int m_idx, byte spells[], byte num)
+static monster_spell const *choose_attack_spell(int m_idx, std::vector<monster_spell const *> const &spells)
{
monster_type *m_ptr = &m_list[m_idx];
- byte escape[96], escape_num = 0;
- byte attack[96], attack_num = 0;
- byte summon[96], summon_num = 0;
- byte tactic[96], tactic_num = 0;
- byte annoy[96], annoy_num = 0;
- byte haste[96], haste_num = 0;
- byte heal[96], heal_num = 0;
-
/* Stupid monsters choose randomly */
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags2 & (RF2_STUPID))
+ if (r_ptr->flags & RF_STUPID)
{
/* Pick at random */
- return (spells[rand_int(num)]);
+ return spells[rand_int(spells.size())];
}
+ /* Spells by category */
+ std::vector<monster_spell const *> escape; escape.reserve(spells.size());
+ std::vector<monster_spell const *> attack; attack.reserve(spells.size());
+ std::vector<monster_spell const *> summon; summon.reserve(spells.size());
+ std::vector<monster_spell const *> tactic; tactic.reserve(spells.size());
+ std::vector<monster_spell const *> annoy ; annoy.reserve(spells.size());
+ std::vector<monster_spell const *> haste ; haste.reserve(spells.size());
+ std::vector<monster_spell const *> heal ; heal.reserve(spells.size());
+
/* Categorize spells */
- for (int i = 0; i < num; i++)
+ for (std::size_t i = 0; i < spells.size(); i++)
{
/* Escape spell? */
- if (spell_escape(spells[i])) escape[escape_num++] = spells[i];
+ if (spells[i]->is_escape)
+ {
+ escape.push_back(spells[i]);
+ }
/* Attack spell? */
- if (spell_attack(spells[i])) attack[attack_num++] = spells[i];
+ if (spells[i]->is_damage)
+ {
+ attack.push_back(spells[i]);
+ }
/* Summon spell? */
- if (spell_summon(spells[i])) summon[summon_num++] = spells[i];
+ if (spells[i]->is_summon)
+ {
+ summon.push_back(spells[i]);
+ }
/* Tactical spell? */
- if (spell_tactic(spells[i])) tactic[tactic_num++] = spells[i];
+ if (spells[i]->is_tactic)
+ {
+ tactic.push_back(spells[i]);
+ }
/* Annoyance spell? */
- if (spell_annoy(spells[i])) annoy[annoy_num++] = spells[i];
+ if (spells[i]->is_annoy)
+ {
+ annoy.push_back(spells[i]);
+ }
/* Haste spell? */
- if (spell_haste(spells[i])) haste[haste_num++] = spells[i];
+ if (spells[i]->is_haste)
+ {
+ haste.push_back(spells[i]);
+ }
/* Heal spell? */
- if (spell_heal(spells[i])) heal[heal_num++] = spells[i];
+ if (spells[i]->is_heal)
+ {
+ heal.push_back(spells[i]);
+ }
}
/*** Try to pick an appropriate spell type ***/
@@ -805,68 +785,59 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num)
/* Hurt badly or afraid, attempt to flee */
if ((m_ptr->hp < m_ptr->maxhp / 3) || m_ptr->monfear)
{
- /* Choose escape spell if possible */
- if (escape_num) return (escape[rand_int(escape_num)]);
+ if (!escape.empty()) return escape[rand_int(escape.size())];
}
/* Still hurt badly, couldn't flee, attempt to heal */
if (m_ptr->hp < m_ptr->maxhp / 3)
{
- /* Choose heal spell if possible */
- if (heal_num) return (heal[rand_int(heal_num)]);
+ if (!heal.empty()) return heal[rand_int(heal.size())];
}
/* Player is close and we have attack spells, blink away */
- if ((distance(p_ptr->py, p_ptr->px, m_ptr->fy, m_ptr->fx) < 4) && attack_num && (rand_int(100) < 75))
+ if ((distance(p_ptr->py, p_ptr->px, m_ptr->fy, m_ptr->fx) < 4) && !attack.empty() && (rand_int(100) < 75))
{
- /* Choose tactical spell */
- if (tactic_num) return (tactic[rand_int(tactic_num)]);
+ if (!tactic.empty()) return tactic[rand_int(tactic.size())];
}
/* We're hurt (not badly), try to heal */
if ((m_ptr->hp < m_ptr->maxhp * 3 / 4) && (rand_int(100) < 75))
{
- /* Choose heal spell if possible */
- if (heal_num) return (heal[rand_int(heal_num)]);
+ if (!heal.empty()) return heal[rand_int(heal.size())];
}
/* Summon if possible (sometimes) */
- if (summon_num && (rand_int(100) < 50))
+ if (!summon.empty() && (rand_int(100) < 50))
{
- /* Choose summon spell */
- return (summon[rand_int(summon_num)]);
+ return summon[rand_int(summon.size())];
}
/* Attack spell (most of the time) */
- if (attack_num && (rand_int(100) < 85))
+ if (!attack.empty() && (rand_int(100) < 85))
{
- /* Choose attack spell */
- return (attack[rand_int(attack_num)]);
+ return attack[rand_int(attack.size())];
}
/* Try another tactical spell (sometimes) */
- if (tactic_num && (rand_int(100) < 50))
+ if (!tactic.empty() && (rand_int(100) < 50))
{
- /* Choose tactic spell */
- return (tactic[rand_int(tactic_num)]);
+ return tactic[rand_int(tactic.size())];
}
/* Haste self if we aren't already somewhat hasted (rarely) */
- if (haste_num && (rand_int(100) < (20 + m_ptr->speed - m_ptr->mspeed)))
+ if (!haste.empty() && (rand_int(100) < (20 + m_ptr->speed - m_ptr->mspeed)))
{
- /* Choose haste spell */
- return (haste[rand_int(haste_num)]);
+ return haste[rand_int(haste.size())];
}
/* Annoy player (most of the time) */
- if (annoy_num && (rand_int(100) < 85))
+ if (!annoy.empty() && (rand_int(100) < 85))
{
- /* Choose annoyance spell */
- return (annoy[rand_int(annoy_num)]);
+ return annoy[rand_int(annoy.size())];
}
/* Choose no spell */
- return (0);
+ return nullptr;
}
@@ -883,10 +854,10 @@ static void breath(int m_idx, int typ, int dam_hp, int rad)
auto const r_ptr = m_ptr->race();
/* Determine the radius of the blast */
- if (rad < 1) rad = (r_ptr->flags2 & (RF2_POWERFUL)) ? 3 : 2;
+ if (rad < 1) rad = (r_ptr->flags & RF_POWERFUL) ? 3 : 2;
/* Target the player with a ball attack */
- (void)project(m_idx, rad, p_ptr->py, p_ptr->px, dam_hp, typ, flg);
+ project(m_idx, rad, p_ptr->py, p_ptr->px, dam_hp, typ, flg);
}
@@ -903,9 +874,9 @@ static void monst_breath_monst(int m_idx, int y, int x, int typ, int dam_hp, int
auto const r_ptr = m_ptr->race();
/* Determine the radius of the blast */
- if (rad < 1) rad = (r_ptr->flags2 & (RF2_POWERFUL)) ? 3 : 2;
+ if (rad < 1) rad = (r_ptr->flags & RF_POWERFUL) ? 3 : 2;
- (void)project(m_idx, rad, y, x, dam_hp, typ, flg);
+ project(m_idx, rad, y, x, dam_hp, typ, flg);
}
@@ -918,7 +889,7 @@ static void monst_bolt_monst(int m_idx, int y, int x, int typ, int dam_hp)
{
int flg = PROJECT_STOP | PROJECT_KILL;
- (void)project(m_idx, 0, y, x, dam_hp, typ, flg);
+ project(m_idx, 0, y, x, dam_hp, typ, flg);
}
@@ -932,7 +903,7 @@ static void monster_msg(cptr fmt, ...)
va_start(vp, fmt);
/* Format the args, save the length */
- (void)vstrnfmt(buf, 1024, fmt, vp);
+ vstrnfmt(buf, 1024, fmt, vp);
/* End the Varargs Stuff */
va_end(vp);
@@ -943,43 +914,38 @@ static void monster_msg(cptr fmt, ...)
void monster_msg_simple(cptr s)
{
+ auto &messages = game->messages;
+
/* Display */
- if (disturb_other)
+ if (options->disturb_other)
{
msg_print(s);
}
else
{
- message_add(s, TERM_WHITE);
+ messages.add(s, TERM_WHITE);
p_ptr->window |= PW_MESSAGE;
}
}
-void cmonster_msg(char a, cptr fmt, ...)
+/**
+ * Extract list of spell indexes from a flag set.
+ */
+static std::vector<monster_spell const *> extract_spells(monster_spell_flag_set const &spell_flag_set)
{
- va_list vp;
-
- char buf[1024];
-
- /* Begin the Varargs Stuff */
- va_start(vp, fmt);
-
- /* Format the args, save the length */
- (void)vstrnfmt(buf, 1024, fmt, vp);
+ auto result = std::vector<monster_spell const *>();
+ result.reserve(spell_flag_set.nbits);
- /* End the Varargs Stuff */
- va_end(vp);
-
- /* Display */
- if (disturb_other)
- cmsg_print(a, buf);
- else
+ for (auto const &monster_spell: monster_spells())
{
- message_add(buf, a);
- p_ptr->window |= PW_MESSAGE;
+ if (bool(spell_flag_set & monster_spell->flag_set))
+ {
+ result.push_back(monster_spell);
+ }
}
-}
+ return result;
+}
/*
* Monster tries to 'cast a spell' (or breath, etc)
@@ -988,15 +954,13 @@ void cmonster_msg(char a, cptr fmt, ...)
int monst_spell_monst_spell = -1;
static bool_ monst_spell_monst(int m_idx)
{
+ static const monster_spell_flag_set SF_INT_MASK = compute_smart_mask();
+
int y = 0, x = 0;
- int i = 1;
- int thrown_spell;
- byte spell[96], num = 0;
char m_name[80], t_name[80];
char m_poss[80];
char ddesc[80];
monster_type *m_ptr = &m_list[m_idx]; /* Attacker */
- u32b f4, f5, f6; /* racial spell flags */
bool_ direct = TRUE;
bool_ wake_up = FALSE;
@@ -1027,20 +991,14 @@ static bool_ monst_spell_monst(int m_idx)
if ((rand_int(100) >= chance) && (monst_spell_monst_spell == -1)) return (FALSE);
- /* Target location */
- if (m_ptr->target > -1)
+ /* Make sure monster actually has a target */
+ if (m_ptr->target <= 0)
{
- if (m_ptr->target > 0)
- {
- i = m_ptr->target;
- }
- else return FALSE;
+ return FALSE;
}
- else return FALSE;
-
{
- int t_idx = i;
+ int t_idx = m_ptr->target;
monster_type *t_ptr = &m_list[t_idx];
auto const tr_ptr = t_ptr->race();
@@ -1058,45 +1016,26 @@ static bool_ monst_spell_monst(int m_idx)
/* Extract the monster level */
const int rlev = ((m_ptr->level >= 1) ? m_ptr->level : 1);
- /* Extract the racial spell flags */
- f4 = r_ptr->flags4;
- f5 = r_ptr->flags5;
- f6 = r_ptr->flags6;
+ /* Which spells are allowed? */
+ monster_spell_flag_set allowed_spells = r_ptr->spells;
/* Hack -- allow "desperate" spells */
- if ((r_ptr->flags2 & (RF2_SMART)) &&
+ if ((r_ptr->flags & RF_SMART) &&
(m_ptr->hp < m_ptr->maxhp / 10) &&
(rand_int(100) < 50))
{
/* Require intelligent spells */
- f4 &= (RF4_INT_MASK);
- f5 &= (RF5_INT_MASK);
- f6 &= (RF6_INT_MASK);
-
- /* No spells left */
- if ((!f4 && !f5 && !f6) && (monst_spell_monst_spell == -1)) return (FALSE);
- }
-
- /* Extract the "inate" spells */
- for (int k = 0; k < 32; k++)
- {
- if (f4 & (1L << k)) spell[num++] = k + 32 * 3;
- }
+ allowed_spells &= SF_INT_MASK;
- /* Extract the "normal" spells */
- for (int k = 0; k < 32; k++)
- {
- if (f5 & (1L << k)) spell[num++] = k + 32 * 4;
+ /* No spells left? */
+ if ((!allowed_spells) && (monst_spell_monst_spell == -1)) return (FALSE);
}
- /* Extract the "bizarre" spells */
- for (int k = 0; k < 32; k++)
- {
- if (f6 & (1L << k)) spell[num++] = k + 32 * 5;
- }
+ /* Extract spells */
+ auto spell = extract_spells(allowed_spells);
- /* No spells left */
- if (!num) return (FALSE);
+ /* No spells left? */
+ if (spell.empty()) return (FALSE);
/* Stop if player is dead or gone */
if (!alive || death) return (FALSE);
@@ -1117,12 +1056,12 @@ static bool_ monst_spell_monst(int m_idx)
monster_desc(ddesc, m_ptr, 0x88);
/* Choose a spell to cast */
- thrown_spell = spell[rand_int(num)];
+ auto thrown_spell = spell[rand_int(spell.size())];
/* Force a spell ? */
if (monst_spell_monst_spell > -1)
{
- thrown_spell = monst_spell_monst_spell;
+ thrown_spell = spell[monst_spell_monst_spell];
monst_spell_monst_spell = -1;
}
@@ -1131,47 +1070,115 @@ static bool_ monst_spell_monst(int m_idx)
see_either = (see_m || see_t);
see_both = (see_m && see_t);
- int count = 0;
- switch (thrown_spell)
+ /* Do a breath */
+ auto do_breath = [&](char const *element, int gf, s32b max, int divisor) -> void {
+ // Interrupt
+ disturb_on_other();
+ // Message
+ if (!see_either)
+ {
+ monster_msg("You hear breathing noise.");
+ }
+ else if (blind)
+ {
+ monster_msg("%^s breathes.", m_name);
+ }
+ else
+ {
+ monster_msg("%^s breathes %s at %s.", m_name, element, t_name);
+ }
+ // Breathe
+ monst_breath_monst(m_idx, y, x, gf, std::min(max, m_ptr->hp / divisor), 0);
+ };
+
+ /* Messages for summoning */
+ struct summon_messages {
+ char const *singular;
+ char const *plural;
+ };
+
+ /* Default message for summoning when player is blinded */
+ auto blind_msg_default = summon_messages {
+ "You hear something appear nearby.",
+ "You hear many things appear nearby."
+ };
+
+ /* Do a summoning spell */
+ auto do_summon = [&](char const *action, int n, int friendly_type, int hostile_type, summon_messages const &blind_msg) -> void {
+ // Interrupt
+ disturb_on_other();
+
+ // Message
+ if (blind || !see_m)
+ {
+ monster_msg("%^s mumbles.", m_name);
+ }
+ else
+ {
+ monster_msg("%^s magically %s", m_name, action);
+ }
+
+ // Do the actual summoning
+ int count = 0;
+ for (int k = 0; k < n; k++)
+ {
+ if (friendly)
+ {
+ count += summon_specific_friendly(m_ptr->fy, m_ptr->fx, rlev, friendly_type, TRUE);
+ }
+ else if (!friendly)
+ {
+ count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, hostile_type);
+ }
+ }
+ // Message for blinded characters
+ if (blind)
+ {
+ if (count == 1)
+ {
+ monster_msg(blind_msg.singular);
+ }
+ else if (count > 1)
+ {
+ monster_msg(blind_msg.plural);
+ }
+ }
+ };
+
+ /* There's no summoning friendly uniques or Nazgul */
+ auto spell_idx = thrown_spell->spell_idx;
+
+ if (friendly)
+ {
+ if ((thrown_spell->spell_idx == SF_S_UNIQUE_IDX) &&
+ (thrown_spell->spell_idx == SF_S_WRAITH_IDX))
+ {
+ // Summon high undead instead
+ spell_idx = SF_S_HI_UNDEAD_IDX;
+ }
+ }
+
+ /* Spell effect */
+ switch (spell_idx)
{
- /* RF4_SHRIEK */
- case 96 + 0:
+ case SF_SHRIEK_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_m) monster_msg("You hear a shriek.");
else monster_msg("%^s shrieks at %s.", m_name, t_name);
wake_up = TRUE;
break;
}
- /* RF4_MULTIPLY */
- case 96 + 1:
- {
- break;
- }
-
- /* RF4_S_ANIMAL */
- case 96 + 2:
+ case SF_MULTIPLY_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons an animal!", m_name);
- for (int k = 0; k < 1; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_ANIMAL);
- }
- if (blind && count) monster_msg("You hear something appear nearby.");
break;
}
- /* RF4_ROCKET */
- case 96 + 3:
+ case SF_ROCKET_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg("You hear an explosion!");
else if (blind) monster_msg("%^s shoots something.", m_name);
else monster_msg("%^s fires a rocket at %s.", m_name, t_name);
@@ -1180,371 +1187,204 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF4_ARROW_1 */
- case 96 + 4:
+ case SF_ARROW_1_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg("You hear a strange noise.");
else if (blind) monster_msg("%^s makes a strange noise.", m_name);
else monster_msg("%^s fires an arrow at %s.", m_name, t_name);
- sound(SOUND_SHOOT);
monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(1, 6));
break;
}
- /* RF4_ARROW_2 */
- case 96 + 5:
+ case SF_ARROW_2_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg("You hear a strange noise.");
else if (blind) monster_msg("%^s makes a strange noise.", m_name);
else monster_msg("%^s fires an arrow at %s.", m_name, t_name);
- sound(SOUND_SHOOT);
monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(3, 6));
break;
}
- /* RF4_ARROW_3 */
- case 96 + 6:
+ case SF_ARROW_3_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg("You hear a strange noise.");
else if (blind) monster_msg("%^s makes a strange noise.", m_name);
else monster_msg("%^s fires a missile at %s.", m_name, t_name);
- sound(SOUND_SHOOT);
monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(5, 6));
break;
}
- /* RF4_ARROW_4 */
- case 96 + 7:
+ case SF_ARROW_4_IDX:
{
if (!see_either) monster_msg("You hear a strange noise.");
- else if (disturb_other) disturb(1);
+ else disturb_on_other();
if (blind) monster_msg("%^s makes a strange noise.", m_name);
else monster_msg("%^s fires a missile at %s.", m_name, t_name);
- sound(SOUND_SHOOT);
monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(7, 6));
break;
}
- /* RF4_BR_ACID */
- case 96 + 8:
+ case SF_BR_ACID_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes acid at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_ACID,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
+ do_breath("acid", GF_ACID, 1600, 3);
break;
}
- /* RF4_BR_ELEC */
- case 96 + 9:
+ case SF_BR_ELEC_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes lightning at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_ELEC,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
+ do_breath("lightning", GF_ELEC, 1600, 3);
break;
}
- /* RF4_BR_FIRE */
- case 96 + 10:
+ case SF_BR_FIRE_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes fire at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_FIRE,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
+ do_breath("fire", GF_FIRE, 1600, 3);
break;
}
- /* RF4_BR_COLD */
- case 96 + 11:
+ case SF_BR_COLD_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes frost at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_COLD,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
+ do_breath("frost", GF_COLD, 1600, 3);
break;
}
- /* RF4_BR_POIS */
- case 96 + 12:
+ case SF_BR_POIS_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes gas at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_POIS,
- ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0);
+ do_breath("gas", GF_POIS, 800, 3);
break;
}
- /* RF4_BR_NETH */
- case 96 + 13:
+ case SF_BR_NETH_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes nether at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_NETHER,
- ((m_ptr->hp / 6) > 550 ? 550 : (m_ptr->hp / 6)), 0);
+ do_breath("nether", GF_NETHER, 550, 6);
break;
}
- /* RF4_BR_LITE */
- case 96 + 14:
+ case SF_BR_LITE_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes light at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_LITE,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
+ do_breath("light", GF_LITE, 400, 6);
break;
}
- /* RF4_BR_DARK */
- case 96 + 15:
+ case SF_BR_DARK_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes darkness at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_DARK,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
+ do_breath("darkness", GF_DARK, 400, 6);
break;
}
- /* RF4_BR_CONF */
- case 96 + 16:
+ case SF_BR_CONF_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes confusion at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_CONFUSION,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
+ do_breath("confusion", GF_CONFUSION, 400, 6);
break;
}
- /* RF4_BR_SOUN */
- case 96 + 17:
+ case SF_BR_SOUN_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes sound at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_SOUND,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
+ do_breath("sound", GF_SOUND, 400, 6);
break;
}
- /* RF4_BR_CHAO */
- case 96 + 18:
+ case SF_BR_CHAO_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes chaos at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_CHAOS,
- ((m_ptr->hp / 6) > 600 ? 600 : (m_ptr->hp / 6)), 0);
+ do_breath("chaos", GF_CHAOS, 600, 6);
break;
}
- /* RF4_BR_DISE */
- case 96 + 19:
+ case SF_BR_DISE_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes disenchantment at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_DISENCHANT,
- ((m_ptr->hp / 6) > 500 ? 500 : (m_ptr->hp / 6)), 0);
+ do_breath("disenchantment", GF_DISENCHANT, 500, 6);
break;
}
- /* RF4_BR_NEXU */
- case 96 + 20:
+ case SF_BR_NEXU_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes nexus at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_NEXUS,
- ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0);
+ do_breath("nexus", GF_NEXUS, 250, 3);
break;
}
- /* RF4_BR_TIME */
- case 96 + 21:
+ case SF_BR_TIME_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes time at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_TIME,
- ((m_ptr->hp / 3) > 150 ? 150 : (m_ptr->hp / 3)), 0);
+ do_breath("time", GF_TIME, 150, 3);
break;
}
- /* RF4_BR_INER */
- case 96 + 22:
+ case SF_BR_INER_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes inertia at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_INERTIA,
- ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0);
+ do_breath("inertia", GF_INERTIA, 200, 6);
break;
}
- /* RF4_BR_GRAV */
- case 96 + 23:
+ case SF_BR_GRAV_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes gravity at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_GRAVITY,
- ((m_ptr->hp / 3) > 200 ? 200 : (m_ptr->hp / 3)), 0);
+ do_breath("gravity", GF_GRAVITY, 200, 3);
break;
}
- /* RF4_BR_SHAR */
- case 96 + 24:
+ case SF_BR_SHAR_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes shards at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_SHARDS,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
+ do_breath("shards", GF_SHARDS, 400, 6);
break;
}
- /* RF4_BR_PLAS */
- case 96 + 25:
+ case SF_BR_PLAS_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes plasma at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_PLASMA,
- ((m_ptr->hp / 6) > 150 ? 150 : (m_ptr->hp / 6)), 0);
+ do_breath("plasma", GF_PLASMA, 150, 6);
break;
}
- /* RF4_BR_WALL */
- case 96 + 26:
+ case SF_BR_WALL_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes force at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_FORCE,
- ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0);
+ do_breath("force", GF_FORCE, 200, 6);
break;
}
- /* RF4_BR_MANA */
- case 96 + 27:
+ case SF_BR_MANA_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes magical energy at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_MANA,
- ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0);
+ do_breath("magical energy", GF_MANA, 250, 3);
break;
}
- /* RF4_BA_NUKE */
- case 96 + 28:
+ case SF_BA_NUKE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg("You hear someone mumble.");
else if (blind) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a ball of radiation at %s.", m_name, t_name);
- sound(SOUND_BREATH);
monst_breath_monst(m_idx, y, x, GF_NUKE,
(rlev + damroll(10, 6)), 2);
break;
}
- /* RF4_BR_NUKE */
- case 96 + 29:
+ case SF_BR_NUKE_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes toxic waste at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_NUKE,
- ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0);
+ do_breath("toxic waste", GF_NUKE, 800, 3);
break;
}
- /* RF4_BA_CHAO */
- case 96 + 30:
+ case SF_BA_CHAO_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg("You hear someone mumble frighteningly.");
else if (blind) monster_msg("%^s mumbles frighteningly.", m_name);
else monster_msg("%^s invokes a raw Chaos upon %s.", m_name, t_name);
- sound(SOUND_BREATH);
monst_breath_monst(m_idx, y, x, GF_CHAOS,
(rlev * 2) + damroll(10, 10), 4);
break;
}
- /* RF4_BR_DISI -> Breathe Disintegration */
- case 96 + 31:
+ case SF_BR_DISI_IDX:
{
- if (disturb_other) disturb(1);
- if (!see_either) monster_msg("You hear breathing noise.");
- else if (blind) monster_msg("%^s breathes.", m_name);
- else monster_msg("%^s breathes disintegration at %s.", m_name, t_name);
- sound(SOUND_BREATH);
- monst_breath_monst(m_idx, y, x, GF_DISINTEGRATE,
- ((m_ptr->hp / 3) > 300 ? 300 : (m_ptr->hp / 3)), 0);
+ do_breath("disintegration", GF_DISINTEGRATE, 300, 3);
break;
}
- /* RF5_BA_ACID */
- case 128 + 0:
+ case SF_BA_ACID_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble.");
else if (blind) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts an acid ball at %s.", m_name, t_name);
@@ -1552,10 +1392,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_ELEC */
- case 128 + 1:
+ case SF_BA_ELEC_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble.");
else
if (blind) monster_msg("%^s mumbles.", m_name);
@@ -1564,10 +1403,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_FIRE */
- case 128 + 2:
+ case SF_BA_FIRE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble.");
else
if (blind) monster_msg("%^s mumbles.", m_name);
@@ -1576,10 +1414,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_COLD */
- case 128 + 3:
+ case SF_BA_COLD_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble.");
else
if (blind) monster_msg("%^s mumbles.", m_name);
@@ -1588,10 +1425,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_POIS */
- case 128 + 4:
+ case SF_BA_POIS_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble.");
else
if (blind) monster_msg("%^s mumbles.", m_name);
@@ -1600,10 +1436,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_NETH */
- case 128 + 5:
+ case SF_BA_NETH_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble.");
else
if (blind) monster_msg("%^s mumbles.", m_name);
@@ -1612,10 +1447,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_WATE */
- case 128 + 6:
+ case SF_BA_WATE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble.");
else
if (blind) monster_msg("%^s mumbles.", m_name);
@@ -1625,10 +1459,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_MANA */
- case 128 + 7:
+ case SF_BA_MANA_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble powerfully.");
else
if (blind) monster_msg("%^s mumbles powerfully.", m_name);
@@ -1637,10 +1470,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BA_DARK */
- case 128 + 8:
+ case SF_BA_DARK_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_either) monster_msg ("You hear someone mumble powerfully.");
else
if (blind) monster_msg("%^s mumbles powerfully.", m_name);
@@ -1649,8 +1481,7 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_DRAIN_MANA */
- case 128 + 9:
+ case SF_DRAIN_MANA_IDX:
{
/* Attack power */
int r1 = (randint(rlev) / 2) + 1;
@@ -1664,7 +1495,7 @@ static bool_ monst_spell_monst(int m_idx)
/* Heal the monster */
if (m_ptr->hp < m_ptr->maxhp)
{
- if (!(tr_ptr->flags4 || tr_ptr->flags5 || tr_ptr->flags6))
+ if (!tr_ptr->spells)
{
if (see_both)
monster_msg("%^s is unaffected!", t_name);
@@ -1690,12 +1521,11 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_MIND_BLAST */
- case 128 + 10:
+ case SF_MIND_BLAST_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!seen)
{
@@ -1707,16 +1537,10 @@ static bool_ monst_spell_monst(int m_idx)
}
/* Attempt a saving throw */
- if ((tr_ptr->flags1 & (RF1_UNIQUE)) ||
- (tr_ptr->flags3 & (RF3_NO_CONF)) ||
+ if ((tr_ptr->flags & RF_UNIQUE) ||
+ (tr_ptr->flags & RF_NO_CONF) ||
(t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10))
{
- /* Memorize a flag */
- if (tr_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) tr_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* No obvious effect */
if (see_t)
{
@@ -1736,11 +1560,10 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BRAIN_SMASH */
- case 128 + 11:
+ case SF_BRAIN_SMASH_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!seen)
{
/* */
@@ -1751,15 +1574,10 @@ static bool_ monst_spell_monst(int m_idx)
}
/* Attempt a saving throw */
- if ((tr_ptr->flags1 & (RF1_UNIQUE)) ||
- (tr_ptr->flags3 & (RF3_NO_CONF)) ||
+ if ((tr_ptr->flags & RF_UNIQUE) ||
+ (tr_ptr->flags & RF_NO_CONF) ||
(t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10))
{
- /* Memorize a flag */
- if (tr_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) tr_ptr->r_flags3 |= (RF3_NO_CONF);
- }
/* No obvious effect */
if (see_t)
{
@@ -1782,11 +1600,10 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_CAUSE_1 */
- case 128 + 12:
+ case SF_CAUSE_1_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s points at %s and curses.", m_name, t_name);
if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)
@@ -1803,11 +1620,10 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_CAUSE_2 */
- case 128 + 13:
+ case SF_CAUSE_2_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s points at %s and curses horribly.", m_name, t_name);
if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)
@@ -1823,11 +1639,10 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_CAUSE_3 */
- case 128 + 14:
+ case SF_CAUSE_3_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s points at %s, incanting terribly!", m_name, t_name);
if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)
@@ -1843,11 +1658,10 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_CAUSE_4 */
- case 128 + 15:
+ case SF_CAUSE_4_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s points at %s, screaming the word 'DIE!'", m_name, t_name);
if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)
@@ -1863,10 +1677,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_ACID */
- case 128 + 16:
+ case SF_BO_ACID_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts an acid bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_ACID,
@@ -1874,10 +1687,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_ELEC */
- case 128 + 17:
+ case SF_BO_ELEC_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a lightning bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_ELEC,
@@ -1885,10 +1697,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_FIRE */
- case 128 + 18:
+ case SF_BO_FIRE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a fire bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_FIRE,
@@ -1896,10 +1707,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_COLD */
- case 128 + 19:
+ case SF_BO_COLD_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a frost bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_COLD,
@@ -1907,17 +1717,15 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_POIS */
- case 128 + 20:
+ case SF_BO_POIS_IDX:
{
/* XXX XXX XXX */
break;
}
- /* RF5_BO_NETH */
- case 128 + 21:
+ case SF_BO_NETH_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a nether bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_NETHER,
@@ -1925,10 +1733,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_WATE */
- case 128 + 22:
+ case SF_BO_WATE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a water bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_WATER,
@@ -1936,10 +1743,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_MANA */
- case 128 + 23:
+ case SF_BO_MANA_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a mana bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_MANA,
@@ -1947,10 +1753,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_PLAS */
- case 128 + 24:
+ case SF_BO_PLAS_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a plasma bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_PLASMA,
@@ -1958,10 +1763,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BO_ICEE */
- case 128 + 25:
+ case SF_BO_ICEE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts an ice bolt at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_ICE,
@@ -1969,10 +1773,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_MISSILE */
- case 128 + 26:
+ case SF_MISSILE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a magic missile at %s.", m_name, t_name);
monst_bolt_monst(m_idx, y, x, GF_MISSILE,
@@ -1980,14 +1783,13 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_SCARE */
- case 128 + 27:
+ case SF_SCARE_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles, and you hear scary noises.", m_name);
else monster_msg("%^s casts a fearful illusion at %s.", m_name, t_name);
- if (tr_ptr->flags3 & RF3_NO_FEAR)
+ if (tr_ptr->flags & RF_NO_FEAR)
{
if (see_t) monster_msg("%^s refuses to be frightened.", t_name);
}
@@ -2004,15 +1806,14 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_BLIND */
- case 128 + 28:
+ case SF_BLIND_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s casts a spell, burning %s%s eyes.", m_name, t_name,
(!strcmp(t_name, "it") ? "s" : "'s"));
- if (tr_ptr->flags3 & RF3_NO_CONF) /* Simulate blindness with confusion */
+ if (tr_ptr->flags & RF_NO_CONF) /* Simulate blindness with confusion */
{
if (see_t) monster_msg("%^s is unaffected.", t_name);
}
@@ -2030,14 +1831,13 @@ static bool_ monst_spell_monst(int m_idx)
}
- /* RF5_CONF */
- case 128 + 29:
+ case SF_CONF_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m) monster_msg("%^s mumbles, and you hear puzzling noises.", m_name);
else monster_msg("%^s creates a mesmerising illusion in front of %s.", m_name, t_name);
- if (tr_ptr->flags3 & RF3_NO_CONF)
+ if (tr_ptr->flags & RF_NO_CONF)
{
if (see_t) monster_msg("%^s disbelieves the feeble spell.", t_name);
}
@@ -2054,14 +1854,13 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_SLOW */
- case 128 + 30:
+ case SF_SLOW_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!blind && see_either) monster_msg("%^s drains power from %s%s muscles.", m_name, t_name,
(!strcmp(t_name, "it") ? "s" : "'s"));
- if (tr_ptr->flags1 & RF1_UNIQUE)
+ if (tr_ptr->flags & RF_UNIQUE)
{
if (see_t) monster_msg("%^s is unaffected.", t_name);
}
@@ -2078,14 +1877,13 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF5_HOLD */
- case 128 + 31:
+ case SF_HOLD_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!blind && see_m) monster_msg("%^s stares intently at %s.", m_name, t_name);
- if ((tr_ptr->flags1 & RF1_UNIQUE) ||
- (tr_ptr->flags3 & RF3_NO_STUN))
+ if ((tr_ptr->flags & RF_UNIQUE) ||
+ (tr_ptr->flags & RF_NO_STUN))
{
if (see_t) monster_msg("%^s is unaffected.", t_name);
}
@@ -2102,11 +1900,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
-
- /* RF6_HASTE */
- case 160 + 0:
+ case SF_HASTE_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind || !see_m)
{
monster_msg("%^s mumbles.", m_name);
@@ -2133,16 +1929,15 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF6_HAND_DOOM */
- case 160 + 1:
+ case SF_HAND_DOOM_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (!see_m) monster_msg("You hear someone invoke the Hand of Doom!");
else if (!blind) monster_msg("%^s invokes the Hand of Doom on %s.", m_name, t_name);
else
monster_msg ("You hear someone invoke the Hand of Doom!");
- if (tr_ptr->flags1 & RF1_UNIQUE)
+ if (tr_ptr->flags & RF_UNIQUE)
{
if (!blind && see_t) monster_msg("^%s is unaffected!", t_name);
}
@@ -2165,10 +1960,9 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF6_HEAL */
- case 160 + 2:
+ case SF_HEAL_IDX:
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
/* Message */
if (blind || !see_m)
@@ -2230,72 +2024,59 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF6_S_ANIMALS */
- case 160 + 3:
+ case SF_BLINK_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons some animals!", m_name);
- for (int k = 0; k < 4; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_ANIMAL);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
- break;
- }
-
- /* RF6_BLINK */
- case 160 + 4:
- {
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (see_m) monster_msg("%^s blinks away.", m_name);
teleport_away(m_idx, 10);
break;
}
- /* RF6_TPORT */
- case 160 + 5:
+ case SF_TPORT_IDX:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */
+ if (dungeon_flags & DF_NO_TELEPORT)
+ {
+ break; /* No teleport on special levels */
+ }
else
{
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (see_m) monster_msg("%^s teleports away.", m_name);
teleport_away(m_idx, MAX_SIGHT * 2 + 5);
break;
}
}
- /* RF6_TELE_TO */
- case 160 + 6:
+ case SF_TELE_TO_IDX:
{
/* Not implemented */
break;
}
- /* RF6_TELE_AWAY */
- case 160 + 7:
+ case SF_TELE_AWAY_IDX:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT) break;
+ if (dungeon_flags & DF_NO_TELEPORT)
+ {
+ break;
+ }
- if (!direct) break;
+ if (!direct)
+ {
+ break;
+ }
else
{
bool_ resists_tele = FALSE;
- if (disturb_other) disturb(1);
+ disturb_on_other();
monster_msg("%^s teleports %s away.", m_name, t_name);
- if (tr_ptr->flags3 & (RF3_RES_TELE))
+ if (tr_ptr->flags & RF_RES_TELE)
{
- if (tr_ptr->flags1 & (RF1_UNIQUE))
+ if (tr_ptr->flags & RF_UNIQUE)
{
if (see_t)
{
- tr_ptr->r_flags3 |= RF3_RES_TELE;
monster_msg("%^s is unaffected!", t_name);
}
resists_tele = TRUE;
@@ -2304,7 +2085,6 @@ static bool_ monst_spell_monst(int m_idx)
{
if (see_t)
{
- tr_ptr->r_flags3 |= RF3_RES_TELE;
monster_msg("%^s resists!", t_name);
}
resists_tele = TRUE;
@@ -2320,388 +2100,212 @@ static bool_ monst_spell_monst(int m_idx)
break;
}
- /* RF6_TELE_LEVEL */
- case 160 + 8:
+ case SF_TELE_LEVEL_IDX:
{
/* Not implemented */
break;
}
- /* RF6_DARKNESS */
- case 160 + 9:
+ case SF_DARKNESS_IDX:
{
if (!direct) break;
- if (disturb_other) disturb(1);
+ disturb_on_other();
if (blind) monster_msg("%^s mumbles.", m_name);
else monster_msg("%^s gestures in shadow.", m_name);
if (seen)
monster_msg("%^s is surrounded by darkness.", t_name);
- (void)project(m_idx, 3, y, x, 0, GF_DARK_WEAK, PROJECT_GRID | PROJECT_KILL);
+ project(m_idx, 3, y, x, 0, GF_DARK_WEAK, PROJECT_GRID | PROJECT_KILL);
/* Lite up the room */
unlite_room(y, x);
break;
}
- /* RF6_TRAPS */
- case 160 + 10:
+ case SF_FORGET_IDX:
{
/* Not implemented */
break;
}
- /* RF6_FORGET */
- case 160 + 11:
- {
- /* Not implemented */
+ case SF_S_ANIMAL_IDX:
+ {
+ do_summon("summons an animal!", 1, SUMMON_ANIMAL, SUMMON_ANIMAL, blind_msg_default);
break;
- }
+ }
+
+ case SF_S_ANIMALS_IDX:
+ {
+ do_summon("summons some animals!", 4, SUMMON_ANIMAL, SUMMON_ANIMAL, blind_msg_default);
+ break;
+ }
- /* RF6_ANIM_DEAD */
- case 160 + 12:
+ case SF_S_BUG_IDX:
{
+ do_summon("codes some software bugs.", 6, SUMMON_BUG, SUMMON_BUG, blind_msg_default);
break;
}
- /* RF6_S_BUG */
- case 160 + 13:
+ case SF_S_RNG_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically codes some software bugs.", m_name);
- for (int k = 0; k < 6; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_BUG, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_BUG);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
+ do_summon("codes some RNGs.", 6, SUMMON_RNG, SUMMON_RNG, blind_msg_default);
break;
}
- /* RF6_S_RNG */
- case 160 + 14:
+ case SF_S_THUNDERLORD_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically codes some RNGs.", m_name);
- for (int k = 0; k < 6; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_RNG, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_RNG);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
+ do_summon("summons a Thunderlord!", 1, SUMMON_THUNDERLORD, SUMMON_THUNDERLORD, blind_msg_default);
break;
}
-
- /* RF6_S_THUNDERLORD */
- case 160 + 15:
+ case SF_S_KIN_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons a Thunderlord!", m_name);
- for (int k = 0; k < 1; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_THUNDERLORD, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_THUNDERLORD);
- }
- if (blind && count) monster_msg("You hear something appear nearby.");
+ // Describe the summons
+ char action[256];
+ sprintf(action,
+ "summons %s %s.",
+ m_poss,
+ (r_ptr->flags & RF_UNIQUE ? "minions" : "kin"));
+ // Force the right type of "kin"
+ summon_kin_type = r_ptr->d_char;
+ // Summon
+ do_summon(action, 6, SUMMON_KIN, SUMMON_KIN, blind_msg_default);
break;
}
- /* RF6_SUMMON_KIN */
- case 160 + 16:
+ case SF_S_HI_DEMON_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons %s %s.",
- m_name, m_poss,
- ((r_ptr->flags1) & RF1_UNIQUE ?
- "minions" : "kin"));
- summon_kin_type = r_ptr->d_char; /* Big hack */
- for (int k = 0; k < 6; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_KIN, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_KIN);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
-
-
+ do_summon("summons greater demons!", 8, SUMMON_HI_DEMON, SUMMON_HI_DEMON, blind_msg_default);
break;
- }
+ }
- /* RF6_S_HI_DEMON */
- case 160 + 17:
+ case SF_S_MONSTER_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons greater demons!", m_name);
- if (blind && count) monster_msg("You hear heavy steps nearby.");
- if (friendly)
- summon_specific_friendly(y, x, rlev, SUMMON_HI_DEMON, TRUE);
- else
- summon_cyber();
+ do_summon("summons help!", 1, SUMMON_NO_UNIQUES, 0, blind_msg_default);
break;
}
- /* RF6_S_MONSTER */
- case 160 + 18:
+ case SF_S_MONSTERS_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons help!", m_name);
- for (int k = 0; k < 1; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_NO_UNIQUES, TRUE);
- else
- count += summon_specific(y, x, rlev, 0);
- }
- if (blind && count) monster_msg("You hear something appear nearby.");
+ do_summon("summons monsters!", 8, SUMMON_NO_UNIQUES, 0, blind_msg_default);
break;
}
- /* RF6_S_MONSTERS */
- case 160 + 19:
+ case SF_S_ANT_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons monsters!", m_name);
- for (int k = 0; k < 8; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_NO_UNIQUES, TRUE);
- else
- count += summon_specific(y, x, rlev, 0);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
+ do_summon("summons ants.", 6, SUMMON_ANT, SUMMON_ANT, blind_msg_default);
break;
}
- /* RF6_S_ANT */
- case 160 + 20:
+ case SF_S_SPIDER_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons ants.", m_name);
- for (int k = 0; k < 6; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_ANT, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_ANT);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
+ do_summon("summons spiders.", 6, SUMMON_SPIDER, SUMMON_SPIDER, blind_msg_default);
break;
}
- /* RF6_S_SPIDER */
- case 160 + 21:
+ case SF_S_HOUND_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons spiders.", m_name);
- for (int k = 0; k < 6; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_SPIDER, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_SPIDER);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
+ do_summon("summons hounds.", 6, SUMMON_HOUND, SUMMON_HOUND, blind_msg_default);
break;
}
- /* RF6_S_HOUND */
- case 160 + 22:
+ case SF_S_HYDRA_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons hounds.", m_name);
- for (int k = 0; k < 6; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_HOUND, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_HOUND);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
+ do_summon("summons hydras.", 6, SUMMON_HYDRA, SUMMON_HYDRA, blind_msg_default);
break;
}
- /* RF6_S_HYDRA */
- case 160 + 23:
+ case SF_S_ANGEL_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons hydras.", m_name);
- for (int k = 0; k < 6; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_HYDRA, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_HYDRA);
- }
- if (blind && count) monster_msg("You hear many things appear nearby.");
+ do_summon("summons an angel!", 1, SUMMON_ANGEL, SUMMON_ANGEL, blind_msg_default);
break;
}
- /* RF6_S_ANGEL */
- case 160 + 24:
+ case SF_S_DEMON_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons an angel!", m_name);
- for (int k = 0; k < 1; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_ANGEL, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_ANGEL);
- }
- if (blind && count) monster_msg("You hear something appear nearby.");
+ do_summon("summons a demon!", 1, SUMMON_DEMON, SUMMON_DEMON, blind_msg_default);
break;
}
- /* RF6_S_DEMON */
- case 160 + 25:
+ case SF_S_UNDEAD_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons a demon!", m_name);
- for (int k = 0; k < 1; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_DEMON, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_DEMON);
- }
- if (blind && count) monster_msg("You hear something appear nearby.");
+ do_summon("summons an undead adversary!", 1, SUMMON_UNDEAD, SUMMON_UNDEAD, blind_msg_default);
break;
}
- /* RF6_S_UNDEAD */
- case 160 + 26:
+ case SF_S_DRAGON_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons an undead adversary!", m_name);
- for (int k = 0; k < 1; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_UNDEAD, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_UNDEAD);
- }
- if (blind && count) monster_msg("You hear something appear nearby.");
+ do_summon("summons a dragon!", 1, SUMMON_DRAGON, SUMMON_DRAGON, blind_msg_default);
break;
}
- /* RF6_S_DRAGON */
- case 160 + 27:
+ case SF_S_HI_UNDEAD_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons a dragon!", m_name);
- for (int k = 0; k < 1; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_DRAGON, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_DRAGON);
- }
- if (blind && count) monster_msg("You hear something appear nearby.");
+ summon_messages blind_msg {
+ "You hear a creepy thing appear nearby.",
+ "You hear many creepy things appear nearby."
+ };
+ do_summon("summons greater undead!", 8, SUMMON_HI_UNDEAD_NO_UNIQUES, SUMMON_HI_UNDEAD, blind_msg);
break;
}
- /* RF6_S_HI_UNDEAD */
- case 160 + 28:
+ case SF_S_HI_DRAGON_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons greater undead!", m_name);
- for (int k = 0; k < 8; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_HI_UNDEAD_NO_UNIQUES, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD);
- }
- if (blind && count)
- {
- monster_msg("You hear many creepy things appear nearby.");
- }
+ summon_messages blind_msg {
+ "You hear many a powerful thing appear nearby.",
+ "You hear many powerful things appear nearby."
+ };
+ do_summon("summons ancient dragons!", 8, SUMMON_HI_DRAGON_NO_UNIQUES, SUMMON_HI_DRAGON, blind_msg);
break;
}
- /* RF6_S_HI_DRAGON */
- case 160 + 29:
+ case SF_S_WRAITH_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons ancient dragons!", m_name);
- for (int k = 0; k < 8; k++)
- {
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_HI_DRAGON_NO_UNIQUES, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_HI_DRAGON);
- }
- if (blind && count)
- {
- monster_msg("You hear many powerful things appear nearby.");
- }
+ // No summoning Nazgul; see the remapping code above the switch.
+ assert(!friendly);
+ // Summon
+ summon_messages blind_msg {
+ "You hear an immortal being appear nearby.",
+ "You hear immortal beings appear nearby."
+ };
+ do_summon("summons a wraith!", 8, 0 /* not used */, SUMMON_WRAITH, blind_msg);
break;
}
- /* RF6_S_WRAITH */
- case 160 + 30:
+ case SF_S_UNIQUE_IDX:
{
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons a wraith!", m_name);
-
-
- for (int k = 0; k < 8; k++)
+ // No summoning uniques; see the remapping code above the switch.
+ assert(!friendly);
+ // Interrupt
+ disturb_on_other();
+ // Message
+ if (blind || !see_m)
{
- count += summon_specific(y, x, rlev, SUMMON_WRAITH);
+ monster_msg("%^s mumbles.", m_name);
}
-
- if (blind && count)
+ else
{
- monster_msg("You hear immortal beings appear nearby.");
+ monster_msg("%^s magically summons special opponents!", m_name);
}
- break;
- }
-
- /* RF6_S_UNIQUE */
- case 160 + 31:
- {
- if (disturb_other) disturb(1);
- if (blind || !see_m) monster_msg("%^s mumbles.", m_name);
- else monster_msg("%^s magically summons special opponents!", m_name);
+ // Summon
+ int count = 0;
for (int k = 0; k < 8; k++)
{
- if (!friendly)
- count += summon_specific(y, x, rlev, SUMMON_UNIQUE);
+ count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_UNIQUE);
}
for (int k = 0; k < 8; k++)
{
- if (friendly)
- count += summon_specific_friendly(y, x, rlev, SUMMON_HI_UNDEAD_NO_UNIQUES, TRUE);
- else
- count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD);
+ count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HI_UNDEAD);
}
- if (blind && count)
+ // Message
+ if (blind)
{
- monster_msg("You hear many powerful things appear nearby.");
+ if (count == 1)
+ {
+ monster_msg("You hear a powerful thing appear nearby.");
+ }
+ else if (count > 1)
+ {
+ monster_msg("You hear many powerful things appear nearby.");
+ }
}
break;
}
@@ -2712,39 +2316,6 @@ static bool_ monst_spell_monst(int m_idx)
t_ptr->csleep = 0;
}
-
- /* Remember what the monster did, if we saw it */
- if (seen)
- {
- /* Inate spell */
- if (thrown_spell < 32*4)
- {
- r_ptr->r_flags4 |= (1L << (thrown_spell - 32 * 3));
- if (r_ptr->r_cast_inate < MAX_UCHAR) r_ptr->r_cast_inate++;
- }
-
- /* Bolt or Ball */
- else if (thrown_spell < 32*5)
- {
- r_ptr->r_flags5 |= (1L << (thrown_spell - 32 * 4));
- if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++;
- }
-
- /* Special spell */
- else if (thrown_spell < 32*6)
- {
- r_ptr->r_flags6 |= (1L << (thrown_spell - 32 * 5));
- if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++;
- }
- }
-
- /* Always take note of monsters that kill you ---
- * even accidentally */
- if (death && (r_ptr->r_deaths < MAX_SHORT))
- {
- r_ptr->r_deaths++;
- }
-
/* A spell was cast */
return (TRUE);
}
@@ -2757,7 +2328,6 @@ static bool_ monst_spell_monst(int m_idx)
void curse_equipment(int chance, int heavy_chance)
{
bool_ changed = FALSE;
- u32b o1, o2, o3, o4, esp, o5;
object_type * o_ptr =
&p_ptr->inventory[rand_range(INVEN_WIELD, INVEN_TOTAL - 1)];
@@ -2765,11 +2335,11 @@ void curse_equipment(int chance, int heavy_chance)
if (!(o_ptr->k_idx)) return;
- object_flags(o_ptr, &o1, &o2, &o3, &o4, &o5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Extra, biased saving throw for blessed items */
- if ((o3 & (TR3_BLESSED)) && (randint(888) > chance))
+ if ((flags & TR_BLESSED) && (randint(888) > chance))
{
char o_name[256];
object_desc(o_name, o_ptr, FALSE, 0);
@@ -2780,31 +2350,28 @@ void curse_equipment(int chance, int heavy_chance)
}
if ((randint(100) <= heavy_chance) &&
- (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name))
+ (o_ptr->name1 || o_ptr->name2 || (!o_ptr->artifact_name.empty())))
{
- if (!(o3 & TR3_HEAVY_CURSE))
+ if (!(flags & TR_HEAVY_CURSE))
changed = TRUE;
- o_ptr->art_flags3 |= TR3_HEAVY_CURSE;
- o_ptr->art_flags3 |= TR3_CURSED;
+ o_ptr->art_flags |= TR_HEAVY_CURSE;
+ o_ptr->art_flags |= TR_CURSED;
o_ptr->ident |= IDENT_CURSED;
}
else
{
- if (!(o_ptr->ident & (IDENT_CURSED)))
+ if (!(o_ptr->ident & IDENT_CURSED))
changed = TRUE;
- o_ptr->art_flags3 |= TR3_CURSED;
+ o_ptr->art_flags |= TR_CURSED;
o_ptr->ident |= IDENT_CURSED;
}
if (changed)
{
msg_print("There is a malignant black aura surrounding you...");
- if (o_ptr->note)
+ if (o_ptr->inscription == "uncursed")
{
- if (streq(quark_str(o_ptr->note), "uncursed"))
- {
- o_ptr->note = 0;
- }
+ o_ptr->inscription.clear();
}
}
}
@@ -2813,7 +2380,7 @@ void curse_equipment(int chance, int heavy_chance)
void curse_equipment_dg(int chance, int heavy_chance)
{
bool_ changed = FALSE;
- u32b o1, o2, o3, o4, esp, o5;
+
object_type * o_ptr =
&p_ptr->inventory[rand_range(INVEN_WIELD, INVEN_TOTAL - 1)];
@@ -2821,49 +2388,44 @@ void curse_equipment_dg(int chance, int heavy_chance)
if (!(o_ptr->k_idx)) return;
- object_flags(o_ptr, &o1, &o2, &o3, &o4, &o5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Extra, biased saving throw for blessed items */
- if ((o3 & (TR3_BLESSED)) && (randint(888) > chance))
+ if ((flags & TR_BLESSED) && (randint(888) > chance))
{
char o_name[256];
object_desc(o_name, o_ptr, FALSE, 0);
msg_format("Your %s resist%s cursing!", o_name,
((o_ptr->number > 1) ? "" : "s"));
- /* Hmmm -- can we wear multiple items? If not, this is unnecessary */
- /* DG -- Yes we can, in the quiver */
return;
}
if ((randint(100) <= heavy_chance) &&
- (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name))
+ (o_ptr->name1 || o_ptr->name2 || (!o_ptr->artifact_name.empty())))
{
- if (!(o3 & TR3_HEAVY_CURSE))
+ if (!(flags & TR_HEAVY_CURSE))
changed = TRUE;
- o_ptr->art_flags3 |= TR3_HEAVY_CURSE;
- o_ptr->art_flags3 |= TR3_CURSED;
- o_ptr->art_flags4 |= TR4_DG_CURSE;
+ o_ptr->art_flags |= TR_HEAVY_CURSE;
+ o_ptr->art_flags |= TR_CURSED;
+ o_ptr->art_flags |= TR_DG_CURSE;
o_ptr->ident |= IDENT_CURSED;
}
else
{
- if (!(o_ptr->ident & (IDENT_CURSED)))
+ if (!(o_ptr->ident & IDENT_CURSED))
changed = TRUE;
- o_ptr->art_flags3 |= TR3_CURSED;
- o_ptr->art_flags4 |= TR4_DG_CURSE;
+ o_ptr->art_flags |= TR_CURSED;
+ o_ptr->art_flags |= TR_DG_CURSE;
o_ptr->ident |= IDENT_CURSED;
}
if (changed)
{
msg_print("There is a malignant black aura surrounding you...");
- if (o_ptr->note)
+ if (o_ptr->inscription == "uncursed")
{
- if (streq(quark_str(o_ptr->note), "uncursed"))
- {
- o_ptr->note = 0;
- }
+ o_ptr->inscription.clear();
}
}
}
@@ -2911,15 +2473,14 @@ void curse_equipment_dg(int chance, int heavy_chance)
*/
static bool_ make_attack_spell(int m_idx)
{
- int k, chance, thrown_spell, rlev, failrate;
- byte spell[96], num = 0;
- u32b f4, f5, f6;
+ static const auto SF_BOLT_MASK = compute_bolt_mask();
+ static const auto SF_SUMMON_MASK = compute_summoning_mask();
+ static const auto SF_INT_MASK = compute_smart_mask();
+ static const auto SF_INNATE_MASK = compute_innate_mask();
+
+ int chance, rlev, failrate;
char m_name[80];
bool_ no_inate = FALSE;
- int x, y;
-
- /* Summon count */
- int count = 0;
/* Extract the blind-ness */
bool_ blind = (p_ptr->blind ? TRUE : FALSE);
@@ -2930,23 +2491,13 @@ static bool_ make_attack_spell(int m_idx)
/* Extract the "see-able-ness" */
bool_ seen = (!blind && m_ptr->ml);
- /* Assume "normal" target */
- bool_ normal = TRUE;
-
/* Target location */
- if (m_ptr->target > -1)
+ if (m_ptr->target != 0)
{
- if (!m_ptr->target)
- {
- y = p_ptr->py;
- x = p_ptr->px;
- }
- else
- {
- return (FALSE);
- }
+ return FALSE;
}
- else return FALSE;
+ int y = p_ptr->py;
+ int x = p_ptr->px;
/* Cannot cast spells when confused */
if (m_ptr->confused) return (FALSE);
@@ -2957,7 +2508,7 @@ static bool_ make_attack_spell(int m_idx)
/* Cannot attack the player if mortal and player fated to never die by the ... */
auto const r_ptr = m_ptr->race();
- if ((r_ptr->flags7 & RF7_MORTAL) && (p_ptr->no_mortal)) return (FALSE);
+ if ((r_ptr->flags & RF_MORTAL) && (p_ptr->no_mortal)) return (FALSE);
/* Hack -- Extract the spell probability */
chance = (r_ptr->freq_inate + r_ptr->freq_spell) / 2;
@@ -2971,8 +2522,7 @@ static bool_ make_attack_spell(int m_idx)
/* Sometimes forbid inate attacks (breaths) */
if (rand_int(100) >= (chance * 2)) no_inate = TRUE;
- /* Hack -- require projectable player */
- if (normal)
+ /* Require projectable player */
{
/* Check range */
if (m_ptr->cdis > MAX_RANGE) return (FALSE);
@@ -2985,80 +2535,58 @@ static bool_ make_attack_spell(int m_idx)
rlev = ((m_ptr->level >= 1) ? m_ptr->level : 1);
/* Extract the racial spell flags */
- f4 = r_ptr->flags4;
- f5 = r_ptr->flags5;
- f6 = r_ptr->flags6;
+ monster_spell_flag_set allowed_spells = r_ptr->spells;
/* Forbid inate attacks sometimes */
- if (no_inate) f4 = 0L;
+ if (no_inate)
+ {
+ allowed_spells &= ~SF_INNATE_MASK;
+ }
/* Hack -- allow "desperate" spells */
- if ((r_ptr->flags2 & (RF2_SMART)) &&
+ if ((r_ptr->flags & RF_SMART) &&
(m_ptr->hp < m_ptr->maxhp / 10) &&
(rand_int(100) < 50))
{
/* Require intelligent spells */
- f4 &= (RF4_INT_MASK);
- f5 &= (RF5_INT_MASK);
- f6 &= (RF6_INT_MASK);
+ allowed_spells &= SF_INT_MASK;
- /* No spells left */
- if (!f4 && !f5 && !f6) return (FALSE);
+ /* No spells left? */
+ if (!allowed_spells) return (FALSE);
}
/* Remove the "ineffective" spells */
- remove_bad_spells(m_idx, &f4, &f5, &f6);
+ remove_bad_spells(m_idx, &allowed_spells);
/* No spells left */
- if (!f4 && !f5 && !f6) return (FALSE);
+ if (!allowed_spells) return (FALSE);
/* Check for a clean bolt shot */
- if ((f4&(RF4_BOLT_MASK) || f5 & (RF5_BOLT_MASK) ||
- f6&(RF6_BOLT_MASK)) &&
- !(r_ptr->flags2 & (RF2_STUPID)) &&
+ if ((allowed_spells & SF_BOLT_MASK) &&
+ !(r_ptr->flags & RF_STUPID) &&
!clean_shot(m_ptr->fy, m_ptr->fx, y, x))
{
/* Remove spells that will only hurt friends */
- f4 &= ~(RF4_BOLT_MASK);
- f5 &= ~(RF5_BOLT_MASK);
- f6 &= ~(RF6_BOLT_MASK);
+ allowed_spells &= ~SF_BOLT_MASK;
}
/* Check for a possible summon */
- if ((f4 & (RF4_SUMMON_MASK) || f5 & (RF5_SUMMON_MASK) ||
- f6 & (RF6_SUMMON_MASK)) &&
- !(r_ptr->flags2 & (RF2_STUPID)) &&
+ if ((allowed_spells & SF_SUMMON_MASK) &&
+ !(r_ptr->flags & RF_STUPID) &&
!(summon_possible(y, x)))
{
/* Remove summoning spells */
- f4 &= ~(RF4_SUMMON_MASK);
- f5 &= ~(RF5_SUMMON_MASK);
- f6 &= ~(RF6_SUMMON_MASK);
+ allowed_spells &= ~SF_SUMMON_MASK;
}
/* No spells left */
- if (!f4 && !f5 && !f6) return (FALSE);
+ if (!allowed_spells) return (FALSE);
/* Extract the "inate" spells */
- for (k = 0; k < 32; k++)
- {
- if (f4 & (1L << k)) spell[num++] = k + 32 * 3;
- }
-
- /* Extract the "normal" spells */
- for (k = 0; k < 32; k++)
- {
- if (f5 & (1L << k)) spell[num++] = k + 32 * 4;
- }
-
- /* Extract the "bizarre" spells */
- for (k = 0; k < 32; k++)
- {
- if (f6 & (1L << k)) spell[num++] = k + 32 * 5;
- }
+ auto spell = extract_spells(allowed_spells);
/* No spells left */
- if (!num) return (FALSE);
+ if (spell.empty()) return (FALSE);
/* Stop if player is dead or gone */
if (!alive || death) return (FALSE);
@@ -3070,7 +2598,7 @@ static bool_ make_attack_spell(int m_idx)
monster_desc(m_name, m_ptr, 0x00);
/* Choose a spell to cast */
- thrown_spell = choose_attack_spell(m_idx, spell, num);
+ auto thrown_spell = choose_attack_spell(m_idx, spell);
/* Abort if no spell was chosen */
if (!thrown_spell) return (FALSE);
@@ -3079,10 +2607,10 @@ static bool_ make_attack_spell(int m_idx)
failrate = 25 - (rlev + 3) / 4;
/* Hack -- Stupid monsters will never fail (for jellies and such) */
- if (r_ptr->flags2 & (RF2_STUPID)) failrate = 0;
+ if (r_ptr->flags & RF_STUPID) failrate = 0;
/* Check for spell failure (inate attacks never fail) */
- if ((thrown_spell >= 128) && (rand_int(100) < failrate))
+ if ((!thrown_spell->is_innate) && (rand_int(100) < failrate))
{
/* Message */
msg_format("%^s tries to cast a spell, but fails.", m_name);
@@ -3091,7 +2619,7 @@ static bool_ make_attack_spell(int m_idx)
}
/* Can the player disrupt its puny attempts? */
- if ((p_ptr->antimagic_dis >= m_ptr->cdis) && (magik(p_ptr->antimagic)) && (thrown_spell >= 128))
+ if ((p_ptr->antimagic_dis >= m_ptr->cdis) && magik(p_ptr->antimagic) && thrown_spell->is_magic)
{
char m_poss[80];
@@ -3111,42 +2639,89 @@ static bool_ make_attack_spell(int m_idx)
/* Hack -- Get the "died from" name */
monster_desc(ddesc, m_ptr, 0x88);
+ /* Do a breath */
+ auto do_breath = [&](char const *element, int gf, s32b max, int divisor, int smart_learn) -> void {
+ // Interrupt
+ disturb();
+ // Message
+ if (blind)
+ {
+ msg_format("%^s breathes.", m_name);
+ }
+ else
+ {
+ msg_format("%^s breathes %s.", m_name, element);
+ }
+ // Breathe
+ breath(m_idx, gf, std::min(m_ptr->hp / divisor, max), 0);
+ // Update "smart" monster knowledge
+ update_smart_learn(m_idx, smart_learn);
+ };
+
+ /* Messages for summoning */
+ struct summon_messages {
+ char const *singular;
+ char const *plural;
+ };
+
+ /* Default message for summoning when player is blinded */
+ summon_messages blind_msg_default {
+ "You hear something appear nearby.",
+ "You hear many things appear nearby."
+ };
+
+ /* Do a summoning spell */
+ auto do_summon = [&](char const *action, int n, int type, summon_messages const &blind_msg) -> void {
+ // Interrupt
+ disturb();
+ // Message
+ if (blind)
+ {
+ msg_format("%^s mumbles.", m_name);
+ }
+ else
+ {
+ msg_format("%^s magically %s", m_name, action);
+ }
+ // Do the actual summoning
+ int count = 0;
+ for (int k = 0; k < n; k++)
+ {
+ count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, type);
+ }
+ // Message for blinded characters
+ if (blind)
+ {
+ if (count == 1)
+ {
+ msg_print(blind_msg.singular);
+ }
+ else if (count > 1)
+ {
+ msg_print(blind_msg.plural);
+ }
+ }
+ };
+
/* Cast the spell. */
- switch (thrown_spell)
+ switch (thrown_spell->spell_idx)
{
- /* RF4_SHRIEK */
- case 96 + 0:
+ case SF_SHRIEK_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s makes a high pitched shriek.", m_name);
aggravate_monsters(m_idx);
break;
}
- /* RF4_MULTIPLY */
- case 96 + 1:
+ case SF_MULTIPLY_IDX:
{
break;
}
- /* RF4_S_ANIMAL */
- case 96 + 2:
+ case SF_ROCKET_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons an animal!", m_name);
- for (k = 0; k < 1; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_ANIMAL);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
- break;
- }
-
- /* RF4_ROCKET */
- case 96 + 3:
- {
- disturb(1);
+ disturb();
if (blind) msg_format("%^s shoots something.", m_name);
else msg_format("%^s fires a rocket.", m_name);
breath(m_idx, GF_ROCKET,
@@ -3155,10 +2730,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF4_ARROW_1 */
- case 96 + 4:
+ case SF_ARROW_1_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s makes a strange noise.", m_name);
else msg_format("%^s fires an arrow.", m_name);
bolt(m_idx, GF_ARROW, damroll(1, 6));
@@ -3166,10 +2740,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF4_ARROW_2 */
- case 96 + 5:
+ case SF_ARROW_2_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s makes a strange noise.", m_name);
else msg_format("%^s fires an arrow!", m_name);
bolt(m_idx, GF_ARROW, damroll(3, 6));
@@ -3177,10 +2750,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF4_ARROW_3 */
- case 96 + 6:
+ case SF_ARROW_3_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s makes a strange noise.", m_name);
else msg_format("%^s fires a missile.", m_name);
bolt(m_idx, GF_ARROW, damroll(5, 6));
@@ -3188,10 +2760,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF4_ARROW_4 */
- case 96 + 7:
+ case SF_ARROW_4_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s makes a strange noise.", m_name);
else msg_format("%^s fires a missile!", m_name);
bolt(m_idx, GF_ARROW, damroll(7, 6));
@@ -3199,245 +2770,129 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF4_BR_ACID */
- case 96 + 8:
+ case SF_BR_ACID_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes acid.", m_name);
- breath(m_idx, GF_ACID,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
- update_smart_learn(m_idx, DRS_ACID);
+ do_breath("acid", GF_ACID, 1600, 3, DRS_ACID);
break;
}
- /* RF4_BR_ELEC */
- case 96 + 9:
+ case SF_BR_ELEC_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes lightning.", m_name);
- breath(m_idx, GF_ELEC,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
- update_smart_learn(m_idx, DRS_ELEC);
+ do_breath("lightning", GF_ELEC, 1600, 3, DRS_ELEC);
break;
}
- /* RF4_BR_FIRE */
- case 96 + 10:
+ case SF_BR_FIRE_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes fire.", m_name);
- breath(m_idx, GF_FIRE,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
- update_smart_learn(m_idx, DRS_FIRE);
+ do_breath("fire", GF_FIRE, 1600, 3, DRS_FIRE);
break;
}
- /* RF4_BR_COLD */
- case 96 + 11:
+ case SF_BR_COLD_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes frost.", m_name);
- breath(m_idx, GF_COLD,
- ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0);
- update_smart_learn(m_idx, DRS_COLD);
+ do_breath("frost", GF_COLD, 1600, 3, DRS_COLD);
break;
}
- /* RF4_BR_POIS */
- case 96 + 12:
+ case SF_BR_POIS_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes gas.", m_name);
- breath(m_idx, GF_POIS,
- ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0);
- update_smart_learn(m_idx, DRS_POIS);
+ do_breath("gas", GF_POIS, 800, 3, DRS_POIS);
break;
}
-
- /* RF4_BR_NETH */
- case 96 + 13:
+ case SF_BR_NETH_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes nether.", m_name);
- breath(m_idx, GF_NETHER,
- ((m_ptr->hp / 6) > 550 ? 550 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_NETH);
+ do_breath("nether", GF_NETHER, 550, 6, DRS_NETH);
break;
}
- /* RF4_BR_LITE */
- case 96 + 14:
+ case SF_BR_LITE_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes light.", m_name);
- breath(m_idx, GF_LITE,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_LITE);
+ do_breath("light", GF_LITE, 400, 6, DRS_LITE);
break;
}
- /* RF4_BR_DARK */
- case 96 + 15:
+ case SF_BR_DARK_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes darkness.", m_name);
- breath(m_idx, GF_DARK,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_DARK);
+ do_breath("darkness", GF_DARK, 400, 6, DRS_DARK);
break;
}
- /* RF4_BR_CONF */
- case 96 + 16:
+ case SF_BR_CONF_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes confusion.", m_name);
- breath(m_idx, GF_CONFUSION,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_CONF);
+ do_breath("confusion", GF_CONFUSION, 400, 6, DRS_CONF);
break;
}
- /* RF4_BR_SOUN */
- case 96 + 17:
+ case SF_BR_SOUN_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes sound.", m_name);
- breath(m_idx, GF_SOUND,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_SOUND);
+ do_breath("sound", GF_SOUND, 400, 6, DRS_SOUND);
break;
}
- /* RF4_BR_CHAO */
- case 96 + 18:
+ case SF_BR_CHAO_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes chaos.", m_name);
- breath(m_idx, GF_CHAOS,
- ((m_ptr->hp / 6) > 600 ? 600 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_CHAOS);
+ do_breath("chaos", GF_CHAOS, 600, 6, DRS_CHAOS);
break;
}
- /* RF4_BR_DISE */
- case 96 + 19:
+ case SF_BR_DISE_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes disenchantment.", m_name);
- breath(m_idx, GF_DISENCHANT,
- ((m_ptr->hp / 6) > 500 ? 500 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_DISEN);
+ do_breath("disenchantment", GF_DISENCHANT, 500, 6, DRS_DISEN);
break;
}
- /* RF4_BR_NEXU */
- case 96 + 20:
+ case SF_BR_NEXU_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes nexus.", m_name);
- breath(m_idx, GF_NEXUS,
- ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0);
- update_smart_learn(m_idx, DRS_NEXUS);
+ do_breath("nexus", GF_NEXUS, 250, 3, DRS_NEXUS);
break;
}
- /* RF4_BR_TIME */
- case 96 + 21:
+ case SF_BR_TIME_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes time.", m_name);
- breath(m_idx, GF_TIME,
- ((m_ptr->hp / 3) > 150 ? 150 : (m_ptr->hp / 3)), 0);
+ do_breath("time", GF_TIME, 150, 3, DRS_NONE);
break;
}
- /* RF4_BR_INER */
- case 96 + 22:
+ case SF_BR_INER_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes inertia.", m_name);
- breath(m_idx, GF_INERTIA,
- ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0);
+ do_breath("inertia", GF_INERTIA, 200, 6, DRS_NONE);
break;
}
- /* RF4_BR_GRAV */
- case 96 + 23:
+ case SF_BR_GRAV_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes gravity.", m_name);
- breath(m_idx, GF_GRAVITY,
- ((m_ptr->hp / 3) > 200 ? 200 : (m_ptr->hp / 3)), 0);
+ do_breath("gravity", GF_GRAVITY, 200, 3, DRS_NONE);
break;
}
- /* RF4_BR_SHAR */
- case 96 + 24:
+ case SF_BR_SHAR_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes shards.", m_name);
- breath(m_idx, GF_SHARDS,
- ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0);
- update_smart_learn(m_idx, DRS_SHARD);
+ do_breath("shards", GF_SHARDS, 400, 6, DRS_SHARD);
break;
}
- /* RF4_BR_PLAS */
- case 96 + 25:
+ case SF_BR_PLAS_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes plasma.", m_name);
- breath(m_idx, GF_PLASMA,
- ((m_ptr->hp / 6) > 150 ? 150 : (m_ptr->hp / 6)), 0);
+ do_breath("plasma", GF_PLASMA, 150, 6, DRS_NONE);
break;
}
- /* RF4_BR_WALL */
- case 96 + 26:
+ case SF_BR_WALL_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes force.", m_name);
- breath(m_idx, GF_FORCE,
- ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0);
+ do_breath("force", GF_FORCE, 200, 6, DRS_NONE);
break;
}
- /* RF4_BR_MANA */
- case 96 + 27:
+ case SF_BR_MANA_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes magical energy.", m_name);
- breath(m_idx, GF_MANA,
- ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0);
+ do_breath("magical energy", GF_MANA, 250, 3, DRS_NONE);
break;
}
- /* RF4_BA_NUKE */
- case 96 + 28:
+ case SF_BA_NUKE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a ball of radiation.", m_name);
breath(m_idx, GF_NUKE, (rlev + damroll(10, 6)), 2);
@@ -3445,22 +2900,15 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF4_BR_NUKE */
- case 96 + 29:
+ case SF_BR_NUKE_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes toxic waste.", m_name);
- breath(m_idx, GF_NUKE,
- ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0);
- update_smart_learn(m_idx, DRS_POIS);
+ do_breath("toxic waste", GF_NUKE, 800, 3, DRS_POIS);
break;
}
- /* RF4_BA_CHAO */
- case 96 + 30:
+ case SF_BA_CHAO_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles frighteningly.", m_name);
else msg_format("%^s invokes a raw chaos.", m_name);
breath(m_idx, GF_CHAOS, (rlev * 2) + damroll(10, 10), 4);
@@ -3468,23 +2916,15 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF4_BR_DISI -> Disintegration breath! */
- case 96 + 31:
+ case SF_BR_DISI_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s breathes.", m_name);
- else msg_format("%^s breathes disintegration.", m_name);
- breath(m_idx, GF_DISINTEGRATE,
- ((m_ptr->hp / 3) > 300 ? 300 : (m_ptr->hp / 3)), 0);
+ do_breath("disintegration", GF_DISINTEGRATE, 300, 3, DRS_NONE);
break;
}
-
-
- /* RF5_BA_ACID */
- case 128 + 0:
+ case SF_BA_ACID_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts an acid ball.", m_name);
breath(m_idx, GF_ACID,
@@ -3493,10 +2933,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_ELEC */
- case 128 + 1:
+ case SF_BA_ELEC_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a lightning ball.", m_name);
breath(m_idx, GF_ELEC,
@@ -3505,10 +2944,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_FIRE */
- case 128 + 2:
+ case SF_BA_FIRE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a fire ball.", m_name);
breath(m_idx, GF_FIRE,
@@ -3517,10 +2955,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_COLD */
- case 128 + 3:
+ case SF_BA_COLD_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a frost ball.", m_name);
breath(m_idx, GF_COLD,
@@ -3529,10 +2966,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_POIS */
- case 128 + 4:
+ case SF_BA_POIS_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a stinking cloud.", m_name);
breath(m_idx, GF_POIS,
@@ -3541,10 +2977,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_NETH */
- case 128 + 5:
+ case SF_BA_NETH_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a nether ball.", m_name);
breath(m_idx, GF_NETHER,
@@ -3553,10 +2988,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_WATE */
- case 128 + 6:
+ case SF_BA_WATE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s gestures fluidly.", m_name);
msg_print("You are engulfed in a whirlpool.");
@@ -3565,10 +2999,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_MANA */
- case 128 + 7:
+ case SF_BA_MANA_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles powerfully.", m_name);
else msg_format("%^s invokes a mana storm.", m_name);
breath(m_idx, GF_MANA,
@@ -3576,10 +3009,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BA_DARK */
- case 128 + 8:
+ case SF_BA_DARK_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles powerfully.", m_name);
else msg_format("%^s invokes a darkness storm.", m_name);
breath(m_idx, GF_DARK,
@@ -3588,15 +3020,14 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_DRAIN_MANA */
- case 128 + 9:
+ case SF_DRAIN_MANA_IDX:
{
if (p_ptr->csp)
{
int r1;
/* Disturb if legal */
- disturb(1);
+ disturb();
/* Basic message */
msg_format("%^s draws psychic energy from you!", m_name);
@@ -3645,10 +3076,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_MIND_BLAST */
- case 128 + 10:
+ case SF_MIND_BLAST_IDX:
{
- disturb(1);
+ disturb();
if (!seen)
{
msg_print("You feel something focusing on your mind.");
@@ -3668,12 +3098,12 @@ static bool_ make_attack_spell(int m_idx)
if (!p_ptr->resist_conf)
{
- (void)set_confused(p_ptr->confused + rand_int(4) + 4);
+ set_confused(p_ptr->confused + rand_int(4) + 4);
}
if ((!p_ptr->resist_chaos) && (randint(3) == 1))
{
- (void) set_image(p_ptr->image + rand_int(250) + 150);
+ set_image(p_ptr->image + rand_int(250) + 150);
}
take_sanity_hit(damroll(8, 8), ddesc);
@@ -3681,10 +3111,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BRAIN_SMASH */
- case 128 + 11:
+ case SF_BRAIN_SMASH_IDX:
{
- disturb(1);
+ disturb();
if (!seen)
{
msg_print("You feel something focusing on your mind.");
@@ -3704,35 +3133,34 @@ static bool_ make_attack_spell(int m_idx)
take_sanity_hit(damroll(12, 15), ddesc);
if (!p_ptr->resist_blind)
{
- (void)set_blind(p_ptr->blind + 8 + rand_int(8));
+ set_blind(p_ptr->blind + 8 + rand_int(8));
}
if (!p_ptr->resist_conf)
{
- (void)set_confused(p_ptr->confused + rand_int(4) + 4);
+ set_confused(p_ptr->confused + rand_int(4) + 4);
}
if (!p_ptr->free_act)
{
- (void)set_paralyzed(rand_int(4) + 4);
+ set_paralyzed(rand_int(4) + 4);
}
- (void)set_slow(p_ptr->slow + rand_int(4) + 4);
+ set_slow(p_ptr->slow + rand_int(4) + 4);
while (rand_int(100) > p_ptr->skill_sav)
- (void)do_dec_stat(A_INT, STAT_DEC_NORMAL);
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
while (rand_int(100) > p_ptr->skill_sav)
- (void)do_dec_stat(A_WIS, STAT_DEC_NORMAL);
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
if (!p_ptr->resist_chaos)
{
- (void) set_image(p_ptr->image + rand_int(250) + 150);
+ set_image(p_ptr->image + rand_int(250) + 150);
}
}
break;
}
- /* RF5_CAUSE_1 */
- case 128 + 12:
+ case SF_CAUSE_1_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s points at you and curses.", m_name);
if (rand_int(100) < p_ptr->skill_sav)
@@ -3747,10 +3175,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_CAUSE_2 */
- case 128 + 13:
+ case SF_CAUSE_2_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s points at you and curses horribly.", m_name);
if (rand_int(100) < p_ptr->skill_sav)
@@ -3765,10 +3192,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_CAUSE_3 */
- case 128 + 14:
+ case SF_CAUSE_3_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles loudly.", m_name);
else msg_format("%^s points at you, incanting terribly!", m_name);
if (rand_int(100) < p_ptr->skill_sav)
@@ -3783,10 +3209,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_CAUSE_4 */
- case 128 + 15:
+ case SF_CAUSE_4_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s screams the word 'DIE!'", m_name);
else msg_format("%^s points at you, screaming the word DIE!", m_name);
if (rand_int(100) < p_ptr->skill_sav)
@@ -3796,15 +3221,14 @@ static bool_ make_attack_spell(int m_idx)
else
{
take_hit(damroll(15, 15), ddesc);
- (void)set_cut(p_ptr->cut + damroll(10, 10));
+ set_cut(p_ptr->cut + damroll(10, 10));
}
break;
}
- /* RF5_BO_ACID */
- case 128 + 16:
+ case SF_BO_ACID_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a acid bolt.", m_name);
bolt(m_idx, GF_ACID, damroll(7, 8) + (rlev / 3));
@@ -3813,10 +3237,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_ELEC */
- case 128 + 17:
+ case SF_BO_ELEC_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a lightning bolt.", m_name);
bolt(m_idx, GF_ELEC, damroll(4, 8) + (rlev / 3));
@@ -3825,10 +3248,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_FIRE */
- case 128 + 18:
+ case SF_BO_FIRE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a fire bolt.", m_name);
bolt(m_idx, GF_FIRE, damroll(9, 8) + (rlev / 3));
@@ -3837,10 +3259,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_COLD */
- case 128 + 19:
+ case SF_BO_COLD_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a frost bolt.", m_name);
bolt(m_idx, GF_COLD, damroll(6, 8) + (rlev / 3));
@@ -3849,17 +3270,15 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_POIS */
- case 128 + 20:
+ case SF_BO_POIS_IDX:
{
/* XXX XXX XXX */
break;
}
- /* RF5_BO_NETH */
- case 128 + 21:
+ case SF_BO_NETH_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a nether bolt.", m_name);
bolt(m_idx, GF_NETHER, 30 + damroll(5, 5) + (rlev * 3) / 2);
@@ -3868,10 +3287,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_WATE */
- case 128 + 22:
+ case SF_BO_WATE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a water bolt.", m_name);
bolt(m_idx, GF_WATER, damroll(10, 10) + (rlev));
@@ -3879,10 +3297,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_MANA */
- case 128 + 23:
+ case SF_BO_MANA_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a mana bolt.", m_name);
bolt(m_idx, GF_MANA, randint(rlev * 7 / 2) + 50);
@@ -3890,10 +3307,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_PLAS */
- case 128 + 24:
+ case SF_BO_PLAS_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a plasma bolt.", m_name);
bolt(m_idx, GF_PLASMA, 10 + damroll(8, 7) + (rlev));
@@ -3901,10 +3317,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_BO_ICEE */
- case 128 + 25:
+ case SF_BO_ICEE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts an ice bolt.", m_name);
bolt(m_idx, GF_ICE, damroll(6, 6) + (rlev));
@@ -3913,10 +3328,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_MISSILE */
- case 128 + 26:
+ case SF_MISSILE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a magic missile.", m_name);
bolt(m_idx, GF_MISSILE, damroll(2, 6) + (rlev / 3));
@@ -3924,10 +3338,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF5_SCARE */
- case 128 + 27:
+ case SF_SCARE_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles, and you hear scary noises.", m_name);
else msg_format("%^s casts a fearful illusion.", m_name);
if (p_ptr->resist_fear)
@@ -3940,16 +3353,15 @@ static bool_ make_attack_spell(int m_idx)
}
else
{
- (void)set_afraid(p_ptr->afraid + rand_int(4) + 4);
+ set_afraid(p_ptr->afraid + rand_int(4) + 4);
}
update_smart_learn(m_idx, DRS_FEAR);
break;
}
- /* RF5_BLIND */
- case 128 + 28:
+ case SF_BLIND_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s casts a spell, burning your eyes!", m_name);
if (p_ptr->resist_blind)
@@ -3962,16 +3374,15 @@ static bool_ make_attack_spell(int m_idx)
}
else
{
- (void)set_blind(12 + rand_int(4));
+ set_blind(12 + rand_int(4));
}
update_smart_learn(m_idx, DRS_BLIND);
break;
}
- /* RF5_CONF */
- case 128 + 29:
+ case SF_CONF_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles, and you hear puzzling noises.", m_name);
else msg_format("%^s creates a mesmerizing illusion.", m_name);
if (p_ptr->resist_conf)
@@ -3984,16 +3395,15 @@ static bool_ make_attack_spell(int m_idx)
}
else
{
- (void)set_confused(p_ptr->confused + rand_int(4) + 4);
+ set_confused(p_ptr->confused + rand_int(4) + 4);
}
update_smart_learn(m_idx, DRS_CONF);
break;
}
- /* RF5_SLOW */
- case 128 + 30:
+ case SF_SLOW_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s drains power from your muscles!", m_name);
if (p_ptr->free_act)
{
@@ -4005,16 +3415,15 @@ static bool_ make_attack_spell(int m_idx)
}
else
{
- (void)set_slow(p_ptr->slow + rand_int(4) + 4);
+ set_slow(p_ptr->slow + rand_int(4) + 4);
}
update_smart_learn(m_idx, DRS_FREE);
break;
}
- /* RF5_HOLD */
- case 128 + 31:
+ case SF_HOLD_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s stares deep into your eyes!", m_name);
if (p_ptr->free_act)
@@ -4027,18 +3436,15 @@ static bool_ make_attack_spell(int m_idx)
}
else
{
- (void)set_paralyzed(rand_int(4) + 4);
+ set_paralyzed(rand_int(4) + 4);
}
update_smart_learn(m_idx, DRS_FREE);
break;
}
-
-
- /* RF6_HASTE */
- case 160 + 0:
+ case SF_HASTE_IDX:
{
- disturb(1);
+ disturb();
if (blind)
{
msg_format("%^s mumbles.", m_name);
@@ -4065,10 +3471,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF6_HAND_DOOM */
- case 160 + 1:
+ case SF_HAND_DOOM_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s invokes the Hand of Doom!", m_name);
if (rand_int(100) < p_ptr->skill_sav)
{
@@ -4086,10 +3491,9 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF6_HEAL */
- case 160 + 2:
+ case SF_HEAL_IDX:
{
- disturb(1);
+ disturb();
/* Message */
if (blind)
@@ -4150,60 +3554,41 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF6_S_ANIMALS */
- case 160 + 3:
- {
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons some animals!", m_name);
- for (k = 0; k < 4; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_ANIMAL);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
- break;
- }
-
- /* RF6_BLINK */
- case 160 + 4:
+ case SF_BLINK_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s blinks away.", m_name);
teleport_away(m_idx, 10);
break;
}
- /* RF6_TPORT */
- case 160 + 5:
+ case SF_TPORT_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s teleports away.", m_name);
teleport_away(m_idx, MAX_SIGHT * 2 + 5);
break;
}
- /* RF6_TELE_TO */
- case 160 + 6:
+ case SF_TELE_TO_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s commands you to return.", m_name);
teleport_player_to(m_ptr->fy, m_ptr->fx);
break;
}
- /* RF6_TELE_AWAY */
- case 160 + 7:
+ case SF_TELE_AWAY_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s teleports you away.", m_name);
teleport_player(100);
break;
}
- /* RF6_TELE_LEVEL */
- case 160 + 8:
+ case SF_TELE_LEVEL_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles strangely.", m_name);
else msg_format("%^s gestures at your feet.", m_name);
if (p_ptr->resist_nexus)
@@ -4222,30 +3607,18 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF6_DARKNESS */
- case 160 + 9:
+ case SF_DARKNESS_IDX:
{
- disturb(1);
+ disturb();
if (blind) msg_format("%^s mumbles.", m_name);
else msg_format("%^s gestures in shadow.", m_name);
- (void)unlite_area(0, 3);
- break;
- }
-
- /* RF6_TRAPS */
- case 160 + 10:
- {
- disturb(1);
- if (blind) msg_format("%^s mumbles, and then cackles evilly.", m_name);
- else msg_format("%^s casts a spell and cackles evilly.", m_name);
- (void)trap_creation();
+ unlite_area(0, 3);
break;
}
- /* RF6_FORGET */
- case 160 + 11:
+ case SF_FORGET_IDX:
{
- disturb(1);
+ disturb();
msg_format("%^s tries to blank your mind.", m_name);
if (rand_int(100) < p_ptr->skill_sav)
@@ -4259,332 +3632,187 @@ static bool_ make_attack_spell(int m_idx)
break;
}
- /* RF6_ANIM_DEAD */
- case 160 + 12:
- break;
+ case SF_S_ANIMAL_IDX:
+ {
+ do_summon("summons an animal!", 1, SUMMON_ANIMAL, blind_msg_default);
+ break;
+ }
- /* RF6_S_BUG */
- case 160 + 13:
+ case SF_S_ANIMALS_IDX:
+ {
+ do_summon("summons some animals!", 4, SUMMON_ANIMAL, blind_msg_default);
+ break;
+ }
+
+ case SF_S_BUG_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically codes some software bugs.", m_name);
- for (k = 0; k < 6; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_BUG);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
+ do_summon("codes some software bugs.", 6, SUMMON_BUG, blind_msg_default);
break;
}
- /* RF6_S_RNG */
- case 160 + 14:
+ case SF_S_RNG_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically codes some RNGs.", m_name);
- for (k = 0; k < 6; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_RNG);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
+ do_summon("codes some RNGs.", 6, SUMMON_RNG, blind_msg_default);
break;
}
- /* RF6_S_THUNDERLORD */
- case 160 + 15:
+ case SF_S_THUNDERLORD_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons a Thunderlord!", m_name);
- for (k = 0; k < 1; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_THUNDERLORD);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
+ do_summon("summons a Thunderlord!", 1, SUMMON_THUNDERLORD, blind_msg_default);
break;
}
- /* RF6_SUMMON_KIN */
- case 160 + 16:
+ case SF_S_KIN_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons %s %s.",
- m_name, m_poss,
- ((r_ptr->flags1) & RF1_UNIQUE ?
- "minions" : "kin"));
- summon_kin_type = r_ptr->d_char; /* Big hack */
-
- for (k = 0; k < 6; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_KIN);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
-
+ // Describe the summons
+ char action[256];
+ sprintf(action,
+ "summons %s %s.",
+ m_poss,
+ (r_ptr->flags & RF_UNIQUE) ? "minions" : "kin");
+ // Force the correct type of "kin"
+ summon_kin_type = r_ptr->d_char;
+ // Summon
+ do_summon(action, 6, SUMMON_KIN, blind_msg_default);
break;
}
- /* RF6_S_HI_DEMON */
- case 160 + 17:
+ case SF_S_HI_DEMON_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons greater demons!", m_name);
- if (blind && count) msg_print("You hear heavy steps nearby.");
- summon_cyber();
+ do_summon("summons greater demons!", 8, SUMMON_HI_DEMON, blind_msg_default);
break;
}
- /* RF6_S_MONSTER */
- case 160 + 18:
+ case SF_S_MONSTER_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons help!", m_name);
- for (k = 0; k < 1; k++)
- {
- count += summon_specific(y, x, rlev, 0);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
+ do_summon("summons help!", 1, 0, blind_msg_default);
break;
}
- /* RF6_S_MONSTERS */
- case 160 + 19:
+ case SF_S_MONSTERS_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons monsters!", m_name);
- for (k = 0; k < 8; k++)
- {
- count += summon_specific(y, x, rlev, 0);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
+ do_summon("summons monsters!", 8, 0, blind_msg_default);
break;
}
- /* RF6_S_ANT */
- case 160 + 20:
+ case SF_S_ANT_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons ants.", m_name);
- for (k = 0; k < 6; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_ANT);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
+ do_summon("summons ants.", 6, SUMMON_ANT, blind_msg_default);
break;
}
- /* RF6_S_SPIDER */
- case 160 + 21:
+ case SF_S_SPIDER_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons spiders.", m_name);
- for (k = 0; k < 6; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_SPIDER);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
+ do_summon("summons spiders.", 6, SUMMON_SPIDER, blind_msg_default);
break;
}
- /* RF6_S_HOUND */
- case 160 + 22:
+ case SF_S_HOUND_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons hounds.", m_name);
- for (k = 0; k < 6; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_HOUND);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
+ do_summon("summons hounds.", 6, SUMMON_HOUND, blind_msg_default);
break;
}
- /* RF6_S_HYDRA */
- case 160 + 23:
+ case SF_S_HYDRA_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons hydras.", m_name);
- for (k = 0; k < 6; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_HYDRA);
- }
- if (blind && count) msg_print("You hear many things appear nearby.");
+ do_summon("summons hydras.", 6, SUMMON_HYDRA, blind_msg_default);
break;
}
- /* RF6_S_ANGEL */
- case 160 + 24:
+ case SF_S_ANGEL_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons an angel!", m_name);
- for (k = 0; k < 1; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_ANGEL);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
+ do_summon("summons an angel!", 1, SUMMON_ANGEL, blind_msg_default);
break;
}
- /* RF6_S_DEMON */
- case 160 + 25:
+ case SF_S_DEMON_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons a demon!", m_name);
- for (k = 0; k < 1; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_DEMON);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
+ do_summon("summons a demon!", 1, SUMMON_DEMON, blind_msg_default);
break;
}
- /* RF6_S_UNDEAD */
- case 160 + 26:
+ case SF_S_UNDEAD_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons an undead adversary!", m_name);
- for (k = 0; k < 1; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_UNDEAD);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
+ do_summon("summons an undead adversary!", 1, SUMMON_UNDEAD, blind_msg_default);
break;
}
- /* RF6_S_DRAGON */
- case 160 + 27:
+ case SF_S_DRAGON_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons a dragon!", m_name);
- for (k = 0; k < 1; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_DRAGON);
- }
- if (blind && count) msg_print("You hear something appear nearby.");
+ do_summon("summons a dragon!", 1, SUMMON_DRAGON, blind_msg_default);
break;
}
- /* RF6_S_HI_UNDEAD */
- case 160 + 28:
+ case SF_S_HI_UNDEAD_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons greater undead!", m_name);
- for (k = 0; k < 8; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD);
- }
- if (blind && count)
- {
- msg_print("You hear many creepy things appear nearby.");
- }
+ summon_messages blind_msg {
+ "You hear a creepy thing appear nearby.",
+ "You hear many creepy things appear nearby."
+ };
+ do_summon("summons greater undead!", 8, SUMMON_HI_UNDEAD, blind_msg);
break;
}
- /* RF6_S_HI_DRAGON */
- case 160 + 29:
+ case SF_S_HI_DRAGON_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons ancient dragons!", m_name);
- for (k = 0; k < 8; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_HI_DRAGON);
- }
- if (blind && count)
- {
- msg_print("You hear many powerful things appear nearby.");
- }
+ summon_messages blind_msg {
+ "You hear a powerful thing appear nearby.",
+ "You hear many powerful things appear nearby."
+ };
+ do_summon("summons ancient dragons!", 8, SUMMON_HI_DRAGON, blind_msg);
break;
}
- /* RF6_S_WRAITH */
- case 160 + 30:
+ case SF_S_WRAITH_IDX:
{
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons Wraith!", m_name);
-
+ summon_messages blind_msg {
+ "You hear an immortal being appear nearby.",
+ "You hear immortal beings appear nearby."
+ };
+ do_summon("summons Wraiths!", 8, SUMMON_WRAITH, blind_msg);
+ break;
+ }
- for (k = 0; k < 8; k++)
+ case SF_S_UNIQUE_IDX:
+ {
+ // Interrupt
+ disturb();
+ // Message
+ if (blind)
{
- count += summon_specific(y, x, rlev, SUMMON_WRAITH);
+ msg_format("%^s mumbles.", m_name);
}
-
- if (blind && count)
+ else
{
- msg_print("You hear immortal beings appear nearby.");
+ msg_format("%^s magically summons special opponents!", m_name);
}
- break;
- }
-
- /* RF6_S_UNIQUE */
- case 160 + 31:
- {
- disturb(1);
- if (blind) msg_format("%^s mumbles.", m_name);
- else msg_format("%^s magically summons special opponents!", m_name);
- for (k = 0; k < 8; k++)
+ // Summon
+ int count = 0;
+ for (int k = 0; k < 8; k++)
{
- count += summon_specific(y, x, rlev, SUMMON_UNIQUE);
+ count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_UNIQUE);
}
- for (k = 0; k < 8; k++)
+ for (int k = 0; k < 8; k++)
{
- count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD);
+ count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HI_UNDEAD);
}
- if (blind && count)
+ // Message
+ if (blind)
{
- msg_print("You hear many powerful things appear nearby.");
+ if (count == 1)
+ {
+ msg_print("You hear a powerful thing appear nearby.");
+ }
+ else if (count > 1)
+ {
+ msg_print("You hear many powerful things appear nearby.");
+ }
}
break;
}
}
}
- /* Remember what the monster did to us */
- if (seen)
- {
- /* Inate spell */
- if (thrown_spell < 32*4)
- {
- r_ptr->r_flags4 |= (1L << (thrown_spell - 32 * 3));
- if (r_ptr->r_cast_inate < MAX_UCHAR) r_ptr->r_cast_inate++;
- }
-
- /* Bolt or Ball */
- else if (thrown_spell < 32*5)
- {
- r_ptr->r_flags5 |= (1L << (thrown_spell - 32 * 4));
- if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++;
- }
-
- /* Special spell */
- else if (thrown_spell < 32*6)
- {
- r_ptr->r_flags6 |= (1L << (thrown_spell - 32 * 5));
- if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++;
- }
- }
-
-
- /* Always take note of monsters that kill you */
- if (death && (r_ptr->r_deaths < MAX_SHORT))
- {
- r_ptr->r_deaths++;
- }
-
/* A spell was cast */
return (TRUE);
}
@@ -4688,7 +3916,10 @@ static int mon_will_run(int m_idx)
static bool_ get_fear_moves_aux(int m_idx, int *yp, int *xp)
{
/* Monster flowing disabled */
- if (!flow_by_sound) return (FALSE);
+ if (!options->flow_by_sound)
+ {
+ return (FALSE);
+ }
/* Monster location */
monster_type *m_ptr = &m_list[m_idx];
@@ -4806,7 +4037,7 @@ static bool_ find_safety(int m_idx, int *yp, int *xp)
if (distance(y, x, fy, fx) != d) continue;
/* Check for "availability" (if monsters can flow) */
- if (flow_by_sound)
+ if (options->flow_by_sound)
{
/* Ignore grids very far from the player */
if (cave[y][x].when < cave[p_ptr->py][p_ptr->px].when) continue;
@@ -4924,19 +4155,20 @@ static bool_ find_hiding(int m_idx, int *yp, int *xp)
/* Find an appropriate corpse */
void find_corpse(monster_type *m_ptr, int *y, int *x)
{
+ auto const &r_info = game->edit_data.r_info;
+
int k, last = -1;
for (k = 0; k < max_o_idx; k++)
{
object_type *o_ptr = &o_list[k];
- monster_race *rt_ptr, *rt2_ptr;
if (!o_ptr->k_idx) continue;
if (o_ptr->tval != TV_CORPSE) continue;
if ((o_ptr->sval != SV_CORPSE_CORPSE) && (o_ptr->sval != SV_CORPSE_SKELETON)) continue;
- rt_ptr = &r_info[o_ptr->pval2];
+ auto rt_ptr = &r_info[o_ptr->pval2];
/* Cannot incarnate into a higher level monster */
if (rt_ptr->level > m_ptr->level) continue;
@@ -4946,9 +4178,16 @@ void find_corpse(monster_type *m_ptr, int *y, int *x)
if (last != -1)
{
- rt2_ptr = &r_info[o_list[last].pval2];
- if (rt_ptr->level > rt2_ptr->level) last = k;
- else continue;
+ auto rt2_ptr = &r_info[o_list[last].pval2];
+
+ if (rt_ptr->level > rt2_ptr->level)
+ {
+ last = k;
+ }
+ else
+ {
+ continue;
+ }
}
else
{
@@ -4969,6 +4208,8 @@ void find_corpse(monster_type *m_ptr, int *y, int *x)
*/
static void get_target_monster(int m_idx)
{
+ auto const &r_info = game->edit_data.r_info;
+
monster_type *m_ptr = &m_list[m_idx];
int i, t = -1, d = 9999;
@@ -4978,7 +4219,7 @@ static void get_target_monster(int m_idx)
/* Access the monster */
monster_type *t_ptr = &m_list[i];
/* hack should call the function for ego monsters ... but no_target i not meant to be added by ego and it speeds up the code */
- monster_race *rt_ptr = &r_info[t_ptr->r_idx];
+ auto rt_ptr = &r_info[t_ptr->r_idx];
int dd;
/* Ignore "dead" monsters */
@@ -4987,7 +4228,7 @@ static void get_target_monster(int m_idx)
if (m_idx == i) continue;
/* Cannot be targeted */
- if (rt_ptr->flags7 & RF7_NO_TARGET) continue;
+ if (rt_ptr->flags & RF_NO_TARGET) continue;
if (is_enemy(m_ptr, t_ptr) && (los(m_ptr->fy, m_ptr->fx, t_ptr->fy, t_ptr->fx) &&
((dd = distance(m_ptr->fy, m_ptr->fx, t_ptr->fy, t_ptr->fx)) < d)))
@@ -5047,13 +4288,13 @@ static bool_ get_moves(int m_idx, int *mm)
const auto r_ptr = m_ptr->race();
/* A possessor is not interrested in the player, it only wants a corpse */
- if (r_ptr->flags7 & RF7_POSSESSOR)
+ if (r_ptr->flags & RF_POSSESSOR)
{
find_corpse(m_ptr, &y2, &x2);
}
/* Let quests redefine AI */
- if (r_ptr->flags7 & RF7_AI_SPECIAL)
+ if (r_ptr->flags & RF_AI_SPECIAL)
{
struct hook_monster_ai_in in = { m_idx, &m_list[m_idx] };
struct hook_monster_ai_out out = { 0, 0 };
@@ -5066,7 +4307,7 @@ static bool_ get_moves(int m_idx, int *mm)
if (m_idx == p_ptr->control)
{
- if ((r_ptr->flags7 & RF7_AI_PLAYER) || magik(85))
+ if ((r_ptr->flags & RF_AI_PLAYER) || magik(85))
{
if (distance(p_ptr->py, p_ptr->px, m_ptr->fy, m_ptr->fx) < 50)
{
@@ -5081,7 +4322,7 @@ static bool_ get_moves(int m_idx, int *mm)
int x = m_ptr->fx - x2;
/* Tease the player */
- if (r_ptr->flags7 & RF7_AI_ANNOY)
+ if (r_ptr->flags & RF_AI_ANNOY)
{
if (distance(m_ptr->fy, m_ptr->fx, y2, x2) < 4)
{
@@ -5091,7 +4332,7 @@ static bool_ get_moves(int m_idx, int *mm)
}
/* Death orbs .. */
- if (r_ptr->flags2 & RF2_DEATH_ORB)
+ if (r_ptr->flags & RF_DEATH_ORB)
{
if (!los(m_ptr->fy, m_ptr->fx, y2, x2))
{
@@ -5107,10 +4348,10 @@ static bool_ get_moves(int m_idx, int *mm)
* Animal packs try to get the player out of corridors
* (...unless they can move through walls -- TY)
*/
- if ((r_ptr->flags1 & RF1_FRIENDS) &&
- (r_ptr->flags3 & RF3_ANIMAL) &&
- !((r_ptr->flags2 & (RF2_PASS_WALL)) ||
- (r_ptr->flags2 & (RF2_KILL_WALL))))
+ if ((r_ptr->flags & RF_FRIENDS) &&
+ (r_ptr->flags & RF_ANIMAL) &&
+ !((r_ptr->flags & RF_PASS_WALL) ||
+ (r_ptr->flags & RF_KILL_WALL)))
{
int i, room = 0;
@@ -5134,7 +4375,7 @@ static bool_ get_moves(int m_idx, int *mm)
}
/* Monster groups try to surround the player */
- if (!done && (r_ptr->flags1 & RF1_FRIENDS))
+ if (!done && (r_ptr->flags & RF_FRIENDS))
{
int i;
@@ -5194,10 +4435,10 @@ static bool_ get_moves(int m_idx, int *mm)
else
{
/* Attempt to avoid the player */
- if (flow_by_sound)
+ if (options->flow_by_sound)
{
/* Adjust movement */
- (void)get_fear_moves_aux(m_idx, &y, &x);
+ get_fear_moves_aux(m_idx, &y, &x);
}
}
}
@@ -5417,7 +4658,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
const auto tr_ptr = t_ptr->race();
/* Not allowed to attack */
- if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
+ if (r_ptr->flags & RF_NEVER_BLOW) return FALSE;
/* Total armor */
const int ac = t_ptr->ac;
@@ -5448,9 +4689,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
/* Scan through all four blows */
for (int ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool_ visible = FALSE;
- bool_ obvious = FALSE;
-
int power = 0;
int damage = 0;
@@ -5481,9 +4719,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
/* break; */
}
- /* Extract visibility (before blink) */
- if (m_ptr->ml) visible = TRUE;
-
/* Extract the attack "power" */
power = get_attack_power(effect);
@@ -5492,7 +4727,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
if (!effect || check_hit2(power, rlev, ac))
{
/* Always disturbing */
- if (disturb_other) disturb(1);
+ disturb_on_other();
/* Describe the attack method */
switch (method)
@@ -5679,9 +4914,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
}
- /* Hack -- assume all attacks are obvious */
- obvious = TRUE;
-
/* Roll out the damage */
damage = damroll(d_dice, d_side);
@@ -5838,15 +5070,13 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
if (touched)
{
/* Aura fire */
- if ((tr_ptr->flags2 & RF2_AURA_FIRE) &&
- !(r_ptr->flags3 & RF3_IM_FIRE))
+ if ((tr_ptr->flags & RF_AURA_FIRE) &&
+ !(r_ptr->flags & RF_IM_FIRE))
{
if (m_ptr->ml || t_ptr->ml)
{
blinked = FALSE;
monster_msg("%^s is suddenly very hot!", m_name);
- if (t_ptr->ml)
- tr_ptr->r_flags2 |= RF2_AURA_FIRE;
}
project(t_idx, 0, m_ptr->fy, m_ptr->fx,
damroll (1 + ((t_ptr->level) / 26),
@@ -5855,14 +5085,12 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
}
/* Aura elec */
- if ((tr_ptr->flags2 & (RF2_AURA_ELEC)) && !(r_ptr->flags3 & (RF3_IM_ELEC)))
+ if ((tr_ptr->flags & RF_AURA_ELEC) && !(r_ptr->flags & RF_IM_ELEC))
{
if (m_ptr->ml || t_ptr->ml)
{
blinked = FALSE;
monster_msg("%^s gets zapped!", m_name);
- if (t_ptr->ml)
- tr_ptr->r_flags2 |= RF2_AURA_ELEC;
}
project(t_idx, 0, m_ptr->fy, m_ptr->fx,
damroll (1 + ((t_ptr->level) / 26),
@@ -5897,7 +5125,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
if (m_ptr->ml)
{
/* Disturbing */
- disturb(1);
+ disturb();
/* Message */
monster_msg("%^s misses %s.", m_name, t_name);
@@ -5907,26 +5135,10 @@ static bool_ monst_attack_monst(int m_idx, int t_idx)
}
}
}
-
-
- /* Analyze "visible" monsters only */
- if (visible)
- {
- /* Count "obvious" attacks (and ones that cause damage) */
- if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
- {
- /* Count attacks of this type */
- if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
- {
- r_ptr->r_blows[ap_cnt]++;
- }
- }
- }
}
if (explode)
{
- sound(SOUND_EXPLODE);
mon_take_hit_mon(m_idx, m_idx, m_ptr->hp + 1, &fear, " explodes into tiny shreds.");
blinked = FALSE;
@@ -5964,27 +5176,27 @@ static bool_ player_invis(monster_type * m_ptr)
s16b inv = p_ptr->invis;
s16b mlv = m_ptr->level;
- if (r_ptr->flags3 & RF3_NO_SLEEP)
+ if (r_ptr->flags & RF_NO_SLEEP)
mlv += 10;
- if (r_ptr->flags3 & RF3_DRAGON)
+ if (r_ptr->flags & RF_DRAGON)
mlv += 20;
- if (r_ptr->flags3 & RF3_UNDEAD)
+ if (r_ptr->flags & RF_UNDEAD)
mlv += 15;
- if (r_ptr->flags3 & RF3_DEMON)
+ if (r_ptr->flags & RF_DEMON)
mlv += 15;
- if (r_ptr->flags3 & RF3_ANIMAL)
+ if (r_ptr->flags & RF_ANIMAL)
mlv += 15;
- if (r_ptr->flags3 & RF3_ORC)
+ if (r_ptr->flags & RF_ORC)
mlv -= 15;
- if (r_ptr->flags3 & RF3_TROLL)
+ if (r_ptr->flags & RF_TROLL)
mlv -= 10;
- if (r_ptr->flags2 & RF2_STUPID)
+ if (r_ptr->flags & RF_STUPID)
mlv /= 2;
- if (r_ptr->flags2 & RF2_SMART)
+ if (r_ptr->flags & RF_SMART)
mlv = (mlv * 5) / 4;
if (m_ptr->mflag & MFLAG_QUEST)
inv = 0;
- if (r_ptr->flags2 & RF2_INVISIBLE)
+ if (r_ptr->flags & RF_INVISIBLE)
inv = 0;
if (m_ptr->mflag & MFLAG_CONTROL)
inv = 0;
@@ -6021,6 +5233,8 @@ static bool_ player_invis(monster_type * m_ptr)
*/
static void process_monster(int m_idx, bool_ is_frien)
{
+ auto const &f_info = game->edit_data.f_info;
+
int i, d, oy, ox, ny, nx;
int mm[8];
@@ -6029,7 +5243,7 @@ static void process_monster(int m_idx, bool_ is_frien)
const bool_ inv = player_invis(m_ptr);
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags9 & RF9_DOPPLEGANGER) doppleganger = m_idx;
+ if (r_ptr->flags & RF_DOPPLEGANGER) doppleganger = m_idx;
/* Handle "bleeding" */
if (m_ptr->bleeding)
@@ -6136,18 +5350,7 @@ static void process_monster(int m_idx, bool_ is_frien)
{
/* Monster wakes up "a little bit" */
m_ptr->csleep -= d;
-
- /* Notice the "not waking up" */
- if (m_ptr->ml)
- {
- /* Hack -- Count the ignores */
- if (r_ptr->r_ignore < MAX_UCHAR)
- {
- r_ptr->r_ignore++;
- }
- }
}
-
/* Just woke up */
else
{
@@ -6164,12 +5367,6 @@ static void process_monster(int m_idx, bool_ is_frien)
/* Dump a message */
msg_format("%^s wakes up.", m_name);
-
- /* Hack -- Count the wakings */
- if (r_ptr->r_wake < MAX_UCHAR)
- {
- r_ptr->r_wake++;
- }
}
}
}
@@ -6259,12 +5456,12 @@ static void process_monster(int m_idx, bool_ is_frien)
bool_ gets_angry = FALSE;
/* No one wants to be your friend if you're aggravating */
- if ((m_ptr->status > MSTATUS_NEUTRAL) && (m_ptr->status < MSTATUS_COMPANION) && (p_ptr->aggravate) && !(r_ptr->flags7 & RF7_PET))
+ if ((m_ptr->status > MSTATUS_NEUTRAL) && (m_ptr->status < MSTATUS_COMPANION) && (p_ptr->aggravate) && !(r_ptr->flags & RF_PET))
gets_angry = TRUE;
/* Paranoia... no friendly uniques outside wizard mode -- TY */
if ((m_ptr->status > MSTATUS_NEUTRAL) && (m_ptr->status < MSTATUS_COMPANION) && !(wizard) &&
- (r_ptr->flags1 & (RF1_UNIQUE)) && !(r_ptr->flags7 & RF7_PET))
+ (r_ptr->flags & RF_UNIQUE) && !(r_ptr->flags & RF_PET))
gets_angry = TRUE;
if (gets_angry)
@@ -6320,17 +5517,17 @@ static void process_monster(int m_idx, bool_ is_frien)
ox = m_ptr->fx;
/* Attempt to "multiply" if able and allowed */
- if ((r_ptr->flags4 & (RF4_MULTIPLY)) && (num_repro < MAX_REPRO))
+ if ((r_ptr->spells & SF_MULTIPLY) && (num_repro < MAX_REPRO))
{
if (ai_multiply(m_idx)) return;
}
if (randint(SPEAK_CHANCE) == 1)
{
- if (player_has_los_bold(oy, ox) && (r_ptr->flags2 & RF2_CAN_SPEAK))
+ if (player_has_los_bold(oy, ox) && (r_ptr->flags & RF_CAN_SPEAK))
{
char m_name[80];
- char monmessage[80];
+ char monmessage[1024];
/* Acquire the monster name/poss */
if (m_ptr->ml)
@@ -6394,36 +5591,26 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* 75% random movement */
- else if ((r_ptr->flags1 & (RF1_RAND_50)) &&
- (r_ptr->flags1 & (RF1_RAND_25)) &&
+ else if ((r_ptr->flags & RF_RAND_50) &&
+ (r_ptr->flags & RF_RAND_25) &&
(rand_int(100) < 75))
{
- /* Memorize flags */
- if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_50);
- if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_25);
-
/* Try four "random" directions */
mm[0] = mm[1] = mm[2] = mm[3] = 5;
}
/* 50% random movement */
- else if ((r_ptr->flags1 & (RF1_RAND_50)) &&
+ else if ((r_ptr->flags & RF_RAND_50) &&
(rand_int(100) < 50))
{
- /* Memorize flags */
- if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_50);
-
/* Try four "random" directions */
mm[0] = mm[1] = mm[2] = mm[3] = 5;
}
/* 25% random movement */
- else if ((r_ptr->flags1 & (RF1_RAND_25)) &&
+ else if ((r_ptr->flags & RF_RAND_25) &&
(rand_int(100) < 25))
{
- /* Memorize flags */
- if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_25);
-
/* Try four "random" directions */
mm[0] = mm[1] = mm[2] = mm[3] = 5;
}
@@ -6447,12 +5634,6 @@ static void process_monster(int m_idx, bool_ is_frien)
/* Assume nothing */
bool_ did_open_door = FALSE;
bool_ did_bash_door = FALSE;
- bool_ did_take_item = FALSE;
- bool_ did_kill_item = FALSE;
- bool_ did_move_body = FALSE;
- bool_ did_kill_body = FALSE;
- bool_ did_pass_wall = FALSE;
- bool_ did_kill_wall = FALSE;
/* Take a zero-terminated array of "directions" */
for (i = 0; mm[i]; i++)
@@ -6481,16 +5662,9 @@ static void process_monster(int m_idx, bool_ is_frien)
do_move = TRUE;
}
- /* Floor is trapped? */
- else if (c_ptr->feat == FEAT_MON_TRAP)
- {
- /* Go ahead and move */
- do_move = TRUE;
- }
-
/* Hack -- check for Glyph of Warding */
if ((c_ptr->feat == FEAT_GLYPH) &&
- !(r_ptr->flags1 & RF1_NEVER_BLOW))
+ !(r_ptr->flags & RF_NEVER_BLOW))
{
/* Assume no move allowed */
do_move = FALSE;
@@ -6516,7 +5690,7 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* Hack -- trees are obstacle */
- else if ((cave[ny][nx].feat == FEAT_TREES) && (r_ptr->flags9 & RF9_KILL_TREES))
+ else if ((cave[ny][nx].feat == FEAT_TREES) && (r_ptr->flags & RF_KILL_TREES))
{
do_move = TRUE;
@@ -6540,45 +5714,39 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* Permanent wall */
- else if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT)
+ else if (f_info[c_ptr->feat].flags & FF_PERMANENT)
{
/* Nothing */
}
/* Some monsters can fly */
- else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_LEVITATE) && (r_ptr->flags7 & (RF7_CAN_FLY)))
+ else if ((f_info[c_ptr->feat].flags & FF_CAN_LEVITATE) && (r_ptr->flags & RF_CAN_FLY))
{
/* Pass through walls/doors/rubble */
do_move = TRUE;
}
/* Some monsters can fly */
- else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_FLY) && (r_ptr->flags7 & (RF7_CAN_FLY)))
+ else if ((f_info[c_ptr->feat].flags & FF_CAN_FLY) && (r_ptr->flags & RF_CAN_FLY))
{
/* Pass through trees/... */
do_move = TRUE;
}
/* Monster moves through walls (and doors) */
- else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & (RF2_PASS_WALL)))
+ else if ((f_info[c_ptr->feat].flags & FF_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL))
{
/* Pass through walls/doors/rubble */
do_move = TRUE;
-
- /* Monster went through a wall */
- did_pass_wall = TRUE;
}
/* Monster destroys walls (and doors) */
- else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & (RF2_KILL_WALL)))
+ else if ((f_info[c_ptr->feat].flags & FF_CAN_PASS) && (r_ptr->flags & RF_KILL_WALL))
{
/* Eat through walls/doors/rubble */
do_move = TRUE;
- /* Monster destroyed a wall */
- did_kill_wall = TRUE;
-
if (randint(GRINDNOISE) == 1)
{
msg_print("There is a grinding sound.");
@@ -6595,18 +5763,15 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* Monster moves through walls (and doors) */
- else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & (RF2_PASS_WALL)))
+ else if ((f_info[c_ptr->feat].flags & FF_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL))
{
/* Pass through walls/doors/rubble */
do_move = TRUE;
-
- /* Monster went through a wall */
- did_pass_wall = TRUE;
}
/* Monster moves through webs */
- else if ((f_info[c_ptr->feat].flags1 & FF1_WEB) &&
- (r_ptr->flags7 & RF7_SPIDER))
+ else if ((f_info[c_ptr->feat].flags & FF_WEB) &&
+ (r_ptr->flags & RF_SPIDER))
{
/* Pass through webs */
do_move = TRUE;
@@ -6622,7 +5787,7 @@ static void process_monster(int m_idx, bool_ is_frien)
/* Take a turn */
do_turn = TRUE;
- if ((r_ptr->flags2 & (RF2_OPEN_DOOR)) &&
+ if ((r_ptr->flags & RF_OPEN_DOOR) &&
((is_friend(m_ptr) <= 0) || p_ptr->pet_open_doors))
{
/* Closed doors and secret doors */
@@ -6657,7 +5822,7 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* Stuck doors -- attempt to bash them down if allowed */
- if (may_bash && (r_ptr->flags2 & RF2_BASH_DOOR) &&
+ if (may_bash && (r_ptr->flags & RF_BASH_DOOR) &&
((is_friend(m_ptr) <= 0) || p_ptr->pet_open_doors))
{
int k;
@@ -6672,7 +5837,10 @@ static void process_monster(int m_idx, bool_ is_frien)
msg_print("You hear a door burst open!");
/* Disturb (sometimes) */
- if (disturb_minor) disturb(0);
+ if (options->disturb_minor)
+ {
+ disturb();
+ }
/* The door was bashed open */
did_bash_door = TRUE;
@@ -6706,7 +5874,7 @@ static void process_monster(int m_idx, bool_ is_frien)
}
}
else if (do_move && (c_ptr->feat == FEAT_MINOR_GLYPH)
- && !(r_ptr->flags1 & RF1_NEVER_BLOW))
+ && !(r_ptr->flags & RF_NEVER_BLOW))
{
/* Assume no move allowed */
do_move = FALSE;
@@ -6751,7 +5919,7 @@ static void process_monster(int m_idx, bool_ is_frien)
/* Access that cave grid's contents */
y_ptr = &m_list[c_ptr->m_idx];
- if (!(r_ptr->flags3 & RF3_IM_COLD))
+ if (!(r_ptr->flags & RF_IM_COLD))
{
if ((m_ptr->hp - distance(ny, nx, oy, ox)*2) <= 0)
{
@@ -6791,7 +5959,7 @@ static void process_monster(int m_idx, bool_ is_frien)
/* Some monsters never attack */
if (do_move && (ny == p_ptr->py) && (nx == p_ptr->px) &&
- (r_ptr->flags1 & RF1_NEVER_BLOW))
+ (r_ptr->flags & RF_NEVER_BLOW))
{
/* Do not move */
do_move = FALSE;
@@ -6801,7 +5969,7 @@ static void process_monster(int m_idx, bool_ is_frien)
if (do_move && (ny == p_ptr->py) && (nx == p_ptr->px))
{
/* Do the attack */
- (void)make_attack_normal(m_idx, 1);
+ make_attack_normal(m_idx, 1);
/* Do not move */
do_move = FALSE;
@@ -6828,12 +5996,12 @@ static void process_monster(int m_idx, bool_ is_frien)
do_move = FALSE;
/* Kill weaker monsters */
- if ((r_ptr->flags2 & RF2_KILL_BODY) &&
+ if ((r_ptr->flags & RF_KILL_BODY) &&
(r_ptr->mexp > z_ptr->mexp) && (cave_floor_bold(ny, nx)) &&
/* Friends don't kill friends... */
!((is_friend(m_ptr) > 0) && (is_friend(m2_ptr) > 0)) &&
/* Uniques aren't faceless monsters in a crowd */
- !(z_ptr->flags1 & RF1_UNIQUE) &&
+ !(z_ptr->flags & RF_UNIQUE) &&
/* Don't wreck quests */
!(m2_ptr->mflag & (MFLAG_QUEST | MFLAG_QUEST2)) &&
/* Don't punish summoners for relying on their friends */
@@ -6842,11 +6010,6 @@ static void process_monster(int m_idx, bool_ is_frien)
/* Allow movement */
do_move = TRUE;
- /* Monster ate another monster */
- did_kill_body = TRUE;
-
- /* XXX XXX XXX Message */
-
/* Kill the monster */
delete_monster(ny, nx);
@@ -6872,17 +6035,12 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* Push past weaker monsters (unless leaving a wall) */
- else if ((r_ptr->flags2 & RF2_MOVE_BODY) &&
+ else if ((r_ptr->flags & RF_MOVE_BODY) &&
(r_ptr->mexp > z_ptr->mexp) && cave_floor_bold(ny, nx) &&
(cave_floor_bold(m_ptr->fy, m_ptr->fx)))
{
/* Allow movement */
do_move = TRUE;
-
- /* Monster pushed past another monster */
- did_move_body = TRUE;
-
- /* XXX XXX XXX Message */
}
}
@@ -6899,11 +6057,8 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* Some monsters never move */
- if (do_move && (r_ptr->flags1 & RF1_NEVER_MOVE))
+ if (do_move && (r_ptr->flags & RF_NEVER_MOVE))
{
- /* Hack -- memorize lack of attacks */
- /* if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_NEVER_MOVE); */
-
/* Do not move */
do_move = FALSE;
}
@@ -6966,150 +6121,130 @@ static void process_monster(int m_idx, bool_ is_frien)
}
/* Possible disturb */
- if (m_ptr->ml && (disturb_move ||
+ if (m_ptr->ml && (options->disturb_move ||
((m_ptr->mflag & (MFLAG_VIEW)) &&
- disturb_near)))
+ options->disturb_near)))
{
/* Disturb */
- if ((is_friend(m_ptr) < 0) || disturb_pets)
- disturb(0);
- }
-
- /* Check for monster trap */
- if (c_ptr->feat == FEAT_MON_TRAP)
- {
- if (mon_hit_trap(m_idx)) return;
+ if ((is_friend(m_ptr) < 0) || options->disturb_pets)
+ disturb();
}
- else
- {
- /* Copy list of objects; we need a copy because we're mutating the list. */
- auto const object_idxs(c_ptr->o_idxs);
-
- /* Scan all objects in the grid */
- for (auto const this_o_idx: object_idxs)
- {
- /* Acquire object */
- object_type * o_ptr = &o_list[this_o_idx];
- /* Skip gold */
- if (o_ptr->tval == TV_GOLD) continue;
- /* Incarnate ? */
- if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags7 & RF7_POSSESSOR) &&
- ((o_ptr->sval == SV_CORPSE_CORPSE) || (o_ptr->sval == SV_CORPSE_SKELETON)))
- {
- if (ai_possessor(m_idx, this_o_idx)) return;
- }
-
- /* Take or Kill objects on the floor */
- /* rr9: Pets will no longer pick up/destroy items */
- if ((((r_ptr->flags2 & (RF2_TAKE_ITEM)) &&
- ((is_friend(m_ptr) <= 0) || p_ptr->pet_pickup_items)) ||
- (r_ptr->flags2 & (RF2_KILL_ITEM))) &&
- (is_friend(m_ptr) <= 0))
- {
- u32b f1, f2, f3, f4, f5, esp;
+ /* Copy list of objects; we need a copy because we're mutating the list. */
+ auto const object_idxs(c_ptr->o_idxs);
- u32b flg3 = 0L;
+ /* Scan all objects in the grid */
+ for (auto const this_o_idx: object_idxs)
+ {
+ /* Acquire object */
+ object_type * o_ptr = &o_list[this_o_idx];
- char m_name[80];
- char o_name[80];
+ /* Skip gold */
+ if (o_ptr->tval == TV_GOLD) continue;
- /* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ /* Incarnate ? */
+ if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags & RF_POSSESSOR) &&
+ ((o_ptr->sval == SV_CORPSE_CORPSE) || (o_ptr->sval == SV_CORPSE_SKELETON)))
+ {
+ if (ai_possessor(m_idx, this_o_idx)) return;
+ }
- /* Acquire the object name */
- object_desc(o_name, o_ptr, TRUE, 3);
+ /* Take or Kill objects on the floor */
+ /* rr9: Pets will no longer pick up/destroy items */
+ if ((((r_ptr->flags & RF_TAKE_ITEM) &&
+ ((is_friend(m_ptr) <= 0) || p_ptr->pet_pickup_items)) ||
+ (r_ptr->flags & RF_KILL_ITEM)) &&
+ (is_friend(m_ptr) <= 0))
+ {
+ char m_name[80];
+ char o_name[80];
- /* Acquire the monster name */
- monster_desc(m_name, m_ptr, 0x04);
+ /* Extract some flags */
+ auto const flags = object_flags(o_ptr);
- /* React to objects that hurt the monster */
- if (f5 & (TR5_KILL_DEMON)) flg3 |= (RF3_DEMON);
- if (f5 & (TR5_KILL_UNDEAD)) flg3 |= (RF3_UNDEAD);
- if (f1 & (TR1_SLAY_DRAGON)) flg3 |= (RF3_DRAGON);
- if (f1 & (TR1_SLAY_TROLL)) flg3 |= (RF3_TROLL);
- if (f1 & (TR1_SLAY_GIANT)) flg3 |= (RF3_GIANT);
- if (f1 & (TR1_SLAY_ORC)) flg3 |= (RF3_ORC);
- if (f1 & (TR1_SLAY_DEMON)) flg3 |= (RF3_DEMON);
- if (f1 & (TR1_SLAY_UNDEAD)) flg3 |= (RF3_UNDEAD);
- if (f1 & (TR1_SLAY_ANIMAL)) flg3 |= (RF3_ANIMAL);
- if (f1 & (TR1_SLAY_EVIL)) flg3 |= (RF3_EVIL);
+ /* Acquire the object name */
+ object_desc(o_name, o_ptr, TRUE, 3);
- /* The object cannot be picked up by the monster */
- if (artifact_p(o_ptr) || (r_ptr->flags3 & flg3) ||
- (o_ptr->art_name))
+ /* Acquire the monster name */
+ monster_desc(m_name, m_ptr, 0x04);
+
+ /* React to objects that hurt the monster */
+ monster_race_flag_set flg;
+ if (flags & TR_KILL_DEMON) flg |= RF_DEMON;
+ if (flags & TR_KILL_UNDEAD) flg |= RF_UNDEAD;
+ if (flags & TR_SLAY_DRAGON) flg |= RF_DRAGON;
+ if (flags & TR_SLAY_TROLL) flg |= RF_TROLL;
+ if (flags & TR_SLAY_GIANT) flg |= RF_GIANT;
+ if (flags & TR_SLAY_ORC) flg |= RF_ORC;
+ if (flags & TR_SLAY_DEMON) flg |= RF_DEMON;
+ if (flags & TR_SLAY_UNDEAD) flg |= RF_UNDEAD;
+ if (flags & TR_SLAY_ANIMAL) flg |= RF_ANIMAL;
+ if (flags & TR_SLAY_EVIL) flg |= RF_EVIL;
+
+ /* The object cannot be picked up by the monster */
+ if (artifact_p(o_ptr) || (r_ptr->flags & flg))
+ {
+ /* Only give a message for "take_item" */
+ if (r_ptr->flags & RF_TAKE_ITEM)
{
- /* Only give a message for "take_item" */
- if (r_ptr->flags2 & (RF2_TAKE_ITEM))
+ /* Describe observable situations */
+ if (m_ptr->ml && player_has_los_bold(ny, nx))
{
- /* Take note */
- did_take_item = TRUE;
-
- /* Describe observable situations */
- if (m_ptr->ml && player_has_los_bold(ny, nx))
- {
- /* Dump a message */
- msg_format("%^s tries to pick up %s, but fails.",
- m_name, o_name);
- }
+ /* Dump a message */
+ msg_format("%^s tries to pick up %s, but fails.",
+ m_name, o_name);
}
}
+ }
- /* Pick up the item */
- else if (r_ptr->flags2 & (RF2_TAKE_ITEM))
+ /* Pick up the item */
+ else if (r_ptr->flags & RF_TAKE_ITEM)
+ {
+ /* Describe observable situations */
+ if (player_has_los_bold(ny, nx))
{
- /* Take note */
- did_take_item = TRUE;
-
- /* Describe observable situations */
- if (player_has_los_bold(ny, nx))
- {
- /* Dump a message */
- msg_format("%^s picks up %s.", m_name, o_name);
- }
+ /* Dump a message */
+ msg_format("%^s picks up %s.", m_name, o_name);
+ }
- /* Put into inventory of monster */
- {
- /* Excise the object */
- excise_object_idx(this_o_idx);
+ /* Put into inventory of monster */
+ {
+ /* Excise the object */
+ excise_object_idx(this_o_idx);
- /* Forget mark */
- o_ptr->marked = FALSE;
+ /* Forget mark */
+ o_ptr->marked = FALSE;
- /* Forget location */
- o_ptr->iy = o_ptr->ix = 0;
+ /* Forget location */
+ o_ptr->iy = o_ptr->ix = 0;
- /* Memorize monster */
- o_ptr->held_m_idx = m_idx;
+ /* Memorize monster */
+ o_ptr->held_m_idx = m_idx;
- /* Carry object */
- m_ptr->hold_o_idxs.push_back(this_o_idx);
- }
+ /* Carry object */
+ m_ptr->hold_o_idxs.push_back(this_o_idx);
}
+ }
- /* Destroy the item */
- else
+ /* Destroy the item */
+ else
+ {
+ /* Describe observable situations */
+ if (player_has_los_bold(ny, nx))
{
- /* Take note */
- did_kill_item = TRUE;
-
- /* Describe observable situations */
- if (player_has_los_bold(ny, nx))
- {
- /* Dump a message */
- msg_format("%^s crushes %s.", m_name, o_name);
- }
-
- /* Delete the object */
- delete_object_idx(this_o_idx);
+ /* Dump a message */
+ msg_format("%^s crushes %s.", m_name, o_name);
}
+
+ /* Delete the object */
+ delete_object_idx(this_o_idx);
}
}
}
/* Update monster light */
- if (r_ptr->flags9 & RF9_HAS_LITE) p_ptr->update |= (PU_MON_LITE);
+ if (r_ptr->flags & RF_HAS_LITE) p_ptr->update |= (PU_MON_LITE);
}
/* Stop when done */
@@ -7134,35 +6269,6 @@ static void process_monster(int m_idx, bool_ is_frien)
}
- /* Learn things from observable monster */
- if (m_ptr->ml)
- {
- /* Monster opened a door */
- if (did_open_door) r_ptr->r_flags2 |= (RF2_OPEN_DOOR);
-
- /* Monster bashed a door */
- if (did_bash_door) r_ptr->r_flags2 |= (RF2_BASH_DOOR);
-
- /* Monster tried to pick something up */
- if (did_take_item) r_ptr->r_flags2 |= (RF2_TAKE_ITEM);
-
- /* Monster tried to crush something */
- if (did_kill_item) r_ptr->r_flags2 |= (RF2_KILL_ITEM);
-
- /* Monster pushed past another monster */
- if (did_move_body) r_ptr->r_flags2 |= (RF2_MOVE_BODY);
-
- /* Monster ate another monster */
- if (did_kill_body) r_ptr->r_flags2 |= (RF2_KILL_BODY);
-
- /* Monster passed through a wall */
- if (did_pass_wall) r_ptr->r_flags2 |= (RF2_PASS_WALL);
-
- /* Monster destroyed a wall */
- if (did_kill_wall) r_ptr->r_flags2 |= (RF2_KILL_WALL);
- }
-
-
/* Hack -- get "bold" if out of options */
if (!do_turn && !do_move && m_ptr->monfear)
{
@@ -7259,8 +6365,10 @@ void summon_maint(int m_idx)
* changes (flags, attacks, spells), we induce a redraw of the monster
* recall window.
*/
-void process_monsters(void)
+void process_monsters()
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, e;
int fx, fy;
@@ -7269,56 +6377,10 @@ void process_monsters(void)
monster_type *m_ptr;
- int old_monster_race_idx;
-
- u32b old_r_flags1 = 0L;
- u32b old_r_flags2 = 0L;
- u32b old_r_flags3 = 0L;
- u32b old_r_flags4 = 0L;
- u32b old_r_flags5 = 0L;
- u32b old_r_flags6 = 0L;
-
- byte old_r_blows0 = 0;
- byte old_r_blows1 = 0;
- byte old_r_blows2 = 0;
- byte old_r_blows3 = 0;
-
- byte old_r_cast_inate = 0;
- byte old_r_cast_spell = 0;
-
/* Check the doppleganger */
- if (doppleganger && !(r_info[m_list[doppleganger].r_idx].flags9 & RF9_DOPPLEGANGER))
+ if (doppleganger && !(r_info[m_list[doppleganger].r_idx].flags & RF_DOPPLEGANGER))
doppleganger = 0;
- /* Memorize old race */
- old_monster_race_idx = monster_race_idx;
-
- /* Acquire knowledge */
- if (monster_race_idx)
- {
- /* Acquire current monster */
- monster_race *r_ptr = &r_info[monster_race_idx];
-
- /* Memorize flags */
- old_r_flags1 = r_ptr->r_flags1;
- old_r_flags2 = r_ptr->r_flags2;
- old_r_flags3 = r_ptr->r_flags3;
- old_r_flags4 = r_ptr->r_flags4;
- old_r_flags5 = r_ptr->r_flags5;
- old_r_flags6 = r_ptr->r_flags6;
-
- /* Memorize blows */
- old_r_blows0 = r_ptr->r_blows[0];
- old_r_blows1 = r_ptr->r_blows[1];
- old_r_blows2 = r_ptr->r_blows[2];
- old_r_blows3 = r_ptr->r_blows[3];
-
- /* Memorize castings */
- old_r_cast_inate = r_ptr->r_cast_inate;
- old_r_cast_spell = r_ptr->r_cast_spell;
- }
-
-
/* Hack -- calculate the "player noise" */
noise = (1L << (30 - p_ptr->skill_stl));
@@ -7411,7 +6473,7 @@ void process_monsters(void)
/* Hack -- Monsters can "smell" the player from far away */
/* Note that most monsters have "aaf" of "20" or so */
- else if (flow_by_sound &&
+ else if (options->flow_by_sound &&
(cave[p_ptr->py][p_ptr->px].when == cave[fy][fx].when) &&
(cave[fy][fx].cost < MONSTER_FLOW_DEPTH) &&
(cave[fy][fx].cost < r_ptr->aaf))
@@ -7446,30 +6508,4 @@ void process_monsters(void)
/* Reset global index */
hack_m_idx = 0;
-
-
- /* Tracking a monster race (the same one we were before) */
- if (monster_race_idx && (monster_race_idx == old_monster_race_idx))
- {
- /* Acquire monster race */
- monster_race *r_ptr = &r_info[monster_race_idx];
-
- /* Check for knowledge change */
- if ((old_r_flags1 != r_ptr->r_flags1) ||
- (old_r_flags2 != r_ptr->r_flags2) ||
- (old_r_flags3 != r_ptr->r_flags3) ||
- (old_r_flags4 != r_ptr->r_flags4) ||
- (old_r_flags5 != r_ptr->r_flags5) ||
- (old_r_flags6 != r_ptr->r_flags6) ||
- (old_r_blows0 != r_ptr->r_blows[0]) ||
- (old_r_blows1 != r_ptr->r_blows[1]) ||
- (old_r_blows2 != r_ptr->r_blows[2]) ||
- (old_r_blows3 != r_ptr->r_blows[3]) ||
- (old_r_cast_inate != r_ptr->r_cast_inate) ||
- (old_r_cast_spell != r_ptr->r_cast_spell))
- {
- /* Window stuff */
- p_ptr->window |= (PW_MONSTER);
- }
- }
}
diff --git a/src/melee2.hpp b/src/melee2.hpp
index fece0564..d5106850 100644
--- a/src/melee2.hpp
+++ b/src/melee2.hpp
@@ -4,9 +4,9 @@
#include "monster_type_fwd.hpp"
extern int monst_spell_monst_spell;
-extern bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note);
-extern void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear);
-extern int check_hit2(int power, int level, int ac);
-extern void process_monsters(void);
-extern void curse_equipment(int chance, int heavy_chance);
-extern void curse_equipment_dg(int chance, int heavy_chance);
+bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note);
+void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear);
+int check_hit2(int power, int level, int ac);
+void process_monsters();
+void curse_equipment(int chance, int heavy_chance);
+void curse_equipment_dg(int chance, int heavy_chance);
diff --git a/src/message.cc b/src/message.cc
new file mode 100644
index 00000000..a0f46f22
--- /dev/null
+++ b/src/message.cc
@@ -0,0 +1,15 @@
+#include "message.hpp"
+
+#include <fmt/format.h>
+
+std::string message::text_with_count() const
+{
+ if (count > 1)
+ {
+ return fmt::format("{} <{}x>", text, count);
+ }
+ else
+ {
+ return text;
+ }
+}
diff --git a/src/message.hpp b/src/message.hpp
new file mode 100644
index 00000000..7b47a9db
--- /dev/null
+++ b/src/message.hpp
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "h-basic.h"
+
+#include <string>
+
+/**
+ * Message
+ */
+struct message {
+ /**
+ * Message color.
+ */
+ byte color = 0;
+
+ /**
+ * Repetation count for this message.
+ */
+ u32b count = 0;
+
+ /**
+ * Message text.
+ */
+ std::string text;
+
+ /**
+ * Get message text with count
+ */
+ std::string text_with_count() const;
+
+};
diff --git a/src/messages.cc b/src/messages.cc
index a4ce949d..071dc66e 100644
--- a/src/messages.cc
+++ b/src/messages.cc
@@ -1,368 +1,53 @@
#include "messages.hpp"
-#include "tome/make_array.hpp"
+#include "game.hpp"
-#include "z-term.h"
-#include "z-form.h"
-#include "z-util.h"
+#include <fmt/format.h>
+#include <string>
-/*
- * OPTION: Maximum number of messages to remember (see "io.c")
- * Default: assume maximal memorization of 2048 total messages
- */
-#define MESSAGE_MAX 2048
-
-/*
- * OPTION: Maximum space for the message text buffer (see "io.c")
- * Default: assume that each of the 2048 messages is repeated an
- * average of three times, and has an average length of 48
- */
-#define MESSAGE_BUF 32768
-
-
-
-
-/*
- * The next "free" index to use
- */
-static u16b message__next;
-
-/*
- * The index of the oldest message (none yet)
- */
-static u16b message__last;
-
-/*
- * The next "free" offset
- */
-static u16b message__head;
-
-/*
- * The offset to the oldest used char (none yet)
- */
-static u16b message__tail;
-
-/*
- * The array of offsets, by index [MESSAGE_MAX]
- */
-static u16b *message__ptr;
-
-/*
- * The array of colors, by index [MESSAGE_MAX]
- */
-static byte *message__color;
-
-/*
- * The array of message counts, by index [MESSAGE_MAX]
- */
-static u16b *message__count;
-
-/*
- * The array of chars, by offset [MESSAGE_BUF]
- */
-static char *message__buf;
-
-
-/*
-* Second try for the "message" handling routines.
-*
-* Each call to "message_add(s)" will add a new "most recent" message
-* to the "message recall list", using the contents of the string "s".
-*
-* The messages will be stored in such a way as to maximize "efficiency",
-* that is, we attempt to maximize the number of sequential messages that
-* can be retrieved, given a limited amount of storage space.
-*
-* We keep a buffer of chars to hold the "text" of the messages, not
-* necessarily in "order", and an array of offsets into that buffer,
-* representing the actual messages. This is made more complicated
-* by the fact that both the array of indexes, and the buffer itself,
-* are both treated as "circular arrays" for efficiency purposes, but
-* the strings may not be "broken" across the ends of the array.
-*
-* The "message_add()" function is rather "complex", because it must be
-* extremely efficient, both in space and time, for use with the Borg.
-*/
-
-void message_init()
+s16b Messages::size() const
{
- /* Message variables */
- message__ptr = make_array<u16b>(MESSAGE_MAX);
- message__color = make_array<byte>(MESSAGE_MAX);
- message__count = make_array<u16b>(MESSAGE_MAX);
- message__buf = make_array<char>(MESSAGE_BUF);
-
- /* Hack -- No messages yet */
- message__tail = MESSAGE_BUF;
+ return buffer.size();
}
-/*
-* How many messages are "available"?
-*/
-s16b message_num(void)
+message const &Messages::at(int age) const
{
- int last, next, n;
-
- /* Extract the indexes */
- last = message__last;
- next = message__next;
+ assert(age >= 0);
+ assert(age < size());
- /* Handle "wrap" */
- if (next < last) next += MESSAGE_MAX;
+ // Age indexes backward through history and is zero-based, so...
+ std::size_t i = buffer.size() - 1 - age;
- /* Extract the space */
- n = (next - last);
-
- /* Return the result */
- return (n);
+ // Get the message
+ return buffer.at(i);
}
-
-
-/*
-* Recall the "text" of a saved message
-*/
-cptr message_str(int age)
+void Messages::add(cptr msg, byte color)
{
- static char buf[1024];
- s16b x;
- s16b o;
- cptr s;
-
- /* Forgotten messages have no text */
- if ((age < 0) || (age >= message_num())) return ("");
-
- /* Acquire the "logical" index */
- x = (message__next + MESSAGE_MAX - (age + 1)) % MESSAGE_MAX;
-
- /* Get the "offset" for the message */
- o = message__ptr[x];
-
- /* Access the message text */
- s = &message__buf[o];
-
- /* Hack -- Handle repeated messages */
- if (message__count[x] > 1)
- {
- strnfmt(buf, 1024, "%s <%dx>", s, message__count[x]);
- s = buf;
- }
-
- /* Return the message text */
- return (s);
+ assert(msg != nullptr);
+ add(std::string(msg), color);
}
-/*
-* Recall the color of a saved message
-*/
-byte message_color(int age)
+void Messages::add(std::string const &msg, byte color)
{
- s16b x;
- byte color = TERM_WHITE;
-
- /* Forgotten messages have no text */
- if ((age < 0) || (age >= message_num())) return (TERM_WHITE);
-
- /* Acquire the "logical" index */
- x = (message__next + MESSAGE_MAX - (age + 1)) % MESSAGE_MAX;
-
- /* Get the "offset" for the message */
- color = message__color[x];
-
- /* Return the message text */
- return (color);
-}
-
-
-/*
-* Add a new message, with great efficiency
-*/
-void message_add(cptr str, byte color)
-{
- int i, k, x, n;
- cptr s;
-
-
- /*** Step 1 -- Analyze the message ***/
-
- /* Hack -- Ignore "non-messages" */
- if (!str) return;
-
- /* Message length */
- n = strlen(str);
-
- /* Important Hack -- Ignore "long" messages */
- if (n >= MESSAGE_BUF / 4) return;
-
-
- /*** Step 2 -- Handle repeated messages ***/
-
- /* Acquire the "logical" last index */
- x = (message__next + MESSAGE_MAX - 1) % MESSAGE_MAX;
-
- /* Get the last message text */
- s = &message__buf[message__ptr[x]];
-
- /* Last message repeated? */
- if (streq(str, s))
+ // If the message is the same as the last message,
+ // we just increment the counter instead of adding
+ // the message.
+ if ((!buffer.empty()) && (buffer.back().text == msg))
{
- /* Increase the message count */
- message__count[x]++;
-
- /* Success */
+ buffer.back().count += 1;
return;
}
+ // Push onto the end of the buffer.
+ message message;
+ message.color = color;
+ message.count = 1;
+ message.text = msg;
+ buffer.push_back(message);
+}
- /*** Step 3 -- Attempt to optimize ***/
-
- /* Limit number of messages to check */
- k = message_num() / 4;
-
- /* Limit number of messages to check */
- if (k > MESSAGE_MAX / 32) k = MESSAGE_MAX / 32;
-
- /* Check the last few messages (if any to count) */
- for (i = message__next; k; k--)
- {
- u16b q;
-
- cptr old;
-
- /* Back up and wrap if needed */
- if (i-- == 0) i = MESSAGE_MAX - 1;
-
- /* Stop before oldest message */
- if (i == message__last) break;
-
- /* Extract "distance" from "head" */
- q = (message__head + MESSAGE_BUF - message__ptr[i]) % MESSAGE_BUF;
-
- /* Do not optimize over large distance */
- if (q > MESSAGE_BUF / 2) continue;
-
- /* Access the old string */
- old = &message__buf[message__ptr[i]];
-
- /* Compare */
- if (!streq(old, str)) continue;
-
- /* Get the next message index, advance */
- x = message__next++;
-
- /* Handle wrap */
- if (message__next == MESSAGE_MAX) message__next = 0;
-
- /* Kill last message if needed */
- if (message__next == message__last) message__last++;
-
- /* Handle wrap */
- if (message__last == MESSAGE_MAX) message__last = 0;
-
- /* Assign the starting address */
- message__ptr[x] = message__ptr[i];
- message__color[x] = color;
- message__count[x] = 1;
-
- /* Success */
- return;
- }
-
-
- /*** Step 4 -- Ensure space before end of buffer ***/
-
- /* Kill messages and Wrap if needed */
- if (message__head + n + 1 >= MESSAGE_BUF)
- {
- /* Kill all "dead" messages */
- for (i = message__last; TRUE; i++)
- {
- /* Wrap if needed */
- if (i == MESSAGE_MAX) i = 0;
-
- /* Stop before the new message */
- if (i == message__next) break;
-
- /* Kill "dead" messages */
- if (message__ptr[i] >= message__head)
- {
- /* Track oldest message */
- message__last = i + 1;
- }
- }
-
- /* Wrap "tail" if needed */
- if (message__tail >= message__head) message__tail = 0;
-
- /* Start over */
- message__head = 0;
- }
-
-
- /*** Step 5 -- Ensure space before next message ***/
-
- /* Kill messages if needed */
- if (message__head + n + 1 > message__tail)
- {
- /* Grab new "tail" */
- message__tail = message__head + n + 1;
-
- /* Advance tail while possible past first "nul" */
- while (message__buf[message__tail - 1]) message__tail++;
-
- /* Kill all "dead" messages */
- for (i = message__last; TRUE; i++)
- {
- /* Wrap if needed */
- if (i == MESSAGE_MAX) i = 0;
-
- /* Stop before the new message */
- if (i == message__next) break;
-
- /* Kill "dead" messages */
- if ((message__ptr[i] >= message__head) &&
- (message__ptr[i] < message__tail))
- {
- /* Track oldest message */
- message__last = i + 1;
- }
- }
- }
-
-
- /*** Step 6 -- Grab a new message index ***/
-
- /* Get the next message index, advance */
- x = message__next++;
-
- /* Handle wrap */
- if (message__next == MESSAGE_MAX) message__next = 0;
-
- /* Kill last message if needed */
- if (message__next == message__last) message__last++;
-
- /* Handle wrap */
- if (message__last == MESSAGE_MAX) message__last = 0;
-
-
-
- /*** Step 7 -- Insert the message text ***/
-
- /* Assign the starting address */
- message__ptr[x] = message__head;
- message__color[x] = color;
- message__count[x] = 1;
-
- /* Append the new part of the message */
- for (i = 0; i < n; i++)
- {
- /* Copy the message */
- message__buf[message__head + i] = str[i];
- }
-
- /* Terminate */
- message__buf[message__head + i] = '\0';
-
- /* Advance the "head" pointer */
- message__head += n + 1;
+void Messages::add(message const &m)
+{
+ buffer.push_back(m);
}
diff --git a/src/messages.hpp b/src/messages.hpp
index 22943ab9..0443a6c8 100644
--- a/src/messages.hpp
+++ b/src/messages.hpp
@@ -1,9 +1,56 @@
#pragma once
#include "h-basic.h"
+#include "message.hpp"
-void message_init();
-s16b message_num();
-cptr message_str(int age);
-byte message_color(int age);
-void message_add(cptr msg, byte color);
+#include <boost/circular_buffer.hpp>
+
+/**
+ * Game message buffer
+ */
+class Messages final {
+
+private:
+ boost::circular_buffer<message> buffer;
+
+public:
+
+ /**
+ * Create message buffer with space for given
+ * number of messages.
+ */
+ explicit Messages(std::size_t n)
+ : buffer(n)
+ {
+ }
+
+ /**
+ * Get the current number of messages.
+ */
+ s16b size() const;
+
+ /**
+ * Get message of given age. Age must be
+ * in the half-open interval [0, message_num).
+ *
+ * The reference is only valid as long as
+ * no messages are added.
+ */
+ message const &at(int age) const;
+
+ /**
+ * Add a message.
+ */
+ void add(cptr msg, byte color);
+
+ /**
+ * Add a message.
+ */
+ void add(std::string const &msg, byte color);
+
+ /**
+ * Add a message.
+ */
+ void add(message const &);
+
+};
diff --git a/src/meta_class_type.hpp b/src/meta_class_type.hpp
deleted file mode 100644
index e74e75b3..00000000
--- a/src/meta_class_type.hpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-
-struct meta_class_type
-{
- char name[80]; /* Name */
- byte color;
- s16b *classes; /* list of classes */
-};
diff --git a/src/meta_class_type_fwd.hpp b/src/meta_class_type_fwd.hpp
deleted file mode 100644
index 2d0e482a..00000000
--- a/src/meta_class_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct meta_class_type;
diff --git a/src/mimic.cc b/src/mimic.cc
index edf79f4b..6ce7b180 100644
--- a/src/mimic.cc
+++ b/src/mimic.cc
@@ -1,5 +1,7 @@
#include "mimic.hpp"
+#include "game.hpp"
+#include "object_flag.hpp"
#include "player_type.hpp"
#include "skill_type.hpp"
#include "stats.hpp"
@@ -37,8 +39,8 @@ struct mimic_form_type
static s32b abomination_calc()
{
- apply_flags(TR1_SPEED + TR1_STR + TR1_INT + TR1_WIS + TR1_DEX + TR1_CON + TR1_CHR, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0);
- p_ptr->xtra_f3 |= TR3_AGGRAVATE;
+ apply_flags(TR_SPEED | TR_STR | TR_INT | TR_WIS | TR_DEX | TR_CON | TR_CHR, -10, 0, 0, 0, 0);
+ p_ptr->xtra_flags |= TR_AGGRAVATE;
return 0;
}
@@ -89,23 +91,23 @@ static s32b eagle_calc()
if (p_ptr->mimic_level >= 20)
{
- p_ptr->xtra_f4 |= TR4_FLY;
- p_ptr->xtra_f3 |= TR3_SEE_INVIS;
+ p_ptr->xtra_flags |= TR_FLY;
+ p_ptr->xtra_flags |= TR_SEE_INVIS;
}
if (p_ptr->mimic_level >= 25)
{
- p_ptr->xtra_f2 |= TR2_FREE_ACT;
+ p_ptr->xtra_flags |= TR_FREE_ACT;
}
if (p_ptr->mimic_level >= 30)
{
- p_ptr->xtra_f2 |= TR2_RES_ELEC;
+ p_ptr->xtra_flags |= TR_RES_ELEC;
}
if (p_ptr->mimic_level >= 35)
{
- p_ptr->xtra_f3 |= TR3_SH_ELEC;
+ p_ptr->xtra_flags |= TR_SH_ELEC;
}
return 0;
@@ -120,27 +122,27 @@ static s32b wolf_calc()
p_ptr->pspeed = p_ptr->pspeed + 10 + (p_ptr->mimic_level / 5);
- p_ptr->xtra_f2 |= TR2_FREE_ACT;
- p_ptr->xtra_f2 |= TR2_RES_FEAR;
+ p_ptr->xtra_flags |= TR_FREE_ACT;
+ p_ptr->xtra_flags |= TR_RES_FEAR;
if (p_ptr->mimic_level >= 10)
{
- p_ptr->xtra_f2 |= TR2_RES_COLD;
+ p_ptr->xtra_flags |= TR_RES_COLD;
}
if (p_ptr->mimic_level >= 15)
{
- p_ptr->xtra_f3 |= TR3_SEE_INVIS;
+ p_ptr->xtra_flags |= TR_SEE_INVIS;
}
if (p_ptr->mimic_level >= 30)
{
- p_ptr->xtra_f2 |= TR2_RES_DARK;
+ p_ptr->xtra_flags |= TR_RES_DARK;
}
if (p_ptr->mimic_level >= 35)
{
- p_ptr->xtra_f2 |= TR2_RES_CONF;
+ p_ptr->xtra_flags |= TR_RES_CONF;
}
return 0;
@@ -157,13 +159,13 @@ static s32b spider_calc()
p_ptr->pspeed = p_ptr->pspeed + 5;
- p_ptr->xtra_f2 |= TR2_RES_POIS;
- p_ptr->xtra_f2 |= TR2_RES_FEAR;
- p_ptr->xtra_f2 |= TR2_RES_DARK;
+ p_ptr->xtra_flags |= TR_RES_POIS;
+ p_ptr->xtra_flags |= TR_RES_FEAR;
+ p_ptr->xtra_flags |= TR_RES_DARK;
if (p_ptr->mimic_level >= 40)
{
- p_ptr->xtra_f4 |= TR4_CLIMB;
+ p_ptr->xtra_flags |= TR_CLIMB;
}
return 0;
@@ -191,12 +193,12 @@ static s32b ent_calc()
p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 5;
p_ptr->stat_add[A_CHR] += -7;
- p_ptr->xtra_f2 |= TR2_RES_POIS;
- p_ptr->xtra_f2 |= TR2_RES_COLD;
- p_ptr->xtra_f2 |= TR2_FREE_ACT;
- p_ptr->xtra_f3 |= TR3_REGEN;
- p_ptr->xtra_f3 |= TR3_SEE_INVIS;
- p_ptr->xtra_f2 |= TR2_SENS_FIRE;
+ p_ptr->xtra_flags |= TR_RES_POIS;
+ p_ptr->xtra_flags |= TR_RES_COLD;
+ p_ptr->xtra_flags |= TR_FREE_ACT;
+ p_ptr->xtra_flags |= TR_REGEN;
+ p_ptr->xtra_flags |= TR_SEE_INVIS;
+ p_ptr->xtra_flags |= TR_SENS_FIRE;
return 0;
}
@@ -226,14 +228,14 @@ static s32b vapour_calc()
/* But they are stealthy */
p_ptr->skill_stl = p_ptr->skill_stl + 10 + (p_ptr->mimic_level / 5);
- p_ptr->xtra_f2 |= TR2_RES_POIS;
- p_ptr->xtra_f2 |= TR2_RES_SHARDS;
- p_ptr->xtra_f2 |= TR2_IM_COLD;
- p_ptr->xtra_f2 |= TR2_FREE_ACT;
- p_ptr->xtra_f3 |= TR3_REGEN;
- p_ptr->xtra_f3 |= TR3_SEE_INVIS;
- p_ptr->xtra_f2 |= TR2_SENS_FIRE;
- p_ptr->xtra_f3 |= TR3_FEATHER;
+ p_ptr->xtra_flags |= TR_RES_POIS;
+ p_ptr->xtra_flags |= TR_RES_SHARDS;
+ p_ptr->xtra_flags |= TR_IM_COLD;
+ p_ptr->xtra_flags |= TR_FREE_ACT;
+ p_ptr->xtra_flags |= TR_REGEN;
+ p_ptr->xtra_flags |= TR_SEE_INVIS;
+ p_ptr->xtra_flags |= TR_SENS_FIRE;
+ p_ptr->xtra_flags |= TR_FEATHER;
return 0;
}
@@ -252,10 +254,10 @@ static s32b serpent_calc()
p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 7;
p_ptr->stat_add[A_CHR] += -6;
- p_ptr->xtra_f2 |= TR2_RES_POIS;
+ p_ptr->xtra_flags |= TR_RES_POIS;
if (p_ptr->mimic_level >= 25)
{
- p_ptr->xtra_f2 |= TR2_FREE_ACT;
+ p_ptr->xtra_flags |= TR_FREE_ACT;
}
return 0;
@@ -279,22 +281,22 @@ static s32b mumak_calc()
if (p_ptr->mimic_level >= 10)
{
- p_ptr->xtra_f2 |= TR2_RES_FEAR;
+ p_ptr->xtra_flags |= TR_RES_FEAR;
}
if (p_ptr->mimic_level >= 25)
{
- p_ptr->xtra_f2 |= TR2_RES_CONF;
+ p_ptr->xtra_flags |= TR_RES_CONF;
}
if (p_ptr->mimic_level >= 30)
{
- p_ptr->xtra_f2 |= TR2_FREE_ACT;
+ p_ptr->xtra_flags |= TR_FREE_ACT;
}
if (p_ptr->mimic_level >= 35)
{
- p_ptr->xtra_f2 |= TR2_RES_NEXUS;
+ p_ptr->xtra_flags |= TR_RES_NEXUS;
}
return 0;
@@ -302,6 +304,8 @@ static s32b mumak_calc()
static s32b bear_calc()
{
+ auto &s_info = game->s_info;
+
p_ptr->pspeed = p_ptr->pspeed - 5 + (p_ptr->mimic_level / 5);
p_ptr->to_a = p_ptr->to_a + 5 + ((p_ptr->mimic_level * 2) / 3);
@@ -316,26 +320,26 @@ static s32b bear_calc()
if (p_ptr->mimic_level >= 10)
{
- p_ptr->xtra_f2 |= TR2_FREE_ACT;
+ p_ptr->xtra_flags |= TR_FREE_ACT;
}
if (p_ptr->mimic_level >= 20)
{
- p_ptr->xtra_f3 |= TR3_REGEN;
+ p_ptr->xtra_flags |= TR_REGEN;
}
if (p_ptr->mimic_level >= 30)
{
- p_ptr->xtra_f2 |= TR2_RES_CONF;
+ p_ptr->xtra_flags |= TR_RES_CONF;
}
if (p_ptr->mimic_level >= 35)
{
- p_ptr->xtra_f2 |= TR2_RES_NEXUS;
+ p_ptr->xtra_flags |= TR_RES_NEXUS;
}
/* activate the skill */
- s_info[SKILL_BEAR].hidden = FALSE;
+ s_info[SKILL_BEAR].hidden = false;
return 0;
}
@@ -349,17 +353,17 @@ static s32b balrog_calc()
p_ptr->stat_add[A_CON] += 5 + p_ptr->mimic_level / 5;
p_ptr->stat_add[A_CHR] += - ( 5 + p_ptr->mimic_level / 10);
- p_ptr->xtra_f2 |= TR2_IM_ACID;
- p_ptr->xtra_f2 |= TR2_IM_FIRE;
- p_ptr->xtra_f2 |= TR2_IM_ELEC;
- p_ptr->xtra_f2 |= TR2_RES_DARK;
- p_ptr->xtra_f2 |= TR2_RES_CHAOS;
- p_ptr->xtra_f2 |= TR2_RES_POIS;
- p_ptr->xtra_f2 |= TR2_HOLD_LIFE;
- p_ptr->xtra_f3 |= TR3_FEATHER;
- p_ptr->xtra_f3 |= TR3_REGEN;
- p_ptr->xtra_f3 |= TR3_SH_FIRE;
- p_ptr->xtra_f3 |= TR3_LITE1;
+ p_ptr->xtra_flags |= TR_IM_ACID;
+ p_ptr->xtra_flags |= TR_IM_FIRE;
+ p_ptr->xtra_flags |= TR_IM_ELEC;
+ p_ptr->xtra_flags |= TR_RES_DARK;
+ p_ptr->xtra_flags |= TR_RES_CHAOS;
+ p_ptr->xtra_flags |= TR_RES_POIS;
+ p_ptr->xtra_flags |= TR_HOLD_LIFE;
+ p_ptr->xtra_flags |= TR_FEATHER;
+ p_ptr->xtra_flags |= TR_REGEN;
+ p_ptr->xtra_flags |= TR_SH_FIRE;
+ p_ptr->xtra_flags |= TR_LITE1;
return 1; /* Adds a blow */
}
@@ -373,17 +377,17 @@ static s32b maia_calc()
p_ptr->stat_add[A_CON] += 5 + p_ptr->mimic_level / 5;
p_ptr->stat_add[A_CHR] += 5 + p_ptr->mimic_level / 5;
- p_ptr->xtra_f2 |= TR2_IM_FIRE;
- p_ptr->xtra_f2 |= TR2_IM_ELEC;
- p_ptr->xtra_f2 |= TR2_IM_ACID;
- p_ptr->xtra_f2 |= TR2_IM_COLD;
- p_ptr->xtra_f2 |= TR2_RES_POIS;
- p_ptr->xtra_f2 |= TR2_RES_LITE;
- p_ptr->xtra_f2 |= TR2_RES_DARK;
- p_ptr->xtra_f2 |= TR2_RES_CHAOS;
- p_ptr->xtra_f2 |= TR2_HOLD_LIFE;
- p_ptr->xtra_f3 |= TR3_FEATHER;
- p_ptr->xtra_f3 |= TR3_REGEN;
+ p_ptr->xtra_flags |= TR_IM_FIRE;
+ p_ptr->xtra_flags |= TR_IM_ELEC;
+ p_ptr->xtra_flags |= TR_IM_ACID;
+ p_ptr->xtra_flags |= TR_IM_COLD;
+ p_ptr->xtra_flags |= TR_RES_POIS;
+ p_ptr->xtra_flags |= TR_RES_LITE;
+ p_ptr->xtra_flags |= TR_RES_DARK;
+ p_ptr->xtra_flags |= TR_RES_CHAOS;
+ p_ptr->xtra_flags |= TR_HOLD_LIFE;
+ p_ptr->xtra_flags |= TR_FEATHER;
+ p_ptr->xtra_flags |= TR_REGEN;
return 2; /* Add two blows */
}
@@ -394,10 +398,10 @@ static s32b fire_elemental_calc()
p_ptr->stat_add[A_DEX] += 5 + (p_ptr->mimic_level / 5);
p_ptr->stat_add[A_WIS] += -5 - (p_ptr->mimic_level / 5);
- p_ptr->xtra_f2 |= TR2_IM_FIRE;
- p_ptr->xtra_f2 |= TR2_RES_POIS;
- p_ptr->xtra_f3 |= TR3_SH_FIRE;
- p_ptr->xtra_f3 |= TR3_LITE1;
+ p_ptr->xtra_flags |= TR_IM_FIRE;
+ p_ptr->xtra_flags |= TR_RES_POIS;
+ p_ptr->xtra_flags |= TR_SH_FIRE;
+ p_ptr->xtra_flags |= TR_LITE1;
return 0;
}
@@ -588,11 +592,9 @@ static mimic_form_type mimic_forms[MIMIC_FORMS_MAX] =
/*
* Is the mimicry form enabled for the current module?
*/
-static bool_ mimic_form_enabled(mimic_form_type *f)
+static bool mimic_form_enabled(mimic_form_type const *f)
{
- int i;
-
- for (i = 0; f->modules[i] >= 0; i++)
+ for (int i = 0; f->modules[i] >= 0; i++)
{
if (f->modules[i] == game_module_idx)
{
@@ -618,11 +620,9 @@ static mimic_form_type *get_mimic_form(int mf_idx)
*/
s16b resolve_mimic_name(cptr name)
{
- s16b i;
-
- for (i = 0; i < MIMIC_FORMS_MAX; i++)
+ for (s16b i = 0; i < MIMIC_FORMS_MAX; i++)
{
- mimic_form_type *mf_ptr = get_mimic_form(i);
+ auto const mf_ptr = get_mimic_form(i);
if (mimic_form_enabled(mf_ptr) && streq(mf_ptr->name, name))
{
return i;
@@ -641,13 +641,10 @@ s16b find_random_mimic_shape(byte level, bool_ limit)
while (tries > 0)
{
- int mf_idx = 0;
- mimic_form_type *mf_ptr = NULL;
-
tries = tries - 1;
- mf_idx = rand_int(MIMIC_FORMS_MAX);
- mf_ptr = get_mimic_form(mf_idx);
+ int mf_idx = rand_int(MIMIC_FORMS_MAX);
+ auto const mf_ptr = get_mimic_form(mf_idx);
if (mimic_form_enabled(mf_ptr))
{
@@ -695,7 +692,7 @@ byte get_mimic_level(s16b mf_idx)
*/
s32b get_mimic_random_duration(s16b mf_idx)
{
- mimic_form_type *mf_ptr = get_mimic_form(mf_idx);
+ auto const mf_ptr = get_mimic_form(mf_idx);
return rand_range(mf_ptr->duration.min, mf_ptr->duration.max);
}
@@ -704,7 +701,7 @@ s32b get_mimic_random_duration(s16b mf_idx)
*/
byte calc_mimic()
{
- mimic_form_type *mf_ptr = get_mimic_form(p_ptr->mimic_form);
+ auto const mf_ptr = get_mimic_form(p_ptr->mimic_form);
if (mf_ptr->calc != NULL)
{
return mf_ptr->calc();
diff --git a/src/mimic.hpp b/src/mimic.hpp
index d9c8f3bd..4ce9a6e8 100644
--- a/src/mimic.hpp
+++ b/src/mimic.hpp
@@ -1,10 +1,10 @@
#include "h-basic.h"
-extern s16b resolve_mimic_name(cptr name);
-extern s16b find_random_mimic_shape(byte level, bool_ limit);
-extern cptr get_mimic_name(s16b mf_idx);
-extern cptr get_mimic_object_name(s16b mf_idx);
-extern byte get_mimic_level(s16b mf_idx);
-extern s32b get_mimic_random_duration(s16b mf_idx);
-extern byte calc_mimic();
-extern void calc_mimic_power();
+s16b resolve_mimic_name(cptr name);
+s16b find_random_mimic_shape(byte level, bool_ limit);
+cptr get_mimic_name(s16b mf_idx);
+cptr get_mimic_object_name(s16b mf_idx);
+byte get_mimic_level(s16b mf_idx);
+s32b get_mimic_random_duration(s16b mf_idx);
+byte calc_mimic();
+void calc_mimic_power();
diff --git a/src/module_type.hpp b/src/module_type.hpp
index 96938856..1b75d84c 100644
--- a/src/module_type.hpp
+++ b/src/module_type.hpp
@@ -42,9 +42,6 @@ struct module_type
s32b jewelry_chance;
} randarts;
- /* Max player level. */
- int max_plev;
-
/* Skills */
struct {
/* Skill points per level */
diff --git a/src/modules.cc b/src/modules.cc
index c5d065f4..de9ad1ad 100644
--- a/src/modules.cc
+++ b/src/modules.cc
@@ -7,7 +7,6 @@
*/
#include "modules.hpp"
-#include "modules.h"
#include "birth.hpp"
#include "cave.hpp"
@@ -25,6 +24,7 @@
#include "lua_bind.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object2.hpp"
#include "object_type.hpp"
@@ -195,8 +195,6 @@ static void activate_module(int module_idx)
game_module_idx = module_idx;
/* Do misc inits */
- max_plev = module_ptr->max_plev;
-
RANDART_WEAPON = module_ptr->randarts.weapon_chance;
RANDART_ARMOR = module_ptr->randarts.armor_chance;
RANDART_JEWEL = module_ptr->randarts.jewelry_chance;
@@ -204,9 +202,6 @@ static void activate_module(int module_idx)
VERSION_MAJOR = module_ptr->meta.version.major;
VERSION_MINOR = module_ptr->meta.version.minor;
VERSION_PATCH = module_ptr->meta.version.patch;
- version_major = VERSION_MAJOR;
- version_minor = VERSION_MINOR;
- version_patch = VERSION_PATCH;
/* Change window name if needed */
if (strcmp(game_module, "ToME"))
@@ -237,9 +232,9 @@ static void init_module(module_type *module_ptr)
}
}
-bool_ module_savefile_loadable(cptr savefile_mod)
+bool module_savefile_loadable(std::string const &tag)
{
- return (strcmp(savefile_mod, modules[game_module_idx].meta.save_file_tag) == 0);
+ return tag == modules[game_module_idx].meta.save_file_tag;
}
/* Did the player force a module on command line */
@@ -562,7 +557,7 @@ exit:
screen_load();
}
-static bool_ auto_stat_gain_hook(void *data, void *in, void *out)
+static bool auto_stat_gain_hook(void *data, void *in, void *out)
{
while (p_ptr->last_rewarded_level * 5 <= p_ptr->lev)
{
@@ -576,10 +571,10 @@ static bool_ auto_stat_gain_hook(void *data, void *in, void *out)
p_ptr->last_rewarded_level += 1;
}
- return FALSE;
+ return false;
}
-static bool_ drunk_takes_wine(void *data, void *in_, void *out)
+static bool drunk_takes_wine(void *, void *in_, void *)
{
hook_give_in *in = (hook_give_in *) in_;
monster_type *m_ptr = &m_list[in->m_idx];
@@ -609,7 +604,7 @@ static bool_ drunk_takes_wine(void *data, void *in_, void *out)
}
}
-static bool_ hobbit_food(void *data, void *in_, void *out)
+static bool hobbit_food(void *, void *in_, void *)
{
hook_give_in *in = (hook_give_in *) in_;
monster_type *m_ptr = &m_list[in->m_idx];
@@ -622,15 +617,15 @@ static bool_ hobbit_food(void *data, void *in_, void *out)
inc_stack_size_ex(in->item, -1, OPTIMIZE, NO_DESCRIBE);
- return TRUE;
+ return true;
}
else
{
- return FALSE;
+ return false;
}
}
-static bool_ smeagol_ring(void *data, void *in_, void *out)
+static bool smeagol_ring(void *data, void *in_, void *out)
{
hook_give_in *in = (hook_give_in *) in_;
monster_type *m_ptr = &m_list[in->m_idx];
@@ -643,15 +638,15 @@ static bool_ smeagol_ring(void *data, void *in_, void *out)
inc_stack_size_ex(in->item, -1, OPTIMIZE, NO_DESCRIBE);
- return TRUE;
+ return true;
}
else
{
- return FALSE;
+ return false;
}
}
-static bool_ longbottom_leaf(void *data, void *in_, void *out_)
+static bool longbottom_leaf(void *, void *in_, void *)
{
hook_eat_in *in = (hook_eat_in *) in_;
@@ -660,13 +655,13 @@ static bool_ longbottom_leaf(void *data, void *in_, void *out_)
{
msg_print("What a stress reliever!");
heal_insanity(1000);
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-static bool_ food_vessel(void *data, void *in_, void *out)
+static bool food_vessel(void *, void *in_, void *ut)
{
hook_eat_in *in = (hook_eat_in *) in_;
@@ -680,16 +675,16 @@ static bool_ food_vessel(void *data, void *in_, void *out)
forge.ident |= IDENT_MENTAL | IDENT_KNOWN;
inven_carry(&forge, FALSE);
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
/*
* Player must have appropriate keys to enter Erebor.
*/
-static bool_ erebor_stair(void *data, void *in_, void *out_)
+static bool erebor_stair(void *, void *in_, void *out_)
{
hook_stair_in *in = (hook_stair_in *) in_;
hook_stair_out *out = (hook_stair_out *) out_;
@@ -724,13 +719,13 @@ static bool_ erebor_stair(void *data, void *in_, void *out_)
}
}
- return FALSE;
+ return false;
}
/*
* Orthanc requires a key.
*/
-static bool_ orthanc_stair(void *data, void *in_, void *out_)
+static bool orthanc_stair(void *, void *in_, void *out_)
{
hook_stair_in *in = (hook_stair_in *) in_;
hook_stair_out *out = (hook_stair_out *) out_;
@@ -762,13 +757,13 @@ static bool_ orthanc_stair(void *data, void *in_, void *out_)
}
}
- return FALSE;
+ return false;
}
/*
* Movement from Theme
*/
-static bool_ theme_push_past(void *data, void *in_, void *out_)
+static bool theme_push_past(void *data, void *in_, void *out_)
{
hook_move_in *p = (hook_move_in *) in_;
cave_type *c_ptr = &cave[p->y][p->x];
@@ -781,7 +776,7 @@ static bool_ theme_push_past(void *data, void *in_, void *out_)
if (m_ptr->status >= MSTATUS_NEUTRAL)
{
if (cave_floor_bold(p->y, p->x) ||
- (mr_ptr->flags2 == RF2_PASS_WALL))
+ (mr_ptr->flags == RF_PASS_WALL))
{
char buf[128];
@@ -801,19 +796,19 @@ static bool_ theme_push_past(void *data, void *in_, void *out_)
msg_print(format("%s is in your way!", buf));
energy_use = 0;
- return TRUE;
+ return true;
}
}
}
- return FALSE;
+ return false;
}
/*
* Check if monster race is in list. The list is terminated
* with a -1.
*/
-static bool_ race_in_list(int r_idx, int race_idxs[])
+static bool race_in_list(int r_idx, int race_idxs[])
{
int i;
@@ -821,11 +816,11 @@ static bool_ race_in_list(int r_idx, int race_idxs[])
{
if (r_idx == race_idxs[i])
{
- return TRUE;
+ return true;
}
}
- return FALSE;
+ return false;
}
/*
@@ -1160,11 +1155,9 @@ s16b *theme_race_status(int r_idx)
return NULL;
}
-static bool_ theme_level_end_gen(void *data, void *in, void *out)
+static bool theme_level_end_gen(void *, void *, void *)
{
- int i = 0;
-
- for (i = 0; i < m_max; i++)
+ for (int i = 0; i < m_max; i++)
{
monster_type *m_ptr = &m_list[i];
int r_idx = m_ptr->r_idx;
@@ -1175,10 +1168,10 @@ static bool_ theme_level_end_gen(void *data, void *in, void *out)
}
}
- return FALSE;
+ return false;
}
-static bool_ theme_new_monster_end(void *data, void *in_, void *out)
+static bool theme_new_monster_end(void *, void *in_, void *)
{
hook_new_monster_end_in *in = (hook_new_monster_end_in *) in_;
s16b *status = theme_race_status(in->m_ptr->r_idx);
@@ -1188,7 +1181,7 @@ static bool_ theme_new_monster_end(void *data, void *in_, void *out)
in->m_ptr->status = *status;
}
- return FALSE;
+ return false;
}
void init_hooks_module()
diff --git a/src/modules.h b/src/modules.h
deleted file mode 100644
index 8a3b88b0..00000000
--- a/src/modules.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-
-// C linkage required for these functions since main-* code uses them.
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern bool_ private_check_user_directory(cptr dirpath);
-extern cptr force_module;
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
diff --git a/src/modules.hpp b/src/modules.hpp
index d83e3e2e..867955c9 100644
--- a/src/modules.hpp
+++ b/src/modules.hpp
@@ -1,11 +1,14 @@
#pragma once
#include "h-basic.h"
+#include <string>
-extern bool_ select_module(void);
-extern bool_ module_savefile_loadable(cptr savefile_mod);
-extern void tome_intro();
-extern void theme_intro();
-extern s16b *theme_race_status(int r_idx);
-extern void init_hooks_module();
-extern int find_module(cptr name);
+bool_ select_module();
+bool module_savefile_loadable(std::string const &savefile_mod);
+void tome_intro();
+void theme_intro();
+s16b *theme_race_status(int r_idx);
+void init_hooks_module();
+int find_module(cptr name);
+bool_ private_check_user_directory(cptr dirpath);
+extern cptr force_module;
diff --git a/src/monoid.hpp b/src/monoid.hpp
new file mode 100644
index 00000000..465e58af
--- /dev/null
+++ b/src/monoid.hpp
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <numeric>
+#include <vector>
+
+/**
+ * A monoid is an algebraic structure with a single associative
+ * binary operation ('append') and an identity element ('empty').
+ *
+ * See https://en.wikipedia.org/wiki/Monoid
+ *
+ * Shamelessly adapted from:
+ *
+ * https://gist.github.com/evincarofautumn/2b5f004ca81e33c62ff0
+ */
+template<typename T, T append_(T const&, T const&), const T &empty_>
+struct monoid {
+ /* Access the type the monoid operates on */
+ typedef T type;
+
+ /* Append two T's */
+ static T append(T const& a, T const& b) {
+ return append_(a, b);
+ }
+
+ /* The value of an empty T */
+ static constexpr T empty = empty_;
+};
+
+/**
+ * mconcat :: (Monoid m mappend) -> [m] -> m
+ * mconcat = fold mappend mempty
+ */
+template<typename M>
+typename M::type mconcat(const std::vector<typename M::type>& xs) {
+ return std::accumulate(std::begin(xs), std::end(xs), M::empty, M::append);
+}
diff --git a/src/monster1.cc b/src/monster1.cc
index 4e3e2c42..50c8c548 100644
--- a/src/monster1.cc
+++ b/src/monster1.cc
@@ -9,9 +9,12 @@
#include "monster1.hpp"
#include "cave_type.hpp"
+#include "game.hpp"
#include "monster2.hpp"
#include "monster_ego.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "player_type.hpp"
#include "util.hpp"
#include "variable.hpp"
@@ -33,63 +36,6 @@ static cptr wd_his[3] = { "its", "his", "her" };
-
-
-
-/*
- * Determine if the "armor" is known
- * The higher the level, the fewer kills needed.
- */
-static bool_ know_armour(std::shared_ptr<monster_race const> r_ptr)
-{
- s32b level = r_ptr->level;
-
- s32b kills = r_ptr->r_tkills;
-
- /* Normal monsters */
- if (kills > 304 / (4 + level)) return (TRUE);
-
- /* Skip non-uniques */
- if (!(r_ptr->flags1 & (RF1_UNIQUE))) return (FALSE);
-
- /* Unique monsters */
- if (kills > 304 / (38 + (5*level) / 4)) return (TRUE);
-
- /* Assume false */
- return (FALSE);
-}
-
-
-/*
- * Determine if the "damage" of the given attack is known
- * the higher the level of the monster, the fewer the attacks you need,
- * the more damage an attack does, the more attacks you need
- */
-static bool_ know_damage(std::shared_ptr<monster_race const> r_ptr, int i)
-{
- s32b level = r_ptr->level;
-
- s32b a = r_ptr->r_blows[i];
-
- s32b d1 = r_ptr->blow[i].d_dice;
- s32b d2 = r_ptr->blow[i].d_side;
-
- s32b d = d1 * d2;
-
- /* Normal monsters */
- if ((4 + level) * a > 80 * d) return (TRUE);
-
- /* Skip non-uniques */
- if (!(r_ptr->flags1 & (RF1_UNIQUE))) return (FALSE);
-
- /* Unique monsters */
- if ((4 + level) * (2 * a) > 80 * d) return (TRUE);
-
- /* Assume false */
- return (FALSE);
-}
-
-
/*
* Hack -- display monster information using "text_out()"
*
@@ -102,7 +48,7 @@ static bool_ know_damage(std::shared_ptr<monster_race const> r_ptr, int i)
* left edge of the screen, on a cleared line, in which the recall is
* to take place. One extra blank line is left after the recall.
*/
-static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
+static void roff_aux(std::shared_ptr<monster_race const> r_ptr)
{
bool_ old = FALSE;
bool_ sin = FALSE;
@@ -111,194 +57,37 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
cptr p, q;
- int msex = 0;
-
bool_ breath = FALSE;
bool_ magic = FALSE;
- u32b flags1;
- u32b flags2;
- u32b flags3;
- u32b flags4;
- u32b flags5;
- u32b flags6;
- u32b flags7;
- u32b flags9;
-
int vn = 0;
byte color[64];
cptr vp[64];
- monster_race save_mem;
+ /* Shorthand */
+ auto const flags = r_ptr->flags;
+ monster_spell_flag_set spells = r_ptr->spells;
- /* Cheat -- Know everything */
- if (cheat_know)
+ /* Extract a gender (if applicable) */
+ int msex = 0;
+ if (flags & RF_FEMALE)
{
- /* XXX XXX XXX */
-
- /* Save the "old" memory */
- save_mem = *r_ptr;
-
- /* Hack -- Maximal kills */
- r_ptr->r_tkills = MAX_SHORT;
-
- /* Hack -- Maximal info */
- r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
-
- /* Observe "maximal" attacks */
- for (m = 0; m < 4; m++)
- {
- /* Examine "actual" blows */
- if (r_ptr->blow[m].effect || r_ptr->blow[m].method)
- {
- /* Hack -- maximal observations */
- r_ptr->r_blows[m] = MAX_UCHAR;
- }
- }
-
- /* Hack -- maximal drops */
- r_ptr->r_drop_gold = r_ptr->r_drop_item =
- (((r_ptr->flags1 & (RF1_DROP_4D2)) ? 8 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_3D2)) ? 6 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_2D2)) ? 4 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_1D2)) ? 2 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_90)) ? 1 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_60)) ? 1 : 0));
-
- /* Hack -- but only "valid" drops */
- if (r_ptr->flags1 & (RF1_ONLY_GOLD)) r_ptr->r_drop_item = 0;
- if (r_ptr->flags1 & (RF1_ONLY_ITEM)) r_ptr->r_drop_gold = 0;
-
- /* Hack -- observe many spells */
- r_ptr->r_cast_inate = MAX_UCHAR;
- r_ptr->r_cast_spell = MAX_UCHAR;
-
- /* Hack -- know all the flags */
- r_ptr->r_flags1 = r_ptr->flags1;
- r_ptr->r_flags2 = r_ptr->flags2;
- r_ptr->r_flags3 = r_ptr->flags3;
- r_ptr->r_flags4 = r_ptr->flags4;
- r_ptr->r_flags5 = r_ptr->flags5;
- r_ptr->r_flags6 = r_ptr->flags6;
- r_ptr->r_flags7 = r_ptr->flags7;
- r_ptr->r_flags8 = r_ptr->flags8;
- r_ptr->r_flags9 = r_ptr->flags9;
+ msex = 2;
}
-
-
- /* Extract a gender (if applicable) */
- if (r_ptr->flags1 & (RF1_FEMALE)) msex = 2;
- else if (r_ptr->flags1 & (RF1_MALE)) msex = 1;
-
-
- /* Obtain a copy of the "known" flags */
- flags1 = (r_ptr->flags1 & r_ptr->r_flags1);
- flags2 = (r_ptr->flags2 & r_ptr->r_flags2);
- flags3 = (r_ptr->flags3 & r_ptr->r_flags3);
- flags4 = (r_ptr->flags4 & r_ptr->r_flags4);
- flags5 = (r_ptr->flags5 & r_ptr->r_flags5);
- flags6 = (r_ptr->flags6 & r_ptr->r_flags6);
- flags7 = (r_ptr->flags7 & r_ptr->r_flags7);
- flags9 = (r_ptr->flags9 & r_ptr->r_flags9);
-
-
- /* Assume some "obvious" flags */
- if (r_ptr->flags1 & (RF1_UNIQUE)) flags1 |= (RF1_UNIQUE);
- if (r_ptr->flags1 & (RF1_MALE)) flags1 |= (RF1_MALE);
- if (r_ptr->flags1 & (RF1_FEMALE)) flags1 |= (RF1_FEMALE);
-
- /* Assume some "creation" flags */
- if (r_ptr->flags1 & (RF1_FRIEND)) flags1 |= (RF1_FRIEND);
- if (r_ptr->flags1 & (RF1_FRIENDS)) flags1 |= (RF1_FRIENDS);
- if (r_ptr->flags1 & (RF1_ESCORT)) flags1 |= (RF1_ESCORT);
- if (r_ptr->flags1 & (RF1_ESCORTS)) flags1 |= (RF1_ESCORTS);
-
- /* Killing a monster reveals some properties */
- if (r_ptr->r_tkills)
- {
- /* Know "race" flags */
- if (r_ptr->flags3 & (RF3_ORC)) flags3 |= (RF3_ORC);
- if (r_ptr->flags3 & (RF3_TROLL)) flags3 |= (RF3_TROLL);
- if (r_ptr->flags3 & (RF3_GIANT)) flags3 |= (RF3_GIANT);
- if (r_ptr->flags3 & (RF3_DRAGON)) flags3 |= (RF3_DRAGON);
- if (r_ptr->flags3 & (RF3_DEMON)) flags3 |= (RF3_DEMON);
- if (r_ptr->flags3 & (RF3_UNDEAD)) flags3 |= (RF3_UNDEAD);
- if (r_ptr->flags3 & (RF3_EVIL)) flags3 |= (RF3_EVIL);
- if (r_ptr->flags3 & (RF3_GOOD)) flags3 |= (RF3_GOOD);
- if (r_ptr->flags3 & (RF3_ANIMAL)) flags3 |= (RF3_ANIMAL);
- if (r_ptr->flags3 & (RF3_THUNDERLORD)) flags3 |= (RF3_THUNDERLORD);
- if (r_ptr->flags7 & (RF7_SPIDER)) flags7 |= (RF7_SPIDER);
-
- /* Know "forced" flags */
- if (r_ptr->flags1 & (RF1_FORCE_DEPTH)) flags1 |= (RF1_FORCE_DEPTH);
- if (r_ptr->flags1 & (RF1_FORCE_MAXHP)) flags1 |= (RF1_FORCE_MAXHP);
+ else if (flags & RF_MALE)
+ {
+ msex = 1;
}
-
/* Treat uniques differently */
- if (flags1 & (RF1_UNIQUE))
+ if (flags & RF_UNIQUE)
{
- /* Hack -- Determine if the unique is "dead" */
- bool_ dead = (r_ptr->max_num == 0) ? TRUE : FALSE;
-
- /* We've been killed... */
- if (r_ptr->r_deaths)
- {
- /* Killed ancestors */
- text_out(format("%^s has slain %d of your ancestors",
- wd_he[msex], r_ptr->r_deaths));
-
- /* But we've also killed it */
- if (dead)
- {
- text_out(format(", but you have avenged them! ") );
- }
-
- /* Unavenged (ever) */
- else
- {
- text_out(format(", who %s unavenged. ",
- plural(r_ptr->r_deaths, "remains", "remain")));
- }
- }
-
- /* Dead unique who never hurt us */
- else if (dead)
+ if (r_ptr->max_num == 0)
{
text_out("You have slain this foe. ");
}
}
- /* Not unique, but killed us */
- else if (r_ptr->r_deaths)
- {
- /* Dead ancestors */
- text_out(format("%d of your ancestors %s been killed by this creature, ",
- r_ptr->r_deaths, plural(r_ptr->r_deaths, "has", "have")));
-
- /* Some kills this life */
- if (r_ptr->r_pkills)
- {
- text_out("and you have exterminated at least ");
- text_out_c(TERM_L_GREEN, format("%d", r_ptr->r_pkills));
- text_out(" of the creatures. ");
- }
-
- /* Some kills past lives */
- else if (r_ptr->r_tkills)
- {
- text_out(format("and %s have exterminated at least %d of the creatures. ",
- "your ancestors", r_ptr->r_tkills));
- }
-
- /* No kills */
- else
- {
- text_out(format("and %s is not ever known to have been defeated. ",
- wd_he[msex]));
- }
- }
-
/* Normal monsters */
else
{
@@ -310,13 +99,6 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
text_out(" of these creatures. ");
}
- /* Killed some last life */
- else if (r_ptr->r_tkills)
- {
- text_out(format("Your ancestors have killed at least %d of these creatures. ",
- r_ptr->r_tkills));
- }
-
/* Killed none */
else
{
@@ -327,13 +109,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Descriptions */
{
- char buf[2048];
-
- /* Simple method */
- strcpy(buf, r_ptr->text);
-
- /* Dump it */
- text_out(buf);
+ text_out(r_ptr->text);
text_out(" ");
}
@@ -342,7 +118,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
old = FALSE;
/* Describe location */
- if (r_ptr->flags7 & RF7_PET)
+ if (r_ptr->flags & RF_PET)
{
text_out(format("%^s is ", wd_he[msex]));
text_out_c(TERM_L_BLUE, "friendly");
@@ -360,7 +136,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
text_out_c(TERM_L_GREEN, "lives in the town or the wilderness");
old = TRUE;
}
- else if (r_ptr->r_tkills)
+ else
{
if (old)
text_out(", ");
@@ -382,7 +158,6 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Describe movement */
- if (TRUE)
{
/* Introduction */
if (old)
@@ -397,18 +172,18 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
text_out("moves");
/* Random-ness */
- if ((flags1 & (RF1_RAND_50)) || (flags1 & (RF1_RAND_25)))
+ if ((flags & RF_RAND_50) || (flags & RF_RAND_25))
{
/* Adverb */
- if ((flags1 & (RF1_RAND_50)) && (flags1 & (RF1_RAND_25)))
+ if ((flags & RF_RAND_50) && (flags & RF_RAND_25))
{
text_out(" extremely");
}
- else if (flags1 & (RF1_RAND_50))
+ else if (flags & RF_RAND_50)
{
text_out(" somewhat");
}
- else if (flags1 & (RF1_RAND_25))
+ else if (flags & RF_RAND_25)
{
text_out(" a bit");
}
@@ -440,7 +215,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
}
/* The code above includes "attack speed" */
- if (flags1 & (RF1_NEVER_MOVE))
+ if (flags & RF_NEVER_MOVE)
{
/* Introduce */
if (old)
@@ -466,10 +241,9 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Describe experience if known */
- if (r_ptr->r_tkills)
{
/* Introduction */
- if (flags1 & (RF1_UNIQUE))
+ if (flags & RF_UNIQUE)
{
text_out("Killing this");
}
@@ -479,21 +253,21 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
}
/* Describe the "quality" */
- if (flags2 & (RF2_ELDRITCH_HORROR)) text_out_c(TERM_VIOLET, " sanity-blasting");
- if (flags3 & (RF3_ANIMAL)) text_out_c(TERM_VIOLET, " natural");
- if (flags3 & (RF3_EVIL)) text_out_c(TERM_VIOLET, " evil");
- if (flags3 & (RF3_GOOD)) text_out_c(TERM_VIOLET, " good");
- if (flags3 & (RF3_UNDEAD)) text_out_c(TERM_VIOLET, " undead");
+ if (flags & RF_ELDRITCH_HORROR) text_out_c(TERM_VIOLET, " sanity-blasting");
+ if (flags & RF_ANIMAL) text_out_c(TERM_VIOLET, " natural");
+ if (flags & RF_EVIL) text_out_c(TERM_VIOLET, " evil");
+ if (flags & RF_GOOD) text_out_c(TERM_VIOLET, " good");
+ if (flags & RF_UNDEAD) text_out_c(TERM_VIOLET, " undead");
/* Describe the "race" */
- if (flags3 & (RF3_DRAGON)) text_out_c(TERM_VIOLET, " dragon");
- else if (flags3 & (RF3_DEMON)) text_out_c(TERM_VIOLET, " demon");
- else if (flags3 & (RF3_GIANT)) text_out_c(TERM_VIOLET, " giant");
- else if (flags3 & (RF3_TROLL)) text_out_c(TERM_VIOLET, " troll");
- else if (flags3 & (RF3_ORC)) text_out_c(TERM_VIOLET, " orc");
- else if (flags3 & (RF3_THUNDERLORD))text_out_c(TERM_VIOLET, " Thunderlord");
- else if (flags7 & (RF7_SPIDER)) text_out_c(TERM_VIOLET, " spider");
- else if (flags7 & (RF7_NAZGUL)) text_out_c(TERM_VIOLET, " Nazgul");
+ if (flags & RF_DRAGON) text_out_c(TERM_VIOLET, " dragon");
+ else if (flags & RF_DEMON) text_out_c(TERM_VIOLET, " demon");
+ else if (flags & RF_GIANT) text_out_c(TERM_VIOLET, " giant");
+ else if (flags & RF_TROLL) text_out_c(TERM_VIOLET, " troll");
+ else if (flags & RF_ORC) text_out_c(TERM_VIOLET, " orc");
+ else if (flags & RF_THUNDERLORD)text_out_c(TERM_VIOLET, " Thunderlord");
+ else if (flags & RF_SPIDER) text_out_c(TERM_VIOLET, " spider");
+ else if (flags & RF_NAZGUL) text_out_c(TERM_VIOLET, " Nazgul");
else text_out(" creature");
/* Group some variables */
@@ -534,26 +308,26 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
}
}
- if ((flags2 & (RF2_AURA_FIRE)) && (flags2 & (RF2_AURA_ELEC)))
+ if ((flags & RF_AURA_FIRE) && (flags & RF_AURA_ELEC))
{
text_out(format("%^s is surrounded by ", wd_he[msex]));
text_out_c(TERM_VIOLET, "flames and electricity");
text_out(". ");
}
- else if (flags2 & (RF2_AURA_FIRE))
+ else if (flags & RF_AURA_FIRE)
{
text_out(format("%^s is surrounded by ", wd_he[msex]));
text_out_c(TERM_ORANGE, "flames");
text_out(". ");
}
- else if (flags2 & (RF2_AURA_ELEC))
+ else if (flags & RF_AURA_ELEC)
{
text_out(format("%^s is surrounded by ", wd_he[msex]));
text_out_c(TERM_L_BLUE, "electricity");
text_out(". ");
}
- if (flags2 & (RF2_REFLECTING))
+ if (flags & RF_REFLECTING)
{
text_out(format("%^s ", wd_he[msex]));
text_out_c(TERM_L_UMBER, "reflects");
@@ -562,14 +336,14 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Describe escorts */
- if ((flags1 & (RF1_ESCORT)) || (flags1 & (RF1_ESCORTS)))
+ if ((flags & RF_ESCORT) || (flags & RF_ESCORTS))
{
text_out(format("%^s usually appears with escorts. ",
wd_he[msex]));
}
/* Describe friends */
- else if ((flags1 & (RF1_FRIEND)) || (flags1 & (RF1_FRIENDS)))
+ else if ((flags & RF_FRIEND) || (flags & RF_FRIENDS))
{
text_out(format("%^s usually appears in groups. ",
wd_he[msex]));
@@ -578,12 +352,12 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect inate attacks */
vn = 0;
- if (flags4 & (RF4_SHRIEK)) vp[vn++] = "shriek for help";
- if (flags4 & (RF4_ROCKET)) vp[vn++] = "shoot a rocket";
- if (flags4 & (RF4_ARROW_1)) vp[vn++] = "fire an arrow";
- if (flags4 & (RF4_ARROW_2)) vp[vn++] = "fire arrows";
- if (flags4 & (RF4_ARROW_3)) vp[vn++] = "fire a missile";
- if (flags4 & (RF4_ARROW_4)) vp[vn++] = "fire missiles";
+ if (spells & SF_SHRIEK) vp[vn++] = "shriek for help";
+ if (spells & SF_ROCKET) vp[vn++] = "shoot a rocket";
+ if (spells & SF_ARROW_1) vp[vn++] = "fire an arrow";
+ if (spells & SF_ARROW_2) vp[vn++] = "fire arrows";
+ if (spells & SF_ARROW_3) vp[vn++] = "fire a missile";
+ if (spells & SF_ARROW_4) vp[vn++] = "fire missiles";
/* Describe inate attacks */
if (vn)
@@ -610,28 +384,28 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect breaths */
vn = 0;
- if (flags4 & (RF4_BR_ACID)) vp[vn++] = "acid";
- if (flags4 & (RF4_BR_ELEC)) vp[vn++] = "lightning";
- if (flags4 & (RF4_BR_FIRE)) vp[vn++] = "fire";
- if (flags4 & (RF4_BR_COLD)) vp[vn++] = "frost";
- if (flags4 & (RF4_BR_POIS)) vp[vn++] = "poison";
- if (flags4 & (RF4_BR_NETH)) vp[vn++] = "nether";
- if (flags4 & (RF4_BR_LITE)) vp[vn++] = "light";
- if (flags4 & (RF4_BR_DARK)) vp[vn++] = "darkness";
- if (flags4 & (RF4_BR_CONF)) vp[vn++] = "confusion";
- if (flags4 & (RF4_BR_SOUN)) vp[vn++] = "sound";
- if (flags4 & (RF4_BR_CHAO)) vp[vn++] = "chaos";
- if (flags4 & (RF4_BR_DISE)) vp[vn++] = "disenchantment";
- if (flags4 & (RF4_BR_NEXU)) vp[vn++] = "nexus";
- if (flags4 & (RF4_BR_TIME)) vp[vn++] = "time";
- if (flags4 & (RF4_BR_INER)) vp[vn++] = "inertia";
- if (flags4 & (RF4_BR_GRAV)) vp[vn++] = "gravity";
- if (flags4 & (RF4_BR_SHAR)) vp[vn++] = "shards";
- if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma";
- if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force";
- if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana";
- if (flags4 & (RF4_BR_NUKE)) vp[vn++] = "toxic waste";
- if (flags4 & (RF4_BR_DISI)) vp[vn++] = "disintegration";
+ if (spells & SF_BR_ACID) vp[vn++] = "acid";
+ if (spells & SF_BR_ELEC) vp[vn++] = "lightning";
+ if (spells & SF_BR_FIRE) vp[vn++] = "fire";
+ if (spells & SF_BR_COLD) vp[vn++] = "frost";
+ if (spells & SF_BR_POIS) vp[vn++] = "poison";
+ if (spells & SF_BR_NETH) vp[vn++] = "nether";
+ if (spells & SF_BR_LITE) vp[vn++] = "light";
+ if (spells & SF_BR_DARK) vp[vn++] = "darkness";
+ if (spells & SF_BR_CONF) vp[vn++] = "confusion";
+ if (spells & SF_BR_SOUN) vp[vn++] = "sound";
+ if (spells & SF_BR_CHAO) vp[vn++] = "chaos";
+ if (spells & SF_BR_DISE) vp[vn++] = "disenchantment";
+ if (spells & SF_BR_NEXU) vp[vn++] = "nexus";
+ if (spells & SF_BR_TIME) vp[vn++] = "time";
+ if (spells & SF_BR_INER) vp[vn++] = "inertia";
+ if (spells & SF_BR_GRAV) vp[vn++] = "gravity";
+ if (spells & SF_BR_SHAR) vp[vn++] = "shards";
+ if (spells & SF_BR_PLAS) vp[vn++] = "plasma";
+ if (spells & SF_BR_WALL) vp[vn++] = "force";
+ if (spells & SF_BR_MANA) vp[vn++] = "mana";
+ if (spells & SF_BR_NUKE) vp[vn++] = "toxic waste";
+ if (spells & SF_BR_DISI) vp[vn++] = "disintegration";
/* Describe breaths */
if (vn)
@@ -658,73 +432,72 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect spells */
vn = 0;
- if (flags5 & (RF5_BA_ACID)) vp[vn++] = "produce acid balls";
- if (flags5 & (RF5_BA_ELEC)) vp[vn++] = "produce lightning balls";
- if (flags5 & (RF5_BA_FIRE)) vp[vn++] = "produce fire balls";
- if (flags5 & (RF5_BA_COLD)) vp[vn++] = "produce frost balls";
- if (flags5 & (RF5_BA_POIS)) vp[vn++] = "produce poison balls";
- if (flags5 & (RF5_BA_NETH)) vp[vn++] = "produce nether balls";
- if (flags5 & (RF5_BA_WATE)) vp[vn++] = "produce water balls";
- if (flags4 & (RF4_BA_NUKE)) vp[vn++] = "produce balls of radiation";
- if (flags5 & (RF5_BA_MANA)) vp[vn++] = "invoke mana storms";
- if (flags5 & (RF5_BA_DARK)) vp[vn++] = "invoke darkness storms";
- if (flags4 & (RF4_BA_CHAO)) vp[vn++] = "invoke raw chaos";
- if (flags6 & (RF6_HAND_DOOM)) vp[vn++] = "invoke the Hand of Doom";
- if (flags5 & (RF5_DRAIN_MANA)) vp[vn++] = "drain mana";
- if (flags5 & (RF5_MIND_BLAST)) vp[vn++] = "cause mind blasting";
- if (flags5 & (RF5_BRAIN_SMASH)) vp[vn++] = "cause brain smashing";
- if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "cause light wounds and cursing";
- if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing";
- if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing";
- if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "cause mortal wounds";
- if (flags5 & (RF5_BO_ACID)) vp[vn++] = "produce acid bolts";
- if (flags5 & (RF5_BO_ELEC)) vp[vn++] = "produce lightning bolts";
- if (flags5 & (RF5_BO_FIRE)) vp[vn++] = "produce fire bolts";
- if (flags5 & (RF5_BO_COLD)) vp[vn++] = "produce frost bolts";
- if (flags5 & (RF5_BO_POIS)) vp[vn++] = "produce poison bolts";
- if (flags5 & (RF5_BO_NETH)) vp[vn++] = "produce nether bolts";
- if (flags5 & (RF5_BO_WATE)) vp[vn++] = "produce water bolts";
- if (flags5 & (RF5_BO_MANA)) vp[vn++] = "produce mana bolts";
- if (flags5 & (RF5_BO_PLAS)) vp[vn++] = "produce plasma bolts";
- if (flags5 & (RF5_BO_ICEE)) vp[vn++] = "produce ice bolts";
- if (flags5 & (RF5_MISSILE)) vp[vn++] = "produce magic missiles";
- if (flags5 & (RF5_SCARE)) vp[vn++] = "terrify";
- if (flags5 & (RF5_BLIND)) vp[vn++] = "blind";
- if (flags5 & (RF5_CONF)) vp[vn++] = "confuse";
- if (flags5 & (RF5_SLOW)) vp[vn++] = "slow";
- if (flags5 & (RF5_HOLD)) vp[vn++] = "paralyze";
- if (flags6 & (RF6_HASTE)) vp[vn++] = "haste-self";
- if (flags6 & (RF6_HEAL)) vp[vn++] = "heal-self";
- if (flags6 & (RF6_BLINK)) vp[vn++] = "blink-self";
- if (flags6 & (RF6_TPORT)) vp[vn++] = "teleport-self";
- if (flags6 & (RF6_S_BUG)) vp[vn++] = "summon software bugs";
- if (flags6 & (RF6_S_RNG)) vp[vn++] = "summon RNG";
- if (flags6 & (RF6_TELE_TO)) vp[vn++] = "teleport to";
- if (flags6 & (RF6_TELE_AWAY)) vp[vn++] = "teleport away";
- if (flags6 & (RF6_TELE_LEVEL)) vp[vn++] = "teleport level";
- if (flags6 & (RF6_S_THUNDERLORD)) vp[vn++] = "summon a Thunderlord";
- if (flags6 & (RF6_DARKNESS)) vp[vn++] = "create darkness";
- if (flags6 & (RF6_TRAPS)) vp[vn++] = "create traps";
- if (flags6 & (RF6_FORGET)) vp[vn++] = "cause amnesia";
- if (flags6 & (RF6_RAISE_DEAD)) vp[vn++] = "raise dead";
- if (flags6 & (RF6_S_MONSTER)) vp[vn++] = "summon a monster";
- if (flags6 & (RF6_S_MONSTERS)) vp[vn++] = "summon monsters";
- if (flags6 & (RF6_S_KIN)) vp[vn++] = "summon aid";
- if (flags6 & (RF6_S_ANT)) vp[vn++] = "summon ants";
- if (flags6 & (RF6_S_SPIDER)) vp[vn++] = "summon spiders";
- if (flags6 & (RF6_S_HOUND)) vp[vn++] = "summon hounds";
- if (flags6 & (RF6_S_HYDRA)) vp[vn++] = "summon hydras";
- if (flags6 & (RF6_S_ANGEL)) vp[vn++] = "summon an angel";
- if (flags6 & (RF6_S_DEMON)) vp[vn++] = "summon a demon";
- if (flags6 & (RF6_S_UNDEAD)) vp[vn++] = "summon an undead";
- if (flags6 & (RF6_S_DRAGON)) vp[vn++] = "summon a dragon";
- if (flags4 & (RF4_S_ANIMAL)) vp[vn++] = "summon animal";
- if (flags6 & (RF6_S_ANIMALS)) vp[vn++] = "summon animals";
- if (flags6 & (RF6_S_HI_UNDEAD)) vp[vn++] = "summon Greater Undead";
- if (flags6 & (RF6_S_HI_DRAGON)) vp[vn++] = "summon Ancient Dragons";
- if (flags6 & (RF6_S_HI_DEMON)) vp[vn++] = "summon Greater Demons";
- if (flags6 & (RF6_S_WRAITH)) vp[vn++] = "summon Ringwraith";
- if (flags6 & (RF6_S_UNIQUE)) vp[vn++] = "summon Unique Monsters";
+ if (spells & SF_BA_ACID) vp[vn++] = "produce acid balls";
+ if (spells & SF_BA_ELEC) vp[vn++] = "produce lightning balls";
+ if (spells & SF_BA_FIRE) vp[vn++] = "produce fire balls";
+ if (spells & SF_BA_COLD) vp[vn++] = "produce frost balls";
+ if (spells & SF_BA_POIS) vp[vn++] = "produce poison balls";
+ if (spells & SF_BA_NETH) vp[vn++] = "produce nether balls";
+ if (spells & SF_BA_WATE) vp[vn++] = "produce water balls";
+ if (spells & SF_BA_NUKE) vp[vn++] = "produce balls of radiation";
+ if (spells & SF_BA_MANA) vp[vn++] = "invoke mana storms";
+ if (spells & SF_BA_DARK) vp[vn++] = "invoke darkness storms";
+ if (spells & SF_BA_CHAO) vp[vn++] = "invoke raw chaos";
+ if (spells & SF_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom";
+ if (spells & SF_DRAIN_MANA) vp[vn++] = "drain mana";
+ if (spells & SF_MIND_BLAST) vp[vn++] = "cause mind blasting";
+ if (spells & SF_BRAIN_SMASH) vp[vn++] = "cause brain smashing";
+ if (spells & (SF_CAUSE_1)) vp[vn++] = "cause light wounds and cursing";
+ if (spells & (SF_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing";
+ if (spells & (SF_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing";
+ if (spells & (SF_CAUSE_4)) vp[vn++] = "cause mortal wounds";
+ if (spells & SF_BO_ACID) vp[vn++] = "produce acid bolts";
+ if (spells & SF_BO_ELEC) vp[vn++] = "produce lightning bolts";
+ if (spells & SF_BO_FIRE) vp[vn++] = "produce fire bolts";
+ if (spells & SF_BO_COLD) vp[vn++] = "produce frost bolts";
+ if (spells & SF_BO_POIS) vp[vn++] = "produce poison bolts";
+ if (spells & SF_BO_NETH) vp[vn++] = "produce nether bolts";
+ if (spells & SF_BO_WATE) vp[vn++] = "produce water bolts";
+ if (spells & SF_BO_MANA) vp[vn++] = "produce mana bolts";
+ if (spells & SF_BO_PLAS) vp[vn++] = "produce plasma bolts";
+ if (spells & SF_BO_ICEE) vp[vn++] = "produce ice bolts";
+ if (spells & SF_MISSILE) vp[vn++] = "produce magic missiles";
+ if (spells & SF_SCARE) vp[vn++] = "terrify";
+ if (spells & SF_BLIND) vp[vn++] = "blind";
+ if (spells & SF_CONF) vp[vn++] = "confuse";
+ if (spells & SF_SLOW) vp[vn++] = "slow";
+ if (spells & SF_HOLD) vp[vn++] = "paralyze";
+ if (spells & SF_HASTE) vp[vn++] = "haste-self";
+ if (spells & SF_HEAL) vp[vn++] = "heal-self";
+ if (spells & SF_BLINK) vp[vn++] = "blink-self";
+ if (spells & SF_TPORT) vp[vn++] = "teleport-self";
+ if (spells & SF_S_BUG) vp[vn++] = "summon software bugs";
+ if (spells & SF_S_RNG) vp[vn++] = "summon RNG";
+ if (spells & SF_TELE_TO) vp[vn++] = "teleport to";
+ if (spells & SF_TELE_AWAY) vp[vn++] = "teleport away";
+ if (spells & SF_TELE_LEVEL) vp[vn++] = "teleport level";
+ if (spells & SF_S_THUNDERLORD) vp[vn++] = "summon a Thunderlord";
+ if (spells & SF_DARKNESS) vp[vn++] = "create darkness";
+ if (spells & SF_FORGET) vp[vn++] = "cause amnesia";
+ if (spells & SF_RAISE_DEAD) vp[vn++] = "raise dead";
+ if (spells & SF_S_MONSTER) vp[vn++] = "summon a monster";
+ if (spells & SF_S_MONSTERS) vp[vn++] = "summon monsters";
+ if (spells & SF_S_KIN) vp[vn++] = "summon aid";
+ if (spells & SF_S_ANT) vp[vn++] = "summon ants";
+ if (spells & SF_S_SPIDER) vp[vn++] = "summon spiders";
+ if (spells & SF_S_HOUND) vp[vn++] = "summon hounds";
+ if (spells & SF_S_HYDRA) vp[vn++] = "summon hydras";
+ if (spells & SF_S_ANGEL) vp[vn++] = "summon an angel";
+ if (spells & SF_S_DEMON) vp[vn++] = "summon a demon";
+ if (spells & SF_S_UNDEAD) vp[vn++] = "summon an undead";
+ if (spells & SF_S_DRAGON) vp[vn++] = "summon a dragon";
+ if (spells & SF_S_ANIMAL) vp[vn++] = "summon animal";
+ if (spells & SF_S_ANIMALS) vp[vn++] = "summon animals";
+ if (spells & SF_S_HI_UNDEAD) vp[vn++] = "summon Greater Undead";
+ if (spells & SF_S_HI_DRAGON) vp[vn++] = "summon Ancient Dragons";
+ if (spells & SF_S_HI_DEMON) vp[vn++] = "summon Greater Demons";
+ if (spells & SF_S_WRAITH) vp[vn++] = "summon Ringwraith";
+ if (spells & SF_S_UNIQUE) vp[vn++] = "summon Unique Monsters";
/* Describe spells */
if (vn)
@@ -746,7 +519,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
text_out(" magical, casting spells");
/* Adverb */
- if (flags2 & (RF2_SMART)) text_out_c(TERM_YELLOW, " intelligently");
+ if (flags & RF_SMART) text_out_c(TERM_YELLOW, " intelligently");
/* Scan */
for (n = 0; n < vn; n++)
@@ -765,30 +538,14 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* End the sentence about inate/other spells */
if (breath || magic)
{
- /* Total casting */
- m = r_ptr->r_cast_inate + r_ptr->r_cast_spell;
-
/* Average frequency */
n = (r_ptr->freq_inate + r_ptr->freq_spell) / 2;
/* Describe the spell frequency */
- if (m > 100)
- {
- text_out("; ");
- text_out_c(TERM_L_GREEN, "1");
- text_out(" time in ");
- text_out_c(TERM_L_GREEN, format("%d", 100 / n));
- }
-
- /* Guess at the frequency */
- else if (m)
- {
- n = ((n + 9) / 10) * 10;
- text_out("; about ");
- text_out_c(TERM_L_GREEN, "1");
- text_out(" time in ");
- text_out_c(TERM_L_GREEN, format("%d", 100 / n));
- }
+ text_out("; ");
+ text_out_c(TERM_L_GREEN, "1");
+ text_out(" time in ");
+ text_out_c(TERM_L_GREEN, format("%d", 100 / n));
/* End this sentence */
text_out(". ");
@@ -796,14 +553,13 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Describe monster "toughness" */
- if (know_armour(r_ptr))
{
/* Armor */
text_out(format("%^s has an armor rating of ", wd_he[msex]));
text_out_c(TERM_L_GREEN, format("%d", r_ptr->ac));
/* Maximized hitpoints */
- if (flags1 & (RF1_FORCE_MAXHP))
+ if (flags & RF_FORCE_MAXHP)
{
text_out(" and a life rating of ");
text_out_c(TERM_L_GREEN, format("%d", r_ptr->hdice * r_ptr->hside));
@@ -823,15 +579,15 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect special abilities. */
vn = 0;
- if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "open doors";
- if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "bash down doors";
- if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "pass through walls";
- if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "bore through walls";
- if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "push past weaker monsters";
- if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "destroy weaker monsters";
- if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "pick up objects";
- if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "destroy objects";
- if (flags9 & (RF9_HAS_LITE)) vp[vn++] = "illuminate the dungeon";
+ if (flags & RF_OPEN_DOOR) vp[vn++] = "open doors";
+ if (flags & RF_BASH_DOOR) vp[vn++] = "bash down doors";
+ if (flags & RF_PASS_WALL) vp[vn++] = "pass through walls";
+ if (flags & RF_KILL_WALL) vp[vn++] = "bore through walls";
+ if (flags & RF_MOVE_BODY) vp[vn++] = "push past weaker monsters";
+ if (flags & RF_KILL_BODY) vp[vn++] = "destroy weaker monsters";
+ if (flags & RF_TAKE_ITEM) vp[vn++] = "pick up objects";
+ if (flags & RF_KILL_ITEM) vp[vn++] = "destroy objects";
+ if (flags & RF_HAS_LITE) vp[vn++] = "illuminate the dungeon";
/* Describe special abilities. */
if (vn)
@@ -857,31 +613,32 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Describe special abilities. */
- if (flags2 & (RF2_INVISIBLE))
+ if (flags & RF_INVISIBLE)
{
text_out_c(TERM_GREEN, format("%^s is invisible. ", wd_he[msex]));
}
- if (flags2 & (RF2_COLD_BLOOD))
+ if (flags & RF_COLD_BLOOD)
{
text_out(format("%^s is cold blooded. ", wd_he[msex]));
}
- if (flags2 & (RF2_EMPTY_MIND))
+ if (flags & RF_EMPTY_MIND)
{
text_out(format("%^s is not detected by telepathy. ", wd_he[msex]));
}
- if (flags2 & (RF2_WEIRD_MIND))
+ if (flags & RF_WEIRD_MIND)
{
text_out(format("%^s is rarely detected by telepathy. ", wd_he[msex]));
}
- if (flags4 & (RF4_MULTIPLY))
+ if (spells & SF_MULTIPLY)
{
text_out_c(TERM_L_UMBER, format("%^s breeds explosively. ", wd_he[msex]));
}
- if (flags2 & (RF2_REGENERATE))
+ if (flags & RF_REGENERATE)
{
text_out_c(TERM_L_WHITE, format("%^s regenerates quickly. ", wd_he[msex]));
}
- if (r_ptr->flags7 & (RF7_MORTAL))
+
+ if (r_ptr->flags & RF_MORTAL)
{
text_out_c(TERM_RED, format("%^s is a mortal being. ", wd_he[msex]));
}
@@ -893,37 +650,37 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect susceptibilities */
vn = 0;
- if (flags3 & (RF3_HURT_ROCK))
+ if (flags & RF_HURT_ROCK)
{
vp[vn++] = "rock remover";
color[vn - 1] = TERM_UMBER;
}
- if (flags3 & (RF3_HURT_LITE))
+ if (flags & RF_HURT_LITE)
{
vp[vn++] = "bright light";
color[vn - 1] = TERM_YELLOW;
}
- if (flags3 & (RF3_SUSCEP_FIRE))
+ if (flags & RF_SUSCEP_FIRE)
{
vp[vn++] = "fire";
color[vn - 1] = TERM_RED;
}
- if (flags3 & (RF3_SUSCEP_COLD))
+ if (flags & RF_SUSCEP_COLD)
{
vp[vn++] = "cold";
color[vn - 1] = TERM_L_WHITE;
}
- if (flags9 & (RF9_SUSCEP_ACID))
+ if (flags & RF_SUSCEP_ACID)
{
vp[vn++] = "acid";
color[vn - 1] = TERM_GREEN;
}
- if (flags9 & (RF9_SUSCEP_ELEC))
+ if (flags & RF_SUSCEP_ELEC)
{
vp[vn++] = "lightning";
color[vn - 1] = TERM_L_BLUE;
}
- if (flags9 & (RF9_SUSCEP_POIS))
+ if (flags & RF_SUSCEP_POIS)
{
vp[vn++] = "poison";
color[vn - 1] = TERM_L_GREEN;
@@ -954,27 +711,27 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect immunities */
vn = 0;
- if (flags3 & (RF3_IM_ACID))
+ if (flags & RF_IM_ACID)
{
vp[vn++] = "acid";
color[vn - 1] = TERM_L_GREEN;
}
- if (flags3 & (RF3_IM_ELEC))
+ if (flags & RF_IM_ELEC)
{
vp[vn++] = "lightning";
color[vn - 1] = TERM_L_BLUE;
}
- if (flags3 & (RF3_IM_FIRE))
+ if (flags & RF_IM_FIRE)
{
vp[vn++] = "fire";
color[vn - 1] = TERM_L_RED;
}
- if (flags3 & (RF3_IM_COLD))
+ if (flags & RF_IM_COLD)
{
vp[vn++] = "cold";
color[vn - 1] = TERM_L_BLUE;
}
- if (flags3 & (RF3_IM_POIS))
+ if (flags & RF_IM_POIS)
{
vp[vn++] = "poison";
color[vn - 1] = TERM_L_GREEN;
@@ -1005,12 +762,12 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect resistances */
vn = 0;
- if (flags3 & (RF3_RES_NETH)) vp[vn++] = "nether";
- if (flags3 & (RF3_RES_WATE)) vp[vn++] = "water";
- if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma";
- if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus";
- if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment";
- if (flags3 & (RF3_RES_TELE)) vp[vn++] = "teleportation";
+ if (flags & RF_RES_NETH) vp[vn++] = "nether";
+ if (flags & RF_RES_WATE) vp[vn++] = "water";
+ if (flags & RF_RES_PLAS) vp[vn++] = "plasma";
+ if (flags & RF_RES_NEXU) vp[vn++] = "nexus";
+ if (flags & RF_RES_DISE) vp[vn++] = "disenchantment";
+ if (flags & RF_RES_TELE) vp[vn++] = "teleportation";
/* Describe resistances */
if (vn)
@@ -1037,10 +794,10 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Collect non-effects */
vn = 0;
- if (flags3 & (RF3_NO_STUN)) vp[vn++] = "stunned";
- if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened";
- if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused";
- if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept";
+ if (flags & RF_NO_STUN) vp[vn++] = "stunned";
+ if (flags & RF_NO_FEAR) vp[vn++] = "frightened";
+ if (flags & RF_NO_CONF) vp[vn++] = "confused";
+ if (flags & RF_NO_SLEEP) vp[vn++] = "slept";
/* Describe non-effects */
if (vn)
@@ -1065,10 +822,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
}
- /* Do we know how aware it is? */
- if (((static_cast<int>(r_ptr->r_wake) * static_cast<int>(r_ptr->r_wake)) > r_ptr->sleep) ||
- (r_ptr->r_ignore == MAX_UCHAR) ||
- ((r_ptr->sleep == 0) && (r_ptr->r_tkills >= 10)))
+ /* How aware is it? */
{
cptr act;
@@ -1123,45 +877,57 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Drops gold and/or items */
- if (r_ptr->r_drop_gold || r_ptr->r_drop_item)
{
+ /* Calculate drops */
+ byte drop_gold;
+ byte drop_item;
+
+ drop_gold = drop_item =
+ (((r_ptr->flags & RF_DROP_4D2) ? 8 : 0) +
+ ((r_ptr->flags & RF_DROP_3D2) ? 6 : 0) +
+ ((r_ptr->flags & RF_DROP_2D2) ? 4 : 0) +
+ ((r_ptr->flags & RF_DROP_1D2) ? 2 : 0) +
+ ((r_ptr->flags & RF_DROP_90) ? 1 : 0) +
+ ((r_ptr->flags & RF_DROP_60) ? 1 : 0));
+
+ if (r_ptr->flags & RF_ONLY_GOLD) drop_item = 0;
+ if (r_ptr->flags & RF_ONLY_ITEM) drop_gold = 0;
+
/* No "n" needed */
sin = FALSE;
- /* Intro */
- text_out(format("%^s may carry", wd_he[msex]));
-
/* Count maximum drop */
- n = MAX(r_ptr->r_drop_gold, r_ptr->r_drop_item);
+ n = MAX(drop_gold, drop_item);
- /* One drop (may need an "n") */
- if (n == 1)
+ /* Intro text */
+ if (n == 0)
{
- text_out(" a");
+ text_out(format("%^s carries no items", wd_he[msex]));
+
+ }
+ else if (n == 1)
+ {
+ text_out(format("%^s may carry a", wd_he[msex]));
sin = TRUE;
}
-
- /* Two drops */
else if (n == 2)
{
- text_out(" one or two");
+ text_out(format("%^s may carry one or two", wd_he[msex]));
}
-
- /* Many drops */
else
{
- text_out(format(" up to %d", n));
+ text_out(format("%^s may carry up to %d", wd_he[msex], n));
}
/* Great */
- if (flags1 & (RF1_DROP_GREAT))
+ if (flags & RF_DROP_GREAT)
{
p = " exceptional";
}
/* Good (no "n" needed) */
- else if (flags1 & (RF1_DROP_GOOD))
+ else if (flags & RF_DROP_GOOD)
{
p = " good";
sin = FALSE;
@@ -1175,7 +941,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* Objects */
- if (r_ptr->r_drop_item)
+ if (drop_item)
{
/* Handle singular "an" */
if (sin) text_out("n");
@@ -1191,7 +957,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
}
/* Treasures */
- if (r_ptr->r_drop_gold)
+ if (drop_gold)
{
/* Cancel prefix */
if (!p) sin = FALSE;
@@ -1211,33 +977,27 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
}
- /* Count the number of "known" attacks */
+ /* Count the number of attacks */
for (n = 0, m = 0; m < 4; m++)
{
/* Skip non-attacks */
if (!r_ptr->blow[m].method) continue;
/* Count known attacks */
- if (r_ptr->r_blows[m]) n++;
+ n++;
}
- /* Examine (and count) the actual attacks */
+ /* Examine the actual attacks */
for (r = 0, m = 0; m < 4; m++)
{
- int method, effect, d1, d2;
-
/* Skip non-attacks */
if (!r_ptr->blow[m].method) continue;
- /* Skip unknown attacks */
- if (!r_ptr->r_blows[m]) continue;
-
-
/* Extract the attack info */
- method = r_ptr->blow[m].method;
- effect = r_ptr->blow[m].effect;
- d1 = r_ptr->blow[m].d_dice;
- d2 = r_ptr->blow[m].d_side;
+ int method = r_ptr->blow[m].method;
+ int effect = r_ptr->blow[m].effect;
+ int d1 = r_ptr->blow[m].d_dice;
+ int d2 = r_ptr->blow[m].d_side;
/* No method yet */
@@ -1457,7 +1217,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
text_out_c(TERM_YELLOW, q);
/* Describe damage (if known) */
- if (d1 && d2 && know_damage(r_ptr, m))
+ if (d1 && d2)
{
/* Display the damage */
text_out(" with damage");
@@ -1477,7 +1237,7 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
}
/* Notice lack of attacks */
- else if (flags1 & (RF1_NEVER_BLOW))
+ else if (flags & RF_NEVER_BLOW)
{
text_out(format("%^s has no physical attacks. ", wd_he[msex]));
}
@@ -1491,13 +1251,6 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
/* All done */
text_out("\n");
-
- /* Cheat -- know everything */
- if ((cheat_know) && (remem == 0))
- {
- /* Hack -- restore memory */
- *r_ptr = save_mem;
- }
}
/*
@@ -1505,6 +1258,8 @@ static void roff_aux(std::shared_ptr<monster_race> r_ptr, int remem)
*/
static void roff_name(int r_idx, int ego)
{
+ const auto &re_info = game->edit_data.re_info;
+
const auto r_ptr = race_info_idx(r_idx, ego);
/* Access the chars */
@@ -1516,7 +1271,7 @@ static void roff_name(int r_idx, int ego)
const byte a2 = r_ptr->x_attr;
/* A title (use "The" for non-uniques) */
- if (!(r_ptr->flags1 & (RF1_UNIQUE)))
+ if (!(r_ptr->flags & RF_UNIQUE))
{
Term_addstr( -1, TERM_WHITE, "The ");
}
@@ -1566,7 +1321,7 @@ static void roff_top(int r_idx, int ego)
/*
* Hack -- describe the given monster race at the top of the screen
*/
-void screen_roff(int r_idx, int ego, int remember)
+void screen_roff(int r_idx, int ego)
{
auto r_ptr = race_info_idx(r_idx, ego);
@@ -1577,7 +1332,7 @@ void screen_roff(int r_idx, int ego, int remember)
Term_erase(0, 1, 255);
/* Recall monster */
- roff_aux(r_ptr, remember);
+ roff_aux(r_ptr);
/* Describe monster */
roff_top(r_idx, ego);
@@ -1590,7 +1345,7 @@ void monster_description_out(int r_idx, int ego)
{
auto r_ptr = race_info_idx(r_idx, ego);
roff_name(r_idx, ego);
- roff_aux(r_ptr, 0);
+ roff_aux(r_ptr);
}
/*
@@ -1614,7 +1369,7 @@ void display_roff(int r_idx, int ego)
/* Recall monster */
auto r_ptr = race_info_idx(r_idx, ego);
- roff_aux(r_ptr, 0);
+ roff_aux(r_ptr);
/* Describe monster */
roff_top(r_idx, ego);
@@ -1623,16 +1378,18 @@ void display_roff(int r_idx, int ego)
bool_ monster_quest(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Random quests are in the dungeon */
- if (!(r_ptr->flags8 & RF8_DUNGEON)) return FALSE;
+ if (r_ptr->flags & RF_WILD_ONLY) return FALSE;
/* No random quests for aquatic monsters */
- if (r_ptr->flags7 & RF7_AQUATIC) return FALSE;
+ if (r_ptr->flags & RF_AQUATIC) return FALSE;
/* No random quests for multiplying monsters */
- if (r_ptr->flags4 & RF4_MULTIPLY) return FALSE;
+ if (r_ptr->spells & SF_MULTIPLY) return FALSE;
return TRUE;
}
@@ -1640,9 +1397,11 @@ bool_ monster_quest(int r_idx)
bool_ monster_dungeon(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
- if (r_ptr->flags8 & RF8_DUNGEON)
+ auto r_ptr = &r_info[r_idx];
+
+ if (!(r_ptr->flags & RF_WILD_ONLY))
return TRUE;
else
return FALSE;
@@ -1651,9 +1410,11 @@ bool_ monster_dungeon(int r_idx)
static bool_ monster_ocean(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
- if (r_ptr->flags8 & RF8_WILD_OCEAN)
+ if (r_ptr->flags & RF_WILD_OCEAN)
return TRUE;
else
return FALSE;
@@ -1662,9 +1423,11 @@ static bool_ monster_ocean(int r_idx)
static bool_ monster_shore(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
- if (r_ptr->flags8 & RF8_WILD_SHORE)
+ auto r_ptr = &r_info[r_idx];
+
+ if (r_ptr->flags & RF_WILD_SHORE)
return TRUE;
else
return FALSE;
@@ -1673,9 +1436,11 @@ static bool_ monster_shore(int r_idx)
static bool_ monster_waste(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
- if (r_ptr->flags8 & RF8_WILD_WASTE)
+ if (r_ptr->flags & RF_WILD_WASTE)
return TRUE;
else
return FALSE;
@@ -1684,9 +1449,11 @@ static bool_ monster_waste(int r_idx)
static bool_ monster_town(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
- if (r_ptr->flags8 & RF8_WILD_TOWN)
+ auto r_ptr = &r_info[r_idx];
+
+ if (r_ptr->flags & RF_WILD_TOWN)
return TRUE;
else
return FALSE;
@@ -1695,9 +1462,11 @@ static bool_ monster_town(int r_idx)
static bool_ monster_wood(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
- if (r_ptr->flags8 & RF8_WILD_WOOD)
+ if (r_ptr->flags & RF_WILD_WOOD)
return TRUE;
else
return FALSE;
@@ -1706,9 +1475,11 @@ static bool_ monster_wood(int r_idx)
static bool_ monster_volcano(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
- if (r_ptr->flags8 & RF8_WILD_VOLCANO)
+ auto r_ptr = &r_info[r_idx];
+
+ if (r_ptr->flags & RF_WILD_VOLCANO)
return TRUE;
else
return FALSE;
@@ -1717,9 +1488,11 @@ static bool_ monster_volcano(int r_idx)
static bool_ monster_mountain(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
- if (r_ptr->flags8 & RF8_WILD_MOUNTAIN)
+ if (r_ptr->flags & RF_WILD_MOUNTAIN)
return TRUE;
else
return FALSE;
@@ -1728,9 +1501,11 @@ static bool_ monster_mountain(int r_idx)
static bool_ monster_grass(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
- if (r_ptr->flags8 & RF8_WILD_GRASS)
+ auto r_ptr = &r_info[r_idx];
+
+ if (r_ptr->flags & RF_WILD_GRASS)
return TRUE;
else
return FALSE;
@@ -1739,11 +1514,13 @@ static bool_ monster_grass(int r_idx)
static bool_ monster_deep_water(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
if (!monster_dungeon(r_idx)) return FALSE;
- if (r_ptr->flags7 & RF7_AQUATIC)
+ if (r_ptr->flags & RF_AQUATIC)
return TRUE;
else
return FALSE;
@@ -1752,11 +1529,13 @@ static bool_ monster_deep_water(int r_idx)
static bool_ monster_shallow_water(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
if (!monster_dungeon(r_idx)) return FALSE;
- if (r_ptr->flags2 & RF2_AURA_FIRE)
+ if (r_ptr->flags & RF_AURA_FIRE)
return FALSE;
else
return TRUE;
@@ -1765,24 +1544,29 @@ static bool_ monster_shallow_water(int r_idx)
static bool_ monster_lava(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
if (!monster_dungeon(r_idx)) return FALSE;
- if (((r_ptr->flags3 & RF3_IM_FIRE) ||
- (r_ptr->flags7 & RF7_CAN_FLY)) &&
- !(r_ptr->flags3 & RF3_AURA_COLD))
+ if (((r_ptr->flags & RF_IM_FIRE) ||
+ (r_ptr->flags & RF_CAN_FLY)) &&
+ !(r_ptr->flags & RF_AURA_COLD))
return TRUE;
else
return FALSE;
}
-void set_mon_num_hook(void)
+void set_mon_num_hook()
{
+ auto const &wf_info = game->edit_data.wf_info;
+
if (!dun_level)
{
- switch (wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].terrain_idx)
+ auto const &wilderness = game->wilderness;
+ switch (wf_info[wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).feat].terrain_idx)
{
case TERRAIN_TOWN:
get_mon_num_hook = monster_town;
@@ -1829,9 +1613,9 @@ bool_ monster_can_cross_terrain(byte feat, std::shared_ptr<monster_race> r_ptr)
/* Deep water */
if (feat == FEAT_DEEP_WATER)
{
- if ((r_ptr->flags7 & RF7_AQUATIC) ||
- (r_ptr->flags7 & RF7_CAN_FLY) ||
- (r_ptr->flags7 & RF7_CAN_SWIM))
+ if ((r_ptr->flags & RF_AQUATIC) ||
+ (r_ptr->flags & RF_CAN_FLY) ||
+ (r_ptr->flags & RF_CAN_SWIM))
return TRUE;
else
return FALSE;
@@ -1839,14 +1623,14 @@ bool_ monster_can_cross_terrain(byte feat, std::shared_ptr<monster_race> r_ptr)
/* Shallow water */
else if (feat == FEAT_SHAL_WATER)
{
- if (r_ptr->flags2 & RF2_AURA_FIRE)
+ if (r_ptr->flags & RF_AURA_FIRE)
return FALSE;
else
return TRUE;
}
/* Aquatic monster */
- else if ((r_ptr->flags7 & RF7_AQUATIC) &&
- !(r_ptr->flags7 & RF7_CAN_FLY))
+ else if ((r_ptr->flags & RF_AQUATIC) &&
+ !(r_ptr->flags & RF_CAN_FLY))
{
return FALSE;
}
@@ -1854,8 +1638,8 @@ bool_ monster_can_cross_terrain(byte feat, std::shared_ptr<monster_race> r_ptr)
else if ((feat == FEAT_SHAL_LAVA) ||
(feat == FEAT_DEEP_LAVA))
{
- if ((r_ptr->flags3 & RF3_IM_FIRE) ||
- (r_ptr->flags7 & RF7_CAN_FLY))
+ if ((r_ptr->flags & RF_IM_FIRE) ||
+ (r_ptr->flags & RF_CAN_FLY))
return TRUE;
else
return FALSE;
diff --git a/src/monster1.hpp b/src/monster1.hpp
index 1d71fef1..34f54346 100644
--- a/src/monster1.hpp
+++ b/src/monster1.hpp
@@ -1,5 +1,5 @@
#pragma once
-extern void screen_roff(int r_idx, int ego, int remember);
-extern void display_roff(int r_idx, int ego);
-extern void monster_description_out(int r_idx, int ego);
+void screen_roff(int r_idx, int ego);
+void display_roff(int r_idx, int ego);
+void monster_description_out(int r_idx, int ego);
diff --git a/src/monster2.cc b/src/monster2.cc
index 3debb27a..624dca53 100644
--- a/src/monster2.cc
+++ b/src/monster2.cc
@@ -11,8 +11,10 @@
#include "artifact_type.hpp"
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hook_new_monster_in.hpp"
#include "hook_new_monster_end_in.hpp"
#include "hooks.hpp"
@@ -21,12 +23,16 @@
#include "monster3.hpp"
#include "monster_ego.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "options.hpp"
+#include "player_race_flag.hpp"
#include "player_type.hpp"
#include "randart.hpp"
#include "spells1.hpp"
@@ -59,8 +65,10 @@ s32b monster_exp(s16b level)
/* Monster gain a few levels ? */
void monster_check_experience(int m_idx, bool_ silent)
{
+ auto const &r_info = game->edit_data.r_info;
+
monster_type *m_ptr = &m_list[m_idx];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ auto r_ptr = &r_info[m_ptr->r_idx];
char m_name[80];
/* Get the name */
@@ -166,25 +174,17 @@ s32b modify_aux(s32b a, s32b b, char mod)
/* Is this ego ok for this monster ? */
bool_ mego_ok(monster_race const *r_ptr, int ego)
{
- monster_ego *re_ptr = &re_info[ego];
+ const auto &re_info = game->edit_data.re_info;
+
+ auto re_ptr = &re_info[ego];
bool_ ok = FALSE;
int i;
/* needed flags */
- if (re_ptr->flags1 && ((re_ptr->flags1 & r_ptr->flags1) != re_ptr->flags1)) return FALSE;
- if (re_ptr->flags2 && ((re_ptr->flags2 & r_ptr->flags2) != re_ptr->flags2)) return FALSE;
- if (re_ptr->flags3 && ((re_ptr->flags3 & r_ptr->flags3) != re_ptr->flags3)) return FALSE;
- if (re_ptr->flags7 && ((re_ptr->flags7 & r_ptr->flags7) != re_ptr->flags7)) return FALSE;
- if (re_ptr->flags8 && ((re_ptr->flags8 & r_ptr->flags8) != re_ptr->flags8)) return FALSE;
- if (re_ptr->flags9 && ((re_ptr->flags9 & r_ptr->flags9) != re_ptr->flags9)) return FALSE;
+ if (re_ptr->flags && ((re_ptr->flags & r_ptr->flags) != re_ptr->flags)) return FALSE;
/* unwanted flags */
- if (re_ptr->hflags1 && (re_ptr->hflags1 & r_ptr->flags1)) return FALSE;
- if (re_ptr->hflags2 && (re_ptr->hflags2 & r_ptr->flags2)) return FALSE;
- if (re_ptr->hflags3 && (re_ptr->hflags3 & r_ptr->flags3)) return FALSE;
- if (re_ptr->hflags7 && (re_ptr->hflags7 & r_ptr->flags7)) return FALSE;
- if (re_ptr->hflags8 && (re_ptr->hflags8 & r_ptr->flags8)) return FALSE;
- if (re_ptr->hflags9 && (re_ptr->hflags9 & r_ptr->flags9)) return FALSE;
+ if (re_ptr->hflags && (re_ptr->hflags & r_ptr->flags)) return FALSE;
/* Need good race -- IF races are specified */
if (re_ptr->r_char[0])
@@ -210,12 +210,13 @@ bool_ mego_ok(monster_race const *r_ptr, int ego)
/* Choose an ego type */
static int pick_ego_monster(monster_race const *r_ptr)
{
+ const auto &re_info = game->edit_data.re_info;
+
/* Assume no ego */
int ego = 0, lvl;
- int tries = max_re_idx + 10;
- monster_ego *re_ptr;
+ int tries = re_info.size() + 10;
- if ((!(dungeon_flags2 & DF2_ELVEN)) && (!(dungeon_flags2 & DF2_DWARVEN)))
+ if ((!(dungeon_flags & DF_ELVEN)) && (!(dungeon_flags & DF_DWARVEN)))
{
/* No townspeople ego */
if (!r_ptr->level) return 0;
@@ -227,8 +228,8 @@ static int pick_ego_monster(monster_race const *r_ptr)
while (tries--)
{
/* Pick one */
- ego = rand_range(1, max_re_idx - 1);
- re_ptr = &re_info[ego];
+ ego = rand_range(1, re_info.size() - 1);
+ auto re_ptr = &re_info[ego];
/* No hope so far */
if (!mego_ok(r_ptr, ego)) continue;
@@ -250,9 +251,9 @@ static int pick_ego_monster(monster_race const *r_ptr)
/* Bypass restrictions for themed townspeople */
else
{
- if (dungeon_flags2 & DF2_ELVEN)
+ if (dungeon_flags & DF_ELVEN)
ego = test_mego_name("Elven");
- else if (dungeon_flags2 & DF2_DWARVEN)
+ else if (dungeon_flags & DF_DWARVEN)
ego = test_mego_name("Dwarven");
if (mego_ok(r_ptr, ego))
@@ -269,7 +270,10 @@ static int pick_ego_monster(monster_race const *r_ptr)
*/
std::shared_ptr<monster_race> race_info_idx(int r_idx, int ego)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &re_info = game->edit_data.re_info;
+ auto &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* We don't need to allocate anything if it's an ordinary monster. */
if (!ego) {
@@ -283,7 +287,7 @@ std::shared_ptr<monster_race> race_info_idx(int r_idx, int ego)
*nr_ptr = *r_ptr;
/* Get a reference to the ego monster modifiers */
- monster_ego *re_ptr = &re_info[ego];
+ auto re_ptr = &re_info[ego];
/* Adjust the values */
for (int i = 0; i < 4; i++)
@@ -329,26 +333,12 @@ std::shared_ptr<monster_race> race_info_idx(int r_idx, int ego)
MODIFY(nr_ptr->level, re_ptr->level, 1);
/* Take off some flags */
- nr_ptr->flags1 &= ~(re_ptr->nflags1);
- nr_ptr->flags2 &= ~(re_ptr->nflags2);
- nr_ptr->flags3 &= ~(re_ptr->nflags3);
- nr_ptr->flags4 &= ~(re_ptr->nflags4);
- nr_ptr->flags5 &= ~(re_ptr->nflags5);
- nr_ptr->flags6 &= ~(re_ptr->nflags6);
- nr_ptr->flags7 &= ~(re_ptr->nflags7);
- nr_ptr->flags8 &= ~(re_ptr->nflags8);
- nr_ptr->flags9 &= ~(re_ptr->nflags9);
+ nr_ptr->flags &= ~re_ptr->nflags;
+ nr_ptr->spells &= ~(re_ptr->nspells);
/* Add some flags */
- nr_ptr->flags1 |= re_ptr->mflags1;
- nr_ptr->flags2 |= re_ptr->mflags2;
- nr_ptr->flags3 |= re_ptr->mflags3;
- nr_ptr->flags4 |= re_ptr->mflags4;
- nr_ptr->flags5 |= re_ptr->mflags5;
- nr_ptr->flags6 |= re_ptr->mflags6;
- nr_ptr->flags7 |= re_ptr->mflags7;
- nr_ptr->flags8 |= re_ptr->mflags8;
- nr_ptr->flags9 |= re_ptr->mflags9;
+ nr_ptr->flags |= re_ptr->mflags;
+ nr_ptr->spells |= re_ptr->mspells;
/* Change the char/attr is needed */
if (re_ptr->d_char != MEGO_CHAR_ANY)
@@ -440,6 +430,10 @@ static cptr funny_comments[MAX_COMMENT] =
*/
void delete_monster_idx(int i)
{
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+ auto &random_artifacts = game->random_artifacts;
+
/* Get location */
monster_type *m_ptr = &m_list[i];
int y = m_ptr->fy;
@@ -451,11 +445,11 @@ void delete_monster_idx(int i)
r_ptr->on_saved = FALSE;
/* Hack -- count the number of "reproducers" */
- if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro--;
+ if (r_ptr->spells & SF_MULTIPLY) num_repro--;
/* XXX XXX XXX remove monster light source */
bool_ had_lite = FALSE;
- if (r_ptr->flags9 & (RF9_HAS_LITE)) had_lite = TRUE;
+ if (r_ptr->flags & RF_HAS_LITE) had_lite = TRUE;
/* Hack -- remove target monster */
@@ -495,7 +489,7 @@ void delete_monster_idx(int i)
/* Hack -- efficiency */
o_ptr->held_m_idx = 0;
- if ( p_ptr->preserve )
+ if (options->preserve)
{
/* Hack -- Preserve unknown artifacts */
if (artifact_p(o_ptr) && !object_known_p(o_ptr))
@@ -505,7 +499,7 @@ void delete_monster_idx(int i)
{
random_artifacts[o_ptr->sval].generated = FALSE;
}
- else if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART)
+ else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART)
{
k_info[o_ptr->k_idx].artifact = FALSE;
}
@@ -681,7 +675,7 @@ void compact_monsters(int size)
if ((m_ptr->mflag & MFLAG_QUEST) && (cnt < 1000)) chance = 100;
/* Try not to compact Unique Monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) chance = 99;
+ if (r_ptr->flags & RF_UNIQUE) chance = 99;
/* All monsters get a saving throw */
if (rand_int(100) < chance) continue;
@@ -718,7 +712,7 @@ void compact_monsters(int size)
* This is an efficient method of simulating multiple calls to the
* "delete_monster()" function, with no visual effects.
*/
-void wipe_m_list(void)
+void wipe_m_list()
{
int i;
@@ -730,8 +724,6 @@ void wipe_m_list(void)
/* Skip dead monsters */
if (!m_ptr->r_idx) continue;
- /* Mega-Hack -- preserve Unique's XXX XXX XXX */
-
/* Hack -- Reduce the racial counter */
auto r_ptr = m_ptr->race();
r_ptr->cur_num--;
@@ -768,7 +760,7 @@ void wipe_m_list(void)
*
* This routine should almost never fail, but it *can* happen.
*/
-s16b m_pop(void)
+s16b m_pop()
{
int i;
@@ -822,29 +814,26 @@ s16b m_pop(void)
/*
* Apply a "monster restriction function" to the "monster allocation table"
*/
-errr get_mon_num_prep(void)
+errr get_mon_num_prep()
{
- int i;
+ auto &alloc = game->alloc;
/* Scan the allocation table */
- for (i = 0; i < alloc_race_size; i++)
+ for (auto &&entry: alloc.race_table)
{
- /* Get the entry */
- alloc_entry *entry = &alloc_race_table[i];
-
/* Accept monsters which pass the restriction, if any */
- if ((!get_mon_num_hook || (*get_mon_num_hook)(entry->index)) &&
- (!get_mon_num2_hook || (*get_mon_num2_hook)(entry->index)))
+ if ((!get_mon_num_hook || (*get_mon_num_hook)(entry.index)) &&
+ (!get_mon_num2_hook || (*get_mon_num2_hook)(entry.index)))
{
/* Accept this monster */
- entry->prob2 = entry->prob1;
+ entry.prob2 = entry.prob1;
}
/* Do not use this monster */
else
{
/* Decline this monster */
- entry->prob2 = 0;
+ entry.prob2 = 0;
}
}
@@ -856,9 +845,11 @@ errr get_mon_num_prep(void)
* Some dungeon types restrict the possible monsters.
* Return TRUE is the monster is OK and FALSE otherwise
*/
-bool_ apply_rule(monster_race *r_ptr, byte rule)
+static bool_ apply_rule(monster_race const *r_ptr, byte rule)
{
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto const &d_info = game->edit_data.d_info;
+
+ auto d_ptr = &d_info[dungeon_type];
if (d_ptr->rules[rule].mode == DUNGEON_MODE_NONE)
{
@@ -868,49 +859,14 @@ bool_ apply_rule(monster_race *r_ptr, byte rule)
{
int a;
- if (d_ptr->rules[rule].mflags1)
- {
- if ((d_ptr->rules[rule].mflags1 & r_ptr->flags1) != d_ptr->rules[rule].mflags1)
- return FALSE;
- }
- if (d_ptr->rules[rule].mflags2)
- {
- if ((d_ptr->rules[rule].mflags2 & r_ptr->flags2) != d_ptr->rules[rule].mflags2)
- return FALSE;
- }
- if (d_ptr->rules[rule].mflags3)
- {
- if ((d_ptr->rules[rule].mflags3 & r_ptr->flags3) != d_ptr->rules[rule].mflags3)
- return FALSE;
- }
- if (d_ptr->rules[rule].mflags4)
+ if (d_ptr->rules[rule].mflags)
{
- if ((d_ptr->rules[rule].mflags4 & r_ptr->flags4) != d_ptr->rules[rule].mflags4)
+ if ((d_ptr->rules[rule].mflags & r_ptr->flags) != d_ptr->rules[rule].mflags)
return FALSE;
}
- if (d_ptr->rules[rule].mflags5)
+ if (d_ptr->rules[rule].mspells)
{
- if ((d_ptr->rules[rule].mflags5 & r_ptr->flags5) != d_ptr->rules[rule].mflags5)
- return FALSE;
- }
- if (d_ptr->rules[rule].mflags6)
- {
- if ((d_ptr->rules[rule].mflags6 & r_ptr->flags6) != d_ptr->rules[rule].mflags6)
- return FALSE;
- }
- if (d_ptr->rules[rule].mflags7)
- {
- if ((d_ptr->rules[rule].mflags7 & r_ptr->flags7) != d_ptr->rules[rule].mflags7)
- return FALSE;
- }
- if (d_ptr->rules[rule].mflags8)
- {
- if ((d_ptr->rules[rule].mflags8 & r_ptr->flags8) != d_ptr->rules[rule].mflags8)
- return FALSE;
- }
- if (d_ptr->rules[rule].mflags9)
- {
- if ((d_ptr->rules[rule].mflags9 & r_ptr->flags9) != d_ptr->rules[rule].mflags9)
+ if ((d_ptr->rules[rule].mspells & r_ptr->spells) != d_ptr->rules[rule].mspells)
return FALSE;
}
for (a = 0; a < 5; a++)
@@ -925,15 +881,8 @@ bool_ apply_rule(monster_race *r_ptr, byte rule)
{
int a;
- if (d_ptr->rules[rule].mflags1 && (r_ptr->flags1 & d_ptr->rules[rule].mflags1)) return TRUE;
- if (d_ptr->rules[rule].mflags2 && (r_ptr->flags2 & d_ptr->rules[rule].mflags2)) return TRUE;
- if (d_ptr->rules[rule].mflags3 && (r_ptr->flags3 & d_ptr->rules[rule].mflags3)) return TRUE;
- if (d_ptr->rules[rule].mflags4 && (r_ptr->flags4 & d_ptr->rules[rule].mflags4)) return TRUE;
- if (d_ptr->rules[rule].mflags5 && (r_ptr->flags5 & d_ptr->rules[rule].mflags5)) return TRUE;
- if (d_ptr->rules[rule].mflags6 && (r_ptr->flags6 & d_ptr->rules[rule].mflags6)) return TRUE;
- if (d_ptr->rules[rule].mflags7 && (r_ptr->flags7 & d_ptr->rules[rule].mflags7)) return TRUE;
- if (d_ptr->rules[rule].mflags8 && (r_ptr->flags8 & d_ptr->rules[rule].mflags8)) return TRUE;
- if (d_ptr->rules[rule].mflags9 && (r_ptr->flags9 & d_ptr->rules[rule].mflags9)) return TRUE;
+ if (d_ptr->rules[rule].mflags && (r_ptr->flags & d_ptr->rules[rule].mflags)) return TRUE;
+ if (d_ptr->rules[rule].mspells && (r_ptr->spells & d_ptr->rules[rule].mspells)) return TRUE;
for (a = 0; a < 5; a++)
if (d_ptr->rules[rule].r_char[a] == r_ptr->d_char) return TRUE;
@@ -948,8 +897,11 @@ bool_ apply_rule(monster_race *r_ptr, byte rule)
bool_ restrict_monster_to_dungeon(int r_idx)
{
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &d_info = game->edit_data.d_info;
+ auto const &r_info = game->edit_data.r_info;
+
+ auto d_ptr = &d_info[dungeon_type];
+ auto r_ptr = &r_info[r_idx];
/* Select a random rule */
byte rule = d_ptr->rule_percents[rand_int(100)];
@@ -994,15 +946,13 @@ bool_ summon_hack = FALSE;
*/
s16b get_mon_num(int level)
{
- int i, j, p;
-
- int r_idx;
-
- long value, total;
-
- monster_race *r_ptr;
+ auto const &r_info = game->edit_data.r_info;
+ auto &alloc = game->alloc;
- alloc_entry *table = alloc_race_table;
+ std::size_t i, j;
+ int p;
+ int r_idx;
+ long value, total;
int in_tome;
@@ -1038,59 +988,52 @@ s16b get_mon_num(int level)
in_tome = strcmp(game_module, "ToME") == 0;
/* Process probabilities */
- for (i = 0; i < alloc_race_size; i++)
+ for (i = 0; i < alloc.race_table.size(); i++)
{
+ auto &entry = alloc.race_table[i];
+
/* Monsters are sorted by depth */
- if (table[i].level > level) break;
+ if (entry.level > level) break;
/* Default */
- table[i].prob3 = 0;
+ entry.prob3 = 0;
/* Access the "r_idx" of the chosen monster */
- r_idx = table[i].index;
+ r_idx = entry.index;
/* Access the actual race */
- r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
/* Hack -- "unique" monsters must be "unique" */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) &&
+ if ((r_ptr->flags & RF_UNIQUE) &&
(r_ptr->cur_num >= r_ptr->max_num))
{
continue;
}
/* Depth Monsters never appear out of depth */
- if ((r_ptr->flags1 & (RF1_FORCE_DEPTH)) && (r_ptr->level > dun_level))
+ if ((r_ptr->flags & RF_FORCE_DEPTH) && (r_ptr->level > dun_level))
{
continue;
}
/* Depth Monsters never appear out of their depth */
- if ((r_ptr->flags9 & (RF9_ONLY_DEPTH)) && (r_ptr->level != dun_level))
+ if ((r_ptr->flags & RF_ONLY_DEPTH) && (r_ptr->level != dun_level))
{
continue;
}
- if(in_tome)
- {
- /* Zangbandish monsters not allowed */
- if (r_ptr->flags8 & RF8_ZANGBAND) continue;
-
- /* Lovecraftian monsters not allowed */
- if (r_ptr->flags8 & RF8_CTHANGBAND) continue;
- }
-
/* Joke monsters allowed ? or not ? */
- if (!joke_monsters && (r_ptr->flags8 & RF8_JOKEANGBAND)) continue;
+ if (!options->joke_monsters && (r_ptr->flags & RF_JOKEANGBAND)) continue;
/* Some dungeon types restrict the possible monsters */
if (!summon_hack && !restrict_monster_to_dungeon(r_idx) && dun_level) continue;
/* Accept */
- table[i].prob3 = table[i].prob2;
+ entry.prob3 = entry.prob2;
/* Total */
- total += table[i].prob3;
+ total += entry.prob3;
}
/* No legal monsters */
@@ -1101,19 +1044,24 @@ s16b get_mon_num(int level)
value = rand_int(total);
/* Find the monster */
- for (i = 0; i < alloc_race_size; i++)
+ for (i = 0; i < alloc.race_table.size(); i++)
{
+ auto &entry = alloc.race_table[i];
+
/* Found the entry */
- if (value < table[i].prob3) break;
+ if (value < entry.prob3) break;
/* Decrement */
- value = value - table[i].prob3;
+ value = value - entry.prob3;
}
/* Power boost */
p = rand_int(100);
+ /* Shorthand */
+ auto &table = alloc.race_table;
+
/* Try for a "harder" monster once (50%) or twice (10%) */
if (p < 60)
{
@@ -1124,7 +1072,7 @@ s16b get_mon_num(int level)
value = rand_int(total);
/* Find the monster */
- for (i = 0; i < alloc_race_size; i++)
+ for (i = 0; i < table.size(); i++)
{
/* Found the entry */
if (value < table[i].prob3) break;
@@ -1147,7 +1095,7 @@ s16b get_mon_num(int level)
value = rand_int(total);
/* Find the monster */
- for (i = 0; i < alloc_race_size; i++)
+ for (i = 0; i < table.size(); i++)
{
/* Found the entry */
if (value < table[i].prob3) break;
@@ -1217,6 +1165,9 @@ s16b get_mon_num(int level)
*/
void monster_desc(char *desc, monster_type *m_ptr, int mode)
{
+ auto const &re_info = game->edit_data.re_info;
+ auto const &r_info = game->edit_data.r_info;
+
auto r_ptr = m_ptr->race();
char silly_name[80], name[100];
bool_ seen, pron;
@@ -1224,13 +1175,15 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
if (m_ptr->ego)
{
- if (re_info[m_ptr->ego].before)
+ auto const &monster_ego = re_info[m_ptr->ego];
+
+ if (monster_ego.before)
{
- sprintf(name, "%s %s", re_info[m_ptr->ego].name, r_ptr->name);
+ sprintf(name, "%s %s", monster_ego.name, r_ptr->name);
}
else
{
- sprintf(name, "%s %s", r_ptr->name, re_info[m_ptr->ego].name);
+ sprintf(name, "%s %s", r_ptr->name, monster_ego.name);
}
}
else
@@ -1246,13 +1199,13 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
{
if (rand_int(2) == 0)
{
- monster_race *hallu_race;
+ monster_race const *hallu_race;
do
{
- hallu_race = &r_info[randint(max_r_idx - 2)];
+ hallu_race = &*uniform_element(r_info);
}
- while (hallu_race->flags1 & RF1_UNIQUE);
+ while ((!hallu_race->name) || (hallu_race->flags & RF_UNIQUE));
strcpy(silly_name, hallu_race->name);
}
@@ -1277,8 +1230,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
int kind = 0x00;
/* Extract the gender (if applicable) */
- if (r_ptr->flags1 & (RF1_FEMALE)) kind = 0x20;
- else if (r_ptr->flags1 & (RF1_MALE)) kind = 0x10;
+ if (r_ptr->flags & RF_FEMALE) kind = 0x20;
+ else if (r_ptr->flags & RF_MALE) kind = 0x10;
/* Ignore the gender (if desired) */
if (!m_ptr || !pron) kind = 0x00;
@@ -1370,7 +1323,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
}
/* Copy the result */
- (void)strcpy(desc, res);
+ strcpy(desc, res);
}
@@ -1378,8 +1331,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
else if ((mode & 0x02) && (mode & 0x01))
{
/* The monster is visible, so use its gender */
- if (r_ptr->flags1 & (RF1_FEMALE)) strcpy(desc, "herself");
- else if (r_ptr->flags1 & (RF1_MALE)) strcpy(desc, "himself");
+ if (r_ptr->flags & RF_FEMALE) strcpy(desc, "herself");
+ else if (r_ptr->flags & RF_MALE) strcpy(desc, "himself");
else strcpy(desc, "itself");
}
@@ -1388,10 +1341,10 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
else
{
/* It could be a Unique */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) && !(p_ptr->image))
+ if ((r_ptr->flags & RF_UNIQUE) && !(p_ptr->image))
{
/* Start with the name (thus nominative and objective) */
- (void)strcpy(desc, name);
+ strcpy(desc, name);
}
/* It could be an indefinite monster */
@@ -1400,8 +1353,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
/* XXX Check plurality for "some" */
/* Indefinite monsters need an indefinite article */
- (void)strcpy(desc, is_a_vowel(name[0]) ? "an " : "a ");
- (void)strcat(desc, name);
+ strcpy(desc, is_a_vowel(name[0]) ? "an " : "a ");
+ strcat(desc, name);
}
/* It could be a normal, definite, monster */
@@ -1409,11 +1362,11 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
{
/* Definite monsters need a definite article */
if (m_ptr->status >= MSTATUS_PET)
- (void)strcpy(desc, "your ");
+ strcpy(desc, "your ");
else
- (void)strcpy(desc, "the ");
+ strcpy(desc, "the ");
- (void)strcat(desc, name);
+ strcat(desc, name);
}
/* Handle the Possessive as a special afterthought */
@@ -1422,25 +1375,30 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
/* XXX Check for trailing "s" */
/* Simply append "apostrophe" and "s" */
- (void)strcat(desc, "'s");
+ strcat(desc, "'s");
}
}
}
void monster_race_desc(char *desc, int r_idx, int ego)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &re_info = game->edit_data.re_info;
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
char name[80];
if (ego)
{
- if (re_info[ego].before)
+ auto const &monster_ego = re_info[ego];
+
+ if (monster_ego.before)
{
- sprintf(name, "%s %s", re_info[ego].name, r_ptr->name);
+ sprintf(name, "%s %s", monster_ego.name, r_ptr->name);
}
else
{
- sprintf(name, "%s %s", r_ptr->name, re_info[ego].name);
+ sprintf(name, "%s %s", r_ptr->name, monster_ego.name);
}
}
else
@@ -1449,79 +1407,19 @@ void monster_race_desc(char *desc, int r_idx, int ego)
}
/* It could be a Unique */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
/* Start with the name (thus nominative and objective) */
- (void)strcpy(desc, name);
+ strcpy(desc, name);
}
/* It could be a normal, definite, monster */
else
{
/* Definite monsters need a definite article */
- (void)strcpy(desc, is_a_vowel(name[0]) ? "an " : "a ");
-
- (void)strcat(desc, name);
- }
-}
-
+ strcpy(desc, is_a_vowel(name[0]) ? "an " : "a ");
-
-/*
- * Learn about a monster (by "probing" it)
- */
-void lore_do_probe(int m_idx)
-{
- monster_type *m_ptr = &m_list[m_idx];
-
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
- /* Hack -- Memorize some flags */
- r_ptr->r_flags1 = r_ptr->flags1;
- r_ptr->r_flags2 = r_ptr->flags2;
- r_ptr->r_flags3 = r_ptr->flags3;
-
- /* Update monster recall window */
- if (monster_race_idx == m_ptr->r_idx)
- {
- /* Window stuff */
- p_ptr->window |= (PW_MONSTER);
- }
-}
-
-
-/*
- * Take note that the given monster just dropped some treasure
- *
- * Note that learning the "GOOD"/"GREAT" flags gives information
- * about the treasure (even when the monster is killed for the first
- * time, such as uniques, and the treasure has not been examined yet).
- *
- * This "indirect" method is used to prevent the player from learning
- * exactly how much treasure a monster can drop from observing only
- * a single example of a drop. This method actually observes how much
- * gold and items are dropped, and remembers that information to be
- * described later by the monster recall code.
- */
-void lore_treasure(int m_idx, int num_item, int num_gold)
-{
- monster_type *m_ptr = &m_list[m_idx];
-
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
- /* Note the number of things dropped */
- if (num_item > r_ptr->r_drop_item) r_ptr->r_drop_item = num_item;
- if (num_gold > r_ptr->r_drop_gold) r_ptr->r_drop_gold = num_gold;
-
- /* Hack -- memorize the good/great flags */
- if (r_ptr->flags1 & (RF1_DROP_GOOD)) r_ptr->r_flags1 |= (RF1_DROP_GOOD);
- if (r_ptr->flags1 & (RF1_DROP_GREAT)) r_ptr->r_flags1 |= (RF1_DROP_GREAT);
-
- /* Update monster recall window */
- if (monster_race_idx == m_ptr->r_idx)
- {
- /* Window stuff */
- p_ptr->window |= (PW_MONSTER);
+ strcat(desc, name);
}
}
@@ -1547,9 +1445,9 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro)
char m_name[80];
monster_desc(m_name, m_ptr, 0);
- if (!(r_ptr->flags1 & RF1_UNIQUE))
+ if (!(r_ptr->flags & RF_UNIQUE))
{
- if (r_ptr->flags1 & RF1_FRIENDS)
+ if (r_ptr->flags & RF_FRIENDS)
power /= 2;
}
else power *= 2;
@@ -1560,7 +1458,7 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro)
if (!(m_ptr->ml))
return ; /* Cannot see it for some reason */
- if (!(r_ptr->flags2 & RF2_ELDRITCH_HORROR))
+ if (!(r_ptr->flags & RF_ELDRITCH_HORROR))
return ; /* oops */
@@ -1591,13 +1489,10 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro)
/* Something frightening happens... */
msg_format("You behold the %s visage of %s!",
horror_desc[(randint(MAX_HORROR)) - 1], m_name);
-
- r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
-
}
/* Undead characters are 50% likely to be unaffected */
- if ((race_flags1_p(PR1_UNDEAD)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire")))
+ if ((race_flags_p(PR_UNDEAD)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire")))
{
if (randint(100) < (25 + (p_ptr->lev))) return;
}
@@ -1611,11 +1506,11 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro)
{
if (!p_ptr->resist_conf)
{
- (void)set_confused(p_ptr->confused + rand_int(4) + 4);
+ set_confused(p_ptr->confused + rand_int(4) + 4);
}
if ((!p_ptr->resist_chaos) && (randint(3) == 1))
{
- (void) set_image(p_ptr->image + rand_int(250) + 150);
+ set_image(p_ptr->image + rand_int(250) + 150);
}
return;
}
@@ -1632,19 +1527,19 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro)
{
if (!p_ptr->resist_conf)
{
- (void)set_confused(p_ptr->confused + rand_int(4) + 4);
+ set_confused(p_ptr->confused + rand_int(4) + 4);
}
if (!p_ptr->free_act)
{
- (void)set_paralyzed(rand_int(4) + 4);
+ set_paralyzed(rand_int(4) + 4);
}
while (rand_int(100) > p_ptr->skill_sav)
- (void)do_dec_stat(A_INT, STAT_DEC_NORMAL);
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
while (rand_int(100) > p_ptr->skill_sav)
- (void)do_dec_stat(A_WIS, STAT_DEC_NORMAL);
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
if (!p_ptr->resist_chaos)
{
- (void) set_image(p_ptr->image + rand_int(250) + 150);
+ set_image(p_ptr->image + rand_int(250) + 150);
}
return;
}
@@ -1741,15 +1636,6 @@ void update_mon(int m_idx, bool_ full)
/* Seen by vision */
bool_ easy = FALSE;
- /* Seen by telepathy */
- bool_ hard = FALSE;
-
- /* Various extra flags */
- bool_ do_empty_mind = FALSE;
- bool_ do_weird_mind = FALSE;
- bool_ do_invisible = FALSE;
- bool_ do_cold_blood = FALSE;
-
auto const r_ptr = m_ptr->race();
/* Calculate distance */
@@ -1788,61 +1674,59 @@ void update_mon(int m_idx, bool_ full)
{
/* Infravision only works on "warm" creatures */
/* Below, we will need to know that infravision failed */
- if (r_ptr->flags2 & (RF2_COLD_BLOOD)) do_cold_blood = TRUE;
-
- /* Infravision works */
- if (!do_cold_blood) easy = flag = TRUE;
+ if (!(r_ptr->flags & RF_COLD_BLOOD))
+ {
+ /* Infravision works */
+ easy = flag = TRUE;
+ }
}
/* Use "illumination" */
if (player_can_see_bold(fy, fx))
{
- /* Take note of invisibility */
- if (r_ptr->flags2 & (RF2_INVISIBLE)) do_invisible = TRUE;
-
/* Visible, or detectable, monsters get seen */
- if (!do_invisible || p_ptr->see_inv) easy = flag = TRUE;
+ if (p_ptr->see_inv || !(r_ptr->flags & RF_INVISIBLE))
+ {
+ easy = flag = TRUE;
+ }
}
}
/* Telepathy can see all "nearby" monsters with "minds" */
- if (p_ptr->telepathy)
{
/* Assume we cant see */
- bool_ can_esp = FALSE;
+ bool can_esp = false;
/* Different ESP */
- if ((p_ptr->telepathy & ESP_ORC) && (r_ptr->flags3 & RF3_ORC)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_SPIDER) && (r_ptr->flags7 & RF7_SPIDER)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_TROLL) && (r_ptr->flags3 & RF3_TROLL)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_DRAGON) && (r_ptr->flags3 & RF3_DRAGON)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_GIANT) && (r_ptr->flags3 & RF3_GIANT)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_DEMON) && (r_ptr->flags3 & RF3_DEMON)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_UNDEAD) && (r_ptr->flags3 & RF3_UNDEAD)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_EVIL) && (r_ptr->flags3 & RF3_EVIL)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_ANIMAL) && (r_ptr->flags3 & RF3_ANIMAL)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_THUNDERLORD) && (r_ptr->flags3 & RF3_THUNDERLORD)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_GOOD) && (r_ptr->flags3 & RF3_GOOD)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_NONLIVING) && (r_ptr->flags3 & RF3_NONLIVING)) can_esp = TRUE;
- if ((p_ptr->telepathy & ESP_UNIQUE) && ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags3 & RF3_UNIQUE_4))) can_esp = TRUE;
- if (p_ptr->telepathy & ESP_ALL) can_esp = TRUE;
+ can_esp |= ((p_ptr->computed_flags & ESP_ORC) && (r_ptr->flags & RF_ORC));
+ can_esp |= ((p_ptr->computed_flags & ESP_SPIDER) && (r_ptr->flags & RF_SPIDER));
+ can_esp |= ((p_ptr->computed_flags & ESP_TROLL) && (r_ptr->flags & RF_TROLL));
+ can_esp |= ((p_ptr->computed_flags & ESP_DRAGON) && (r_ptr->flags & RF_DRAGON));
+ can_esp |= ((p_ptr->computed_flags & ESP_GIANT) && (r_ptr->flags & RF_GIANT));
+ can_esp |= ((p_ptr->computed_flags & ESP_DEMON) && (r_ptr->flags & RF_DEMON));
+ can_esp |= ((p_ptr->computed_flags & ESP_UNDEAD) && (r_ptr->flags & RF_UNDEAD));
+ can_esp |= ((p_ptr->computed_flags & ESP_EVIL) && (r_ptr->flags & RF_EVIL));
+ can_esp |= ((p_ptr->computed_flags & ESP_ANIMAL) && (r_ptr->flags & RF_ANIMAL));
+ can_esp |= ((p_ptr->computed_flags & ESP_THUNDERLORD) && (r_ptr->flags & RF_THUNDERLORD));
+ can_esp |= ((p_ptr->computed_flags & ESP_GOOD) && (r_ptr->flags & RF_GOOD));
+ can_esp |= ((p_ptr->computed_flags & ESP_NONLIVING) && (r_ptr->flags & RF_NONLIVING));
+ can_esp |= ((p_ptr->computed_flags & ESP_UNIQUE) && ((r_ptr->flags & RF_UNIQUE)));
+ can_esp |= bool(p_ptr->computed_flags & ESP_ALL);
/* Only do this when we can really detect monster */
if (can_esp)
{
/* Empty mind, no telepathy */
- if (r_ptr->flags2 & (RF2_EMPTY_MIND))
+ if (r_ptr->flags & RF_EMPTY_MIND)
{
- do_empty_mind = TRUE;
+ /* No telepathy */
}
/* Weird mind, occasional telepathy */
- else if (r_ptr->flags2 & (RF2_WEIRD_MIND))
+ else if (r_ptr->flags & RF_WEIRD_MIND)
{
- do_weird_mind = TRUE;
if (rand_int(100) < 10)
{
- hard = TRUE;
flag = TRUE;
}
}
@@ -1850,7 +1734,6 @@ void update_mon(int m_idx, bool_ full)
/* Normal mind, allow telepathy */
else
{
- hard = TRUE;
flag = TRUE;
}
}
@@ -1882,29 +1765,15 @@ void update_mon(int m_idx, bool_ full)
/* Update monster list window */
p_ptr->window |= (PW_M_LIST);
- /* Hack -- Count "fresh" sightings */
- if (r_ptr->r_sights < MAX_SHORT) r_ptr->r_sights++;
-
/* Disturb on appearance */
- if (disturb_move)
+ if (options->disturb_move)
{
- if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1);
+ if (options->disturb_pets || (is_friend(m_ptr) <= 0))
+ {
+ disturb();
+ }
}
}
-
- /* Apply telepathy */
- if (hard)
- {
- /* Hack -- Memorize mental flags */
- if (r_ptr->flags2 & (RF2_SMART)) r_ptr->r_flags2 |= (RF2_SMART);
- if (r_ptr->flags2 & (RF2_STUPID)) r_ptr->r_flags2 |= (RF2_STUPID);
- }
-
- /* Memorize various observable flags */
- if (do_empty_mind) r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
- if (do_weird_mind) r_ptr->r_flags2 |= (RF2_WEIRD_MIND);
- if (do_cold_blood) r_ptr->r_flags2 |= (RF2_COLD_BLOOD);
- if (do_invisible) r_ptr->r_flags2 |= (RF2_INVISIBLE);
}
/* The monster is not visible */
@@ -1926,9 +1795,12 @@ void update_mon(int m_idx, bool_ full)
p_ptr->window |= (PW_M_LIST);
/* Disturb on disappearance*/
- if (disturb_move)
+ if (options->disturb_move)
{
- if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1);
+ if (options->disturb_pets || (is_friend(m_ptr) <= 0))
+ {
+ disturb();
+ }
}
}
}
@@ -1940,7 +1812,7 @@ void update_mon(int m_idx, bool_ full)
if (m_ptr->ml != old_ml)
{
- if (r_ptr->flags2 & RF2_ELDRITCH_HORROR)
+ if (r_ptr->flags & RF_ELDRITCH_HORROR)
{
sanity_blast(m_ptr, FALSE);
}
@@ -1953,9 +1825,12 @@ void update_mon(int m_idx, bool_ full)
m_ptr->mflag |= (MFLAG_VIEW);
/* Disturb on appearance */
- if (disturb_near)
+ if (options->disturb_near)
{
- if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1);
+ if (options->disturb_pets || (is_friend(m_ptr) <= 0))
+ {
+ disturb();
+ }
}
}
@@ -1974,9 +1849,12 @@ void update_mon(int m_idx, bool_ full)
p_ptr->window |= (PW_M_LIST);
/* Disturb on disappearance */
- if (disturb_near)
+ if (options->disturb_near)
{
- if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1);
+ if (options->disturb_pets || (is_friend(m_ptr) <= 0))
+ {
+ disturb();
+ }
}
}
}
@@ -2008,7 +1886,9 @@ void update_monsters(bool_ full)
void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr)
{
- object_type *o_ptr;
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+ auto &random_artifacts = game->random_artifacts;
/* Get new object */
int o_idx = o_pop();
@@ -2016,7 +1896,7 @@ void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr)
if (o_idx)
{
/* Get the item */
- o_ptr = &o_list[o_idx];
+ object_type *o_ptr = &o_list[o_idx];
/* Structure copy */
object_copy(o_ptr, q_ptr);
@@ -2036,7 +1916,7 @@ void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr)
{
a_info[q_ptr->name1].cur_num = 0;
}
- else if (k_info[q_ptr->k_idx].flags3 & TR3_NORM_ART)
+ else if (k_info[q_ptr->k_idx].flags & TR_NORM_ART)
{
k_info[q_ptr->k_idx].artifact = 0;
}
@@ -2074,8 +1954,10 @@ static int possible_randart[] =
bool_ kind_is_randart(int k_idx)
{
+ auto const &k_info = game->edit_data.k_info;
+
int max;
- object_kind *k_ptr = &k_info[k_idx];
+ auto k_ptr = &k_info[k_idx];
if (!kind_is_legal(k_idx)) return (FALSE);
@@ -2111,6 +1993,9 @@ bool_ place_monster_one_no_drop = FALSE;
static s16b hack_m_idx_ii = 0;
s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
{
+ auto &r_info = game->edit_data.r_info;
+ auto &alloc = game->alloc;
+
int i;
char dummy[5];
bool_ add_level = FALSE;
@@ -2180,7 +2065,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
/* Check for original monster race flags */
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
/* Paranoia */
if (!r_ptr->name)
@@ -2198,7 +2083,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
}
/* Ego Uniques are NOT to be created */
- if ((r_ptr->flags1 & RF1_UNIQUE) && ego)
+ if ((r_ptr->flags & RF_UNIQUE) && ego)
{
return 0;
}
@@ -2215,28 +2100,28 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
}
/* Unallow some uniques to be generated outside of their quests/special levels/dungeons */
- if ((r_ptr->flags9 & RF9_SPECIAL_GENE) && (!m_allow_special[r_idx]))
+ if ((r_ptr->flags & RF_SPECIAL_GENE) && (!m_allow_special[r_idx]))
{
if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster(%d): SPECIAL_GENE", r_idx);
return 0;
}
/* Disallow Spirits in The Void, now this *IS* an ugly hack, I hate to do it ... */
- if ((r_ptr->flags7 & RF7_SPIRIT) && (dungeon_type != DUNGEON_VOID))
+ if ((r_ptr->flags & RF_SPIRIT) && (dungeon_type != DUNGEON_VOID))
{
if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster(%d): SPIRIT in non VOID", r_idx);
return 0;
}
/* Fully forbid it */
- if (r_ptr->flags9 & RF9_NEVER_GENE)
+ if (r_ptr->flags & RF_NEVER_GENE)
{
if (wizard) cmsg_print(TERM_L_RED, "WARNING: Refused monster: NEVER_GENE");
return 0;
}
/* Hack -- "unique" monsters must be "unique" */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->max_num == -1) && (!m_allow_special[r_idx]))
+ if ((r_ptr->flags & RF_UNIQUE) && (r_ptr->max_num == -1) && (!m_allow_special[r_idx]))
{
/* Cannot create */
if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster %d: unique not unique", r_idx);
@@ -2251,7 +2136,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
}
/* Hack -- "unique" monsters must be "unique" */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num))
+ if ((r_ptr->flags & RF_UNIQUE) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num))
{
/* Cannot create */
if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster %d: cur_num >= max_num", r_idx);
@@ -2259,7 +2144,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
}
/* Depth monsters may NOT be created out of depth */
- if ((r_ptr->flags1 & (RF1_FORCE_DEPTH)) && (dun_level < r_ptr->level))
+ if ((r_ptr->flags & RF_FORCE_DEPTH) && (dun_level < r_ptr->level))
{
/* Cannot create */
if (wizard) cmsg_print(TERM_L_RED, "WARNING: FORCE_DEPTH");
@@ -2270,10 +2155,13 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
if (r_ptr->level > dun_level)
{
/* Unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
/* Message for cheaters */
- if ((cheat_hear) || (p_ptr->precognition)) msg_format("Deep Unique (%s).", r_ptr->name);
+ if (options->cheat_hear || p_ptr->precognition)
+ {
+ msg_format("Deep Unique (%s).", r_ptr->name);
+ }
/* Boost rating by twice delta-depth */
rating += (r_ptr->level - dun_level) * 2;
@@ -2283,7 +2171,10 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
else
{
/* Message for cheaters */
- if ((cheat_hear) || (p_ptr->precognition)) msg_format("Deep Monster (%s).", r_ptr->name);
+ if (options->cheat_hear || p_ptr->precognition)
+ {
+ msg_format("Deep Monster (%s).", r_ptr->name);
+ }
/* Boost rating by delta-depth */
rating += (r_ptr->level - dun_level);
@@ -2291,10 +2182,13 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
}
/* Note the monster */
- else if (r_ptr->flags1 & (RF1_UNIQUE))
+ else if (r_ptr->flags & RF_UNIQUE)
{
/* Unique monsters induce message */
- if ((cheat_hear) || (p_ptr->precognition)) msg_format("Unique (%s).", r_ptr->name);
+ if (options->cheat_hear || p_ptr->precognition)
+ {
+ msg_format("Unique (%s).", r_ptr->name);
+ }
}
@@ -2346,11 +2240,11 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
m_ptr->status = status;
/* Friendly? */
- if (m_ptr->status < MSTATUS_FRIEND && r_ptr->flags7 & RF7_PET)
+ if (m_ptr->status < MSTATUS_FRIEND && r_ptr->flags & RF_PET)
{
m_ptr->status = MSTATUS_FRIEND;
}
- if (m_ptr->status < MSTATUS_NEUTRAL && r_ptr->flags7 & RF7_NEUTRAL)
+ if (m_ptr->status < MSTATUS_NEUTRAL && r_ptr->flags & RF_NEUTRAL)
{
m_ptr->status = MSTATUS_NEUTRAL;
}
@@ -2369,12 +2263,12 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
/* Only if not fated to die */
if ((dungeon_type != DUNGEON_DEATH) && (!place_monster_one_no_drop))
{
- const bool_ good = (r_ptr->flags1 & (RF1_DROP_GOOD)) ? TRUE : FALSE;
- const bool_ great = (r_ptr->flags1 & (RF1_DROP_GREAT)) ? TRUE : FALSE;
+ const bool_ good = (r_ptr->flags & RF_DROP_GOOD) ? TRUE : FALSE;
+ const bool_ great = (r_ptr->flags & RF_DROP_GREAT) ? TRUE : FALSE;
- const bool_ do_gold = (!(r_ptr->flags1 & (RF1_ONLY_ITEM)));
- const bool_ do_item = (!(r_ptr->flags1 & (RF1_ONLY_GOLD)));
- const bool_ do_mimic = (r_ptr->flags9 & (RF9_MIMIC));
+ auto const do_gold = (r_ptr->flags & RF_ONLY_ITEM).empty();
+ auto const do_item = (r_ptr->flags & RF_ONLY_GOLD).empty();
+ auto const do_mimic = bool(r_ptr->flags & RF_MIMIC);
const int force_coin = get_coin_type(r_ptr);
@@ -2389,31 +2283,25 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
object_level = (dun_level + r_ptr->level) / 2;
/* Determine how much we can drop */
- if ((r_ptr->flags1 & (RF1_DROP_60)) && (rand_int(100) < 60)) number++;
- if ((r_ptr->flags1 & (RF1_DROP_90)) && (rand_int(100) < 90)) number++;
- if (r_ptr->flags1 & (RF1_DROP_1D2)) number += damroll(1, 2);
- if (r_ptr->flags1 & (RF1_DROP_2D2)) number += damroll(2, 2);
- if (r_ptr->flags1 & (RF1_DROP_3D2)) number += damroll(3, 2);
- if (r_ptr->flags1 & (RF1_DROP_4D2)) number += damroll(4, 2);
- if (r_ptr->flags9 & (RF9_MIMIC)) number = 1;
+ if ((r_ptr->flags & RF_DROP_60) && (rand_int(100) < 60)) number++;
+ if ((r_ptr->flags & RF_DROP_90) && (rand_int(100) < 90)) number++;
+ if (r_ptr->flags & RF_DROP_1D2) number += damroll(1, 2);
+ if (r_ptr->flags & RF_DROP_2D2) number += damroll(2, 2);
+ if (r_ptr->flags & RF_DROP_3D2) number += damroll(3, 2);
+ if (r_ptr->flags & RF_DROP_4D2) number += damroll(4, 2);
+ if (r_ptr->flags & RF_MIMIC) number = 1;
/* Hack -- handle creeping coins */
coin_type = force_coin;
- if (r_ptr->flags7 & RF7_DROP_RANDART)
+ if (r_ptr->flags & RF_DROP_RANDART)
{
int tries = 1000;
- obj_theme theme;
-
/* Get local object */
q_ptr = &forge;
- theme.treasure = 101;
- theme.combat = 101;
- theme.magic = 101;
- theme.tools = 101;
-
- init_match_theme(theme);
+ /* No theme */
+ init_match_theme(obj_theme::no_theme());
/* Apply restriction */
get_obj_num_hook = kind_is_legal;
@@ -2433,7 +2321,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
}
/* Invalidate the cached allocation table */
- alloc_kind_table_valid = FALSE;
+ alloc.kind_table_valid = false;
if (tries)
{
@@ -2511,7 +2399,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
/* Assign maximal hitpoints */
- if (r_ptr->flags1 & (RF1_FORCE_MAXHP))
+ if (r_ptr->flags & RF_FORCE_MAXHP)
{
m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
}
@@ -2540,7 +2428,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
m_ptr->mspeed = m_ptr->speed;
/* Hack -- small racial variety */
- if (!(r_ptr->flags1 & (RF1_UNIQUE)))
+ if (!(r_ptr->flags & RF_UNIQUE))
{
/* Allow some small variation per monster */
i = extract_energy[m_ptr->speed] / 10;
@@ -2548,18 +2436,18 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
}
- if (dungeon_flags2 & DF2_ADJUST_LEVEL_1_2)
+ if (dungeon_flags & DF_ADJUST_LEVEL_1_2)
{
min_level = max_level = dun_level / 2;
add_level = TRUE;
}
- if (dungeon_flags1 & DF1_ADJUST_LEVEL_1)
+ if (dungeon_flags & DF_ADJUST_LEVEL_1)
{
if (!min_level) min_level = dun_level;
max_level = dun_level;
add_level = TRUE;
}
- if (dungeon_flags1 & DF1_ADJUST_LEVEL_2)
+ if (dungeon_flags & DF_ADJUST_LEVEL_2)
{
if (!min_level) min_level = dun_level * 2;
max_level = dun_level * 2;
@@ -2571,7 +2459,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
m_ptr->energy = (byte)rand_int(100);
/* Force monster to wait for player */
- if (r_ptr->flags1 & (RF1_FORCE_SLEEP))
+ if (r_ptr->flags & RF_FORCE_SLEEP)
{
/* Monster is still being nice */
m_ptr->mflag |= (MFLAG_NICE);
@@ -2593,23 +2481,23 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
/* Hack -- Count the number of "reproducers" */
- if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro++;
+ if (r_ptr->spells & SF_MULTIPLY) num_repro++;
/* Hack -- Notice new multi-hued monsters */
- if (r_ptr->flags1 & (RF1_ATTR_MULTI)) shimmer_monsters = TRUE;
+ if (r_ptr->flags & RF_ATTR_MULTI) shimmer_monsters = TRUE;
/* Count monsters on the level */
{
/* Hack -- we need to modify the REAL r_info, not the fake one */
- monster_race *r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
/* Hack -- Count the monsters on the level */
r_ptr->cur_num++;
}
/* Unique monsters on saved levels should be "marked" */
- if ((r_ptr->flags1 & RF1_UNIQUE) && get_dungeon_save(dummy))
+ if ((r_ptr->flags & RF_UNIQUE) && get_dungeon_save(dummy))
{
r_ptr->on_saved = TRUE;
}
@@ -2636,7 +2524,9 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
*/
static bool_ place_monster_group(int y, int x, int r_idx, bool_ slp, int status)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
int old, n, i;
int total = 0, extra = 0;
@@ -2731,9 +2621,10 @@ static int place_monster_idx = 0;
*/
static bool_ place_monster_okay(int r_idx)
{
- monster_race *r_ptr = &r_info[place_monster_idx];
+ auto const &r_info = game->edit_data.r_info;
- monster_race *z_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[place_monster_idx];
+ auto z_ptr = &r_info[r_idx];
/* Hack - Escorts have to have the same dungeon flag */
if (monster_dungeon(place_monster_idx) != monster_dungeon(r_idx)) return (FALSE);
@@ -2745,7 +2636,7 @@ static bool_ place_monster_okay(int r_idx)
if (z_ptr->level > r_ptr->level) return (FALSE);
/* Skip unique monsters */
- if (z_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
+ if (z_ptr->flags & RF_UNIQUE) return (FALSE);
/* Paranoia -- Skip identical monsters */
if (place_monster_idx == r_idx) return (FALSE);
@@ -2775,8 +2666,10 @@ static bool_ place_monster_okay(int r_idx)
*/
bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status)
{
+ auto const &r_info = game->edit_data.r_info;
+
int i;
- monster_race *r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
bool_ (*old_get_mon_num_hook)(int r_idx);
@@ -2789,15 +2682,15 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu
/* Friends for certain monsters */
- if (r_ptr->flags1 & (RF1_FRIENDS))
+ if (r_ptr->flags & RF_FRIENDS)
{
/* Attempt to place a group */
- (void)place_monster_group(y, x, r_idx, slp, status);
+ place_monster_group(y, x, r_idx, slp, status);
}
/* Escorts for certain monsters */
- if (r_ptr->flags1 & (RF1_ESCORT))
+ if (r_ptr->flags & RF_ESCORT)
{
old_get_mon_num_hook = get_mon_num_hook;
@@ -2842,11 +2735,11 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu
place_monster_one(ny, nx, z, pick_ego_monster(&r_info[z]), slp, status);
/* Place a "group" of escorts if needed */
- if ((r_info[z].flags1 & (RF1_FRIENDS)) ||
- (r_ptr->flags1 & (RF1_ESCORTS)))
+ if ((r_info[z].flags & RF_FRIENDS) ||
+ (r_ptr->flags & RF_ESCORTS))
{
/* Place a group of monsters */
- (void)place_monster_group(ny, nx, z, slp, status);
+ place_monster_group(ny, nx, z, slp, status);
}
}
@@ -2899,9 +2792,11 @@ bool_ place_monster(int y, int x, bool_ slp, bool_ grp)
bool_ alloc_horde(int y, int x)
{
+ auto const &r_info = game->edit_data.r_info;
+
int r_idx = 0;
- monster_race * r_ptr = NULL;
- monster_type * m_ptr;
+ monster_race const *r_ptr = NULL;
+ monster_type *m_ptr;
int attempts = 1000;
set_mon_num2_hook(y, x);
@@ -2919,8 +2814,8 @@ bool_ alloc_horde(int y, int x)
r_ptr = &r_info[r_idx];
- if (!(r_ptr->flags1 & (RF1_UNIQUE))
- && !(r_ptr->flags1 & (RF1_ESCORTS)))
+ if (!(r_ptr->flags & RF_UNIQUE)
+ && !(r_ptr->flags & RF_ESCORTS))
break;
}
@@ -2948,7 +2843,7 @@ bool_ alloc_horde(int y, int x)
for (attempts = randint(10) + 5; attempts; attempts--)
{
- (void) summon_specific(m_ptr->fy, m_ptr->fx, dun_level, SUMMON_KIN);
+ summon_specific(m_ptr->fy, m_ptr->fx, dun_level, SUMMON_KIN);
}
return TRUE;
@@ -2984,7 +2879,7 @@ bool_ alloc_monster(int dis, bool_ slp)
if (!attempts_left)
{
- if (cheat_xtra || cheat_hear)
+ if (options->cheat_xtra || options->cheat_hear)
{
msg_print("Warning! Could not allocate a new monster. Small level?");
}
@@ -2997,7 +2892,10 @@ bool_ alloc_monster(int dis, bool_ slp)
{
if (alloc_horde(y, x))
{
- if ((cheat_hear) || (p_ptr->precognition)) msg_print("Monster horde.");
+ if (options->cheat_hear || p_ptr->precognition)
+ {
+ msg_print("Monster horde.");
+ }
return (TRUE);
}
}
@@ -3027,7 +2925,9 @@ static int summon_specific_type = 0;
*/
static bool_ summon_specific_okay(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
bool_ okay = FALSE;
@@ -3043,56 +2943,56 @@ static bool_ summon_specific_okay(int r_idx)
case SUMMON_ANT:
{
okay = ((r_ptr->d_char == 'a') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_SPIDER:
{
okay = ((r_ptr->d_char == 'S') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_HOUND:
{
okay = (((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z')) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_HYDRA:
{
okay = ((r_ptr->d_char == 'M') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_ANGEL:
{
okay = ((r_ptr->d_char == 'A') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_DEMON:
{
- okay = ((r_ptr->flags3 & (RF3_DEMON)) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ okay = ((r_ptr->flags & RF_DEMON) &&
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_UNDEAD:
{
- okay = ((r_ptr->flags3 & (RF3_UNDEAD)) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ okay = ((r_ptr->flags & RF_UNDEAD) &&
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_DRAGON:
{
- okay = ((r_ptr->flags3 & (RF3_DRAGON)) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ okay = ((r_ptr->flags & RF_DRAGON) &&
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
@@ -3124,40 +3024,40 @@ static bool_ summon_specific_okay(int r_idx)
case SUMMON_UNIQUE:
{
- okay = (r_ptr->flags1 & (RF1_UNIQUE)) ? TRUE : FALSE;
+ okay = (r_ptr->flags & RF_UNIQUE) ? TRUE : FALSE;
break;
}
case SUMMON_BIZARRE1:
{
okay = ((r_ptr->d_char == 'm') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_BIZARRE2:
{
okay = ((r_ptr->d_char == 'b') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_BIZARRE3:
{
okay = ((r_ptr->d_char == 'Q') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_BIZARRE4:
{
okay = ((r_ptr->d_char == 'v') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_BIZARRE5:
{
okay = ((r_ptr->d_char == '$') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
@@ -3168,15 +3068,15 @@ static bool_ summon_specific_okay(int r_idx)
(r_ptr->d_char == '=') ||
(r_ptr->d_char == '$') ||
(r_ptr->d_char == '|')) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_HI_DEMON:
{
- okay = ((r_ptr->flags3 & (RF3_DEMON)) &&
+ okay = ((r_ptr->flags & RF_DEMON) &&
(r_ptr->d_char == 'U') &&
- !(r_ptr->flags1 & RF1_UNIQUE));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
@@ -3184,34 +3084,34 @@ static bool_ summon_specific_okay(int r_idx)
case SUMMON_KIN:
{
okay = ((r_ptr->d_char == summon_kin_type) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_DAWN:
{
okay = ((strstr(r_ptr->name, "the Dawn")) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_ANIMAL:
{
- okay = ((r_ptr->flags3 & (RF3_ANIMAL)) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ okay = ((r_ptr->flags & RF_ANIMAL) &&
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_ANIMAL_RANGER:
{
- okay = ((r_ptr->flags3 & (RF3_ANIMAL)) &&
+ okay = ((r_ptr->flags & RF_ANIMAL) &&
(strchr("abcflqrwBCIJKMRS", r_ptr->d_char)) &&
- !(r_ptr->flags3 & (RF3_DRAGON)) &&
- !(r_ptr->flags3 & (RF3_EVIL)) &&
- !(r_ptr->flags3 & (RF3_UNDEAD)) &&
- !(r_ptr->flags3 & (RF3_DEMON)) &&
- !(r_ptr->flags4 || r_ptr->flags5 || r_ptr->flags6) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_DRAGON) &&
+ !(r_ptr->flags & RF_EVIL) &&
+ !(r_ptr->flags & RF_UNDEAD) &&
+ !(r_ptr->flags & RF_DEMON) &&
+ !r_ptr->spells &&
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
@@ -3220,87 +3120,87 @@ static bool_ summon_specific_okay(int r_idx)
okay = (((r_ptr->d_char == 'L') ||
(r_ptr->d_char == 'V') ||
(r_ptr->d_char == 'W')) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_HI_DRAGON_NO_UNIQUES:
{
okay = ((r_ptr->d_char == 'D') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_NO_UNIQUES:
{
- okay = (!(r_ptr->flags1 & (RF1_UNIQUE)));
+ okay = (!(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_PHANTOM:
{
okay = ((strstr(r_ptr->name, "Phantom")) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_ELEMENTAL:
{
okay = ((strstr(r_ptr->name, "lemental")) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_THUNDERLORD:
{
- okay = (r_ptr->flags3 & RF3_THUNDERLORD) ? TRUE : FALSE;
+ okay = (r_ptr->flags & RF_THUNDERLORD) ? TRUE : FALSE;
break;
}
case SUMMON_BLUE_HORROR:
{
okay = ((strstr(r_ptr->name, "lue horror")) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_BUG:
{
okay = ((strstr(r_ptr->name, "Software bug")) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_RNG:
{
okay = ((strstr(r_ptr->name, "Random Number Generator")) &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_MINE:
{
- okay = (r_ptr->flags1 & RF1_NEVER_MOVE) ? TRUE : FALSE;
+ okay = (r_ptr->flags & RF_NEVER_MOVE) ? TRUE : FALSE;
break;
}
case SUMMON_HUMAN:
{
okay = ((r_ptr->d_char == 'p') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_SHADOWS:
{
okay = ((r_ptr->d_char == 'G') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
case SUMMON_QUYLTHULG:
{
okay = ((r_ptr->d_char == 'Q') &&
- !(r_ptr->flags1 & (RF1_UNIQUE)));
+ !(r_ptr->flags & RF_UNIQUE));
break;
}
@@ -3602,14 +3502,16 @@ void monster_swap(int y1, int x1, int y2, int x2)
*/
static bool_ mutate_monster_okay(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
bool_ okay = FALSE;
/* Hack - Only summon dungeon monsters */
if (!monster_dungeon(r_idx)) return (FALSE);
- okay = ((r_ptr->d_char == summon_kin_type) && !(r_ptr->flags1 & (RF1_UNIQUE))
+ okay = ((r_ptr->d_char == summon_kin_type) && !(r_ptr->flags & RF_UNIQUE)
&& (r_ptr->level >= dun_level));
return okay;
@@ -3822,22 +3724,33 @@ void message_pain(int m_idx, int dam)
*/
void update_smart_learn(int m_idx, int what)
{
- monster_type *m_ptr = &m_list[m_idx];
-
/* Not allowed to learn */
- if (!smart_learn) return;
+ if (!options->smart_learn)
+ {
+ return;
+ }
+
+ /* Fast path for DRS_NONE */
+ if (what == DRS_NONE)
+ {
+ return;
+ }
/* Get racial flags */
+ auto m_ptr = &m_list[m_idx];
auto const r_ptr = m_ptr->race();
/* Too stupid to learn anything */
- if (r_ptr->flags2 & (RF2_STUPID)) return;
+ if (r_ptr->flags & RF_STUPID)
+ {
+ return;
+ }
/* Not intelligent, only learn sometimes */
- if (!(r_ptr->flags2 & (RF2_SMART)) && magik(50)) return;
-
-
- /* XXX XXX XXX */
+ if (!(r_ptr->flags & RF_SMART) && magik(50))
+ {
+ return;
+ }
/* Analyze the knowledge */
switch (what)
diff --git a/src/monster2.hpp b/src/monster2.hpp
index 84f79e36..ddd0b6bc 100644
--- a/src/monster2.hpp
+++ b/src/monster2.hpp
@@ -6,47 +6,45 @@
#include "object_type_fwd.hpp"
#include <memory>
-extern s32b monster_exp(s16b level);
-extern void monster_set_level(int m_idx, int level);
-extern s32b modify_aux(s32b a, s32b b, char mod);
-extern void monster_msg_simple(cptr s);
-extern bool_ mego_ok(monster_race const *r_ptr, int ego);
-extern void monster_check_experience(int m_idx, bool_ silent);
-extern void monster_gain_exp(int m_idx, u32b exp, bool_ silent);
-extern std::shared_ptr<monster_race> race_info_idx(int r_idx, int ego);
-extern void delete_monster_idx(int i);
-extern void delete_monster(int y, int x);
-extern void compact_monsters(int size);
-extern void wipe_m_list(void);
-extern s16b m_pop(void);
-extern errr get_mon_num_prep(void);
-extern s16b get_mon_num(int level);
-extern void monster_desc(char *desc, monster_type *m_ptr, int mode);
-extern void monster_race_desc(char *desc, int r_idx, int ego);
-extern void lore_do_probe(int m_idx);
-extern void lore_treasure(int m_idx, int num_item, int num_gold);
-extern void update_mon(int m_idx, bool_ full);
-extern void update_monsters(bool_ full);
-extern void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr);
+s32b monster_exp(s16b level);
+void monster_set_level(int m_idx, int level);
+s32b modify_aux(s32b a, s32b b, char mod);
+void monster_msg_simple(cptr s);
+bool_ mego_ok(monster_race const *r_ptr, int ego);
+void monster_check_experience(int m_idx, bool_ silent);
+void monster_gain_exp(int m_idx, u32b exp, bool_ silent);
+std::shared_ptr<monster_race> race_info_idx(int r_idx, int ego);
+void delete_monster_idx(int i);
+void delete_monster(int y, int x);
+void compact_monsters(int size);
+void wipe_m_list();
+s16b m_pop();
+errr get_mon_num_prep();
+s16b get_mon_num(int level);
+void monster_desc(char *desc, monster_type *m_ptr, int mode);
+void monster_race_desc(char *desc, int r_idx, int ego);
+void update_mon(int m_idx, bool_ full);
+void update_monsters(bool_ full);
+void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr);
extern bool_ bypass_r_ptr_max_num ;
-extern bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status);
-extern bool_ place_monster(int y, int x, bool_ slp, bool_ grp);
-extern bool_ alloc_horde(int y, int x);
-extern bool_ alloc_monster(int dis, bool_ slp);
+bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status);
+bool_ place_monster(int y, int x, bool_ slp, bool_ grp);
+bool_ alloc_horde(int y, int x);
+bool_ alloc_monster(int dis, bool_ slp);
extern int summon_specific_level;
-extern bool_ summon_specific(int y1, int x1, int lev, int type);
-extern void monster_swap(int y1, int x1, int y2, int x2);
-extern bool_ multiply_monster(int m_idx, bool_ charm, bool_ clone);
+bool_ summon_specific(int y1, int x1, int lev, int type);
+void monster_swap(int y1, int x1, int y2, int x2);
+bool_ multiply_monster(int m_idx, bool_ charm, bool_ clone);
extern bool_ hack_message_pain_may_silent;
-extern void message_pain(int m_idx, int dam);
-extern void update_smart_learn(int m_idx, int what);
-extern bool_ summon_specific_friendly(int y1, int x1, int lev, int type, bool_ Group_ok);
+void message_pain(int m_idx, int dam);
+void update_smart_learn(int m_idx, int what);
+bool_ summon_specific_friendly(int y1, int x1, int lev, int type, bool_ Group_ok);
extern bool_ place_monster_one_no_drop;
-extern s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status);
-extern s16b player_place(int y, int x);
-extern void monster_drop_carried_objects(monster_type *m_ptr);
-extern bool_ monster_dungeon(int r_idx);
-extern bool_ monster_quest(int r_idx);
-extern void set_mon_num_hook(void);
-extern void set_mon_num2_hook(int y, int x);
-extern bool_ monster_can_cross_terrain(byte feat, std::shared_ptr<monster_race> r_ptr);
+s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status);
+s16b player_place(int y, int x);
+void monster_drop_carried_objects(monster_type *m_ptr);
+bool_ monster_dungeon(int r_idx);
+bool_ monster_quest(int r_idx);
+void set_mon_num_hook();
+void set_mon_num2_hook(int y, int x);
+bool_ monster_can_cross_terrain(byte feat, std::shared_ptr<monster_race> r_ptr);
diff --git a/src/monster3.cc b/src/monster3.cc
index 0d26538c..6dd1f74e 100644
--- a/src/monster3.cc
+++ b/src/monster3.cc
@@ -10,10 +10,14 @@
#include "cave_type.hpp"
#include "cmd2.hpp"
+#include "cmd5.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "melee2.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "object2.hpp"
#include "player_type.hpp"
@@ -57,12 +61,16 @@ int is_friend(monster_type *m_ptr)
/* Should they attack each others */
bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr)
{
- monster_race *r_ptr = &r_info[m_ptr->r_idx], *rt_ptr = &r_info[t_ptr->r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[m_ptr->r_idx];
+ auto rt_ptr = &r_info[t_ptr->r_idx];
+
int s1 = is_friend(m_ptr), s2 = is_friend(t_ptr);
/* Monsters hates breeders */
- if ((m_ptr->status != MSTATUS_NEUTRAL) && (rt_ptr->flags4 & RF4_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE;
- if ((t_ptr->status != MSTATUS_NEUTRAL) && (r_ptr->flags4 & RF4_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE;
+ if ((m_ptr->status != MSTATUS_NEUTRAL) && (rt_ptr->spells & SF_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE;
+ if ((t_ptr->status != MSTATUS_NEUTRAL) && (r_ptr->spells & SF_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE;
/* No special conditions, lets test normal flags */
if (s1 && s2 && (s1 == -s2)) return TRUE;
@@ -80,7 +88,7 @@ bool_ change_side(monster_type *m_ptr)
{
case MSTATUS_FRIEND:
m_ptr->status = MSTATUS_ENEMY;
- if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL)))
+ if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL)))
inc_piety(GOD_YAVANNA, -m_ptr->level * 4);
break;
case MSTATUS_NEUTRAL_P:
@@ -91,7 +99,7 @@ bool_ change_side(monster_type *m_ptr)
break;
case MSTATUS_PET:
m_ptr->status = MSTATUS_ENEMY;
- if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL)))
+ if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL)))
inc_piety(GOD_YAVANNA, -m_ptr->level * 4);
break;
case MSTATUS_COMPANION:
@@ -106,7 +114,6 @@ bool_ change_side(monster_type *m_ptr)
bool_ ai_multiply(int m_idx)
{
monster_type *m_ptr = &m_list[m_idx];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
int k, y, x, oy = m_ptr->fy, ox = m_ptr->fx;
bool_ is_frien = (is_friend(m_ptr) > 0);
@@ -134,12 +141,6 @@ bool_ ai_multiply(int m_idx)
/* Try to multiply */
if (multiply_monster(m_idx, (is_frien), FALSE))
{
- /* Take note if visible */
- if (m_ptr->ml)
- {
- r_ptr->r_flags4 |= (RF4_MULTIPLY);
- }
-
/* Multiplying takes energy */
return TRUE;
}
@@ -150,11 +151,13 @@ bool_ ai_multiply(int m_idx)
/* Possessor incarnates */
bool_ ai_possessor(int m_idx, int o_idx)
{
+ auto &r_info = game->edit_data.r_info;
+
object_type *o_ptr = &o_list[o_idx];
monster_type *m_ptr = &m_list[m_idx];
int r_idx = m_ptr->r_idx, r2_idx = o_ptr->pval2;
int i;
- monster_race *r_ptr = &r_info[r2_idx];
+ auto r_ptr = &r_info[r2_idx];
char m_name[80], m_name2[80];
monster_desc(m_name, m_ptr, 0x00);
@@ -180,7 +183,7 @@ bool_ ai_possessor(int m_idx, int o_idx)
m_ptr->csleep = 0;
/* Assign maximal hitpoints */
- if (r_ptr->flags1 & (RF1_FORCE_MAXHP))
+ if (r_ptr->flags & RF_FORCE_MAXHP)
{
m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
}
@@ -211,10 +214,10 @@ bool_ ai_possessor(int m_idx, int o_idx)
m_ptr->energy = 0;
/* Hack -- Count the number of "reproducers" */
- if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro++;
+ if (r_ptr->spells & SF_MULTIPLY) num_repro++;
/* Hack -- Notice new multi-hued monsters */
- if (r_ptr->flags1 & (RF1_ATTR_MULTI)) shimmer_monsters = TRUE;
+ if (r_ptr->flags & RF_ATTR_MULTI) shimmer_monsters = TRUE;
/* Hack -- Count the monsters on the level */
r_ptr->cur_num++;
@@ -230,9 +233,11 @@ bool_ ai_possessor(int m_idx, int o_idx)
void ai_deincarnate(int m_idx)
{
+ auto &r_info = game->edit_data.r_info;
+
monster_type *m_ptr = &m_list[m_idx];
int r2_idx = m_ptr->possessor, r_idx = m_ptr->r_idx;
- monster_race *r_ptr = &r_info[r2_idx];
+ auto r_ptr = &r_info[r2_idx];
int i;
char m_name[80];
@@ -255,7 +260,7 @@ void ai_deincarnate(int m_idx)
m_ptr->csleep = 0;
/* Assign maximal hitpoints */
- if (r_ptr->flags1 & (RF1_FORCE_MAXHP))
+ if (r_ptr->flags & RF_FORCE_MAXHP)
{
m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
}
@@ -286,10 +291,10 @@ void ai_deincarnate(int m_idx)
m_ptr->energy = 0;
/* Hack -- Count the number of "reproducers" */
- if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro++;
+ if (r_ptr->spells & SF_MULTIPLY) num_repro++;
/* Hack -- Notice new multi-hued monsters */
- if (r_ptr->flags1 & (RF1_ATTR_MULTI)) shimmer_monsters = TRUE;
+ if (r_ptr->flags & RF_ATTR_MULTI) shimmer_monsters = TRUE;
/* Hack -- Count the monsters on the level */
r_ptr->cur_num++;
@@ -302,7 +307,7 @@ void ai_deincarnate(int m_idx)
}
/* Returns if a new companion is allowed */
-bool_ can_create_companion(void)
+bool_ can_create_companion()
{
int i, mcnt = 0;
@@ -323,7 +328,7 @@ bool_ can_create_companion(void)
/* Player controlled monsters */
-bool_ do_control_walk(void)
+bool_ do_control_walk()
{
/* Get a "repeated" direction */
if (p_ptr->control)
@@ -344,18 +349,18 @@ bool_ do_control_walk(void)
return FALSE;
}
-bool_ do_control_inven(void)
+bool_ do_control_inven()
{
if (!p_ptr->control) return FALSE;
screen_save();
prt("Carried items", 0, 0);
- (void) show_monster_inven(p_ptr->control);
+ show_monster_inven(p_ptr->control);
inkey();
screen_load();
return TRUE;
}
-bool_ do_control_pickup(void)
+bool_ do_control_pickup()
{
if (!p_ptr->control) return FALSE;
@@ -406,7 +411,7 @@ bool_ do_control_pickup(void)
return TRUE;
}
-bool_ do_control_drop(void)
+bool_ do_control_drop()
{
monster_type *m_ptr = &m_list[p_ptr->control];
@@ -415,16 +420,16 @@ bool_ do_control_drop(void)
return TRUE;
}
-bool_ do_control_magic(void)
+bool_ do_control_magic()
{
- int power = -1;
- int num = 0, i;
- int powers[96];
+ auto const &r_info = game->edit_data.r_info;
+
+ int i;
bool_ flag, redraw;
int ask;
char choice;
char out_val[160];
- monster_race *r_ptr = &r_info[m_list[p_ptr->control].r_idx];
+ auto r_ptr = &r_info[m_list[p_ptr->control].r_idx];
int label;
if (!p_ptr->control) return FALSE;
@@ -437,36 +442,11 @@ bool_ do_control_magic(void)
return TRUE;
}
- /* List the monster powers -- RF4_* */
- for (i = 0; i < 32; i++)
- {
- if (r_ptr->flags4 & BIT(i))
- {
- if (!monster_powers[i].power) continue;
- powers[num++] = i;
- }
- }
-
- /* List the monster powers -- RF5_* */
- for (i = 0; i < 32; i++)
- {
- if (r_ptr->flags5 & BIT(i))
- {
- if (!monster_powers[i + 32].power) continue;
- powers[num++] = i + 32;
- }
- }
-
- /* List the monster powers -- RF6_* */
- for (i = 0; i < 32; i++)
- {
- if (r_ptr->flags6 & BIT(i))
- {
- if (!monster_powers[i + 64].power) continue;
- powers[num++] = i + 64;
- }
- }
+ /* Extract available monster powers */
+ auto powers = extract_monster_powers(r_ptr, true);
+ int const num = powers.size(); // Avoid signed/unsigned warnings
+ /* Are any powers available? */
if (!num)
{
msg_print("You have no powers you can use.");
@@ -475,6 +455,7 @@ bool_ do_control_magic(void)
/* Nothing chosen yet */
flag = FALSE;
+ monster_power const *power = nullptr;
/* No redraw yet */
redraw = FALSE;
@@ -513,7 +494,7 @@ bool_ do_control_magic(void)
while (ctr < num)
{
- monster_power *mp_ptr = &monster_powers[powers[ctr]];
+ monster_power const *mp_ptr = powers[ctr];
label = (ctr < 26) ? I2A(ctr) : I2D(ctr - 26);
@@ -597,7 +578,7 @@ bool_ do_control_magic(void)
char tmp_val[160];
/* Prompt */
- strnfmt(tmp_val, 78, "Use %s? ", monster_powers[power].name);
+ strnfmt(tmp_val, 78, "Use %s? ", power->name);
/* Belay that order */
if (!get_check(tmp_val)) continue;
@@ -618,7 +599,7 @@ bool_ do_control_magic(void)
if (flag)
{
energy_use = 100;
- monst_spell_monst_spell = power + 96;
+ monst_spell_monst_spell = power->monster_spell_index;
}
return TRUE;
}
diff --git a/src/monster3.hpp b/src/monster3.hpp
index 7cf8ccd0..ac26b102 100644
--- a/src/monster3.hpp
+++ b/src/monster3.hpp
@@ -3,18 +3,18 @@
#include "h-basic.h"
#include "monster_type_fwd.hpp"
-extern void dump_companions(FILE *outfile);
-extern void do_cmd_companion(void);
-extern bool_ do_control_reconnect(void);
-extern bool_ do_control_drop(void);
-extern bool_ do_control_magic(void);
-extern bool_ do_control_pickup(void);
-extern bool_ do_control_inven(void);
-extern bool_ do_control_walk(void);
-extern bool_ can_create_companion(void);
-extern void ai_deincarnate(int m_idx);
-extern bool_ ai_possessor(int m_idx, int o_idx);
-extern bool_ ai_multiply(int m_idx);
-extern bool_ change_side(monster_type *m_ptr);
-extern int is_friend(monster_type *m_ptr);
-extern bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr);
+void dump_companions(FILE *outfile);
+void do_cmd_companion();
+bool_ do_control_reconnect();
+bool_ do_control_drop();
+bool_ do_control_magic();
+bool_ do_control_pickup();
+bool_ do_control_inven();
+bool_ do_control_walk();
+bool_ can_create_companion();
+void ai_deincarnate(int m_idx);
+bool_ ai_possessor(int m_idx, int o_idx);
+bool_ ai_multiply(int m_idx);
+bool_ change_side(monster_type *m_ptr);
+int is_friend(monster_type *m_ptr);
+bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr);
diff --git a/src/monster_blow.hpp b/src/monster_blow.hpp
index 0f19f64c..6e0ee6e5 100644
--- a/src/monster_blow.hpp
+++ b/src/monster_blow.hpp
@@ -12,8 +12,8 @@
*/
struct monster_blow
{
- byte method;
- byte effect;
- byte d_dice;
- byte d_side;
+ byte method = 0;
+ byte effect = 0;
+ byte d_dice = 0;
+ byte d_side = 0;
};
diff --git a/src/monster_ego.hpp b/src/monster_ego.hpp
index 00464c2e..b578d03e 100644
--- a/src/monster_ego.hpp
+++ b/src/monster_ego.hpp
@@ -2,80 +2,68 @@
#include "h-basic.h"
#include "monster_blow.hpp"
+#include "monster_race_flag_set.hpp"
+#include "monster_spell_flag_set.hpp"
+
+#include <array>
/**
* Monster ego descriptors.
*/
struct monster_ego
{
- const char *name; /* Name */
- bool_ before; /* Display ego before or after */
+ const char *name = nullptr; /* Name */
+ bool_ before = false; /* Display ego before or after */
- monster_blow blow[4]; /* Up to four blows per round */
- byte blowm[4][2];
+ std::array<monster_blow, 4> blow { }; /* Up to four blows per round */
+ byte blowm[4][2] = {
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 }
+ };
- s16b hdice; /* Creatures hit dice count */
- s16b hside; /* Creatures hit dice sides */
+ s16b hdice = 0; /* Creatures hit dice count */
+ s16b hside = 0; /* Creatures hit dice sides */
- s16b ac; /* Armour Class */
+ s16b ac = 0; /* Armour Class */
- s16b sleep; /* Inactive counter (base) */
- s16b aaf; /* Area affect radius (1-100) */
- s16b speed; /* Speed (normally 110) */
+ s16b sleep = 0; /* Inactive counter (base) */
+ s16b aaf = 0; /* Area affect radius (1-100) */
+ s16b speed = 0; /* Speed (normally 110) */
- s32b mexp; /* Exp value for kill */
+ s32b mexp = 0; /* Exp value for kill */
- s32b weight; /* Weight of the monster */
+ s32b weight = 0; /* Weight of the monster */
- byte freq_inate; /* Inate spell frequency */
- byte freq_spell; /* Other spell frequency */
+ byte freq_inate = 0; /* Inate spell frequency */
+ byte freq_spell = 0; /* Other spell frequency */
/* Ego flags */
- u32b flags1; /* Flags 1 */
- u32b flags2; /* Flags 1 */
- u32b flags3; /* Flags 1 */
- u32b flags7; /* Flags 1 */
- u32b flags8; /* Flags 1 */
- u32b flags9; /* Flags 1 */
- u32b hflags1; /* Flags 1 */
- u32b hflags2; /* Flags 1 */
- u32b hflags3; /* Flags 1 */
- u32b hflags7; /* Flags 1 */
- u32b hflags8; /* Flags 1 */
- u32b hflags9; /* Flags 1 */
+ monster_race_flag_set flags;
+ monster_race_flag_set hflags;
/* Monster flags */
- u32b mflags1; /* Flags 1 (general) */
- u32b mflags2; /* Flags 2 (abilities) */
- u32b mflags3; /* Flags 3 (race/resist) */
- u32b mflags4; /* Flags 4 (inate/breath) */
- u32b mflags5; /* Flags 5 (normal spells) */
- u32b mflags6; /* Flags 6 (special spells) */
- u32b mflags7; /* Flags 7 (movement related abilities) */
- u32b mflags8; /* Flags 8 (wilderness info) */
- u32b mflags9; /* Flags 9 (drops info) */
-
- /* Negative Flags, to be removed from the monster flags */
- u32b nflags1; /* Flags 1 (general) */
- u32b nflags2; /* Flags 2 (abilities) */
- u32b nflags3; /* Flags 3 (race/resist) */
- u32b nflags4; /* Flags 4 (inate/breath) */
- u32b nflags5; /* Flags 5 (normal spells) */
- u32b nflags6; /* Flags 6 (special spells) */
- u32b nflags7; /* Flags 7 (movement related abilities) */
- u32b nflags8; /* Flags 8 (wilderness info) */
- u32b nflags9; /* Flags 9 (drops info) */
-
- s16b level; /* Level of creature */
- s16b rarity; /* Rarity of creature */
-
-
- byte d_attr; /* Default monster attribute */
- char d_char; /* Default monster character */
-
- byte g_attr; /* Overlay graphic attribute */
- char g_char; /* Overlay graphic character */
-
- char r_char[5]; /* Monster race allowed */
- char nr_char[5]; /* Monster race not allowed */
+ monster_race_flag_set mflags;
+
+ /* Monster spells */
+ monster_spell_flag_set mspells;
+
+ /* Negative flags, to be removed from the monster flags */
+ monster_race_flag_set nflags;
+
+ /* Negative spells; to be removed from the monster spells */
+ monster_spell_flag_set nspells;
+
+ s16b level = 0; /* Level of creature */
+ s16b rarity = 0; /* Rarity of creature */
+
+ byte d_attr = 0; /* Default monster attribute */
+ char d_char = '\0'; /* Default monster character */
+
+ byte g_attr = 0; /* Overlay graphic attribute */
+ char g_char = '\0'; /* Overlay graphic character */
+
+ char r_char[5] = { '\0' }; /* Monster race allowed */
+ char nr_char[5] = { '\0' }; /* Monster race not allowed */
};
diff --git a/src/monster_ego_fwd.hpp b/src/monster_ego_fwd.hpp
deleted file mode 100644
index 5b47f3e9..00000000
--- a/src/monster_ego_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct monster_ego;
diff --git a/src/monster_power.hpp b/src/monster_power.hpp
index 03d0f8a9..440d5ba1 100644
--- a/src/monster_power.hpp
+++ b/src/monster_power.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include "monster_power_fwd.hpp"
+
#include "h-basic.h"
/**
@@ -7,7 +9,7 @@
*/
struct monster_power
{
- u32b power; /* Power RF?_xxx */
+ u32b monster_spell_index;
cptr name; /* Name of it */
int mana; /* Mana needed */
bool_ great; /* Need the use of great spells */
diff --git a/src/monster_power_fwd.hpp b/src/monster_power_fwd.hpp
new file mode 100644
index 00000000..975d2d2f
--- /dev/null
+++ b/src/monster_power_fwd.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+struct monster_power;
diff --git a/src/monster_race.hpp b/src/monster_race.hpp
index 7e5d5082..eb398a3d 100644
--- a/src/monster_race.hpp
+++ b/src/monster_race.hpp
@@ -3,8 +3,12 @@
#include "body.hpp"
#include "h-basic.h"
#include "monster_blow.hpp"
+#include "monster_race_flag_set.hpp"
+#include "monster_spell_flag_set.hpp"
#include "obj_theme.hpp"
+#include <array>
+
/**
* Monster race descriptors and runtime data, including racial memories.
*
@@ -26,91 +30,55 @@
*/
struct monster_race
{
- const char *name; /* Name */
- char *text; /* Text */
-
- u16b hdice; /* Creatures hit dice count */
- u16b hside; /* Creatures hit dice sides */
-
- s16b ac; /* Armour Class */
-
- s16b sleep; /* Inactive counter (base) */
- byte aaf; /* Area affect radius (1-100) */
- byte speed; /* Speed (normally 110) */
-
- s32b mexp; /* Exp value for kill */
-
- s32b weight; /* Weight of the monster */
-
- byte freq_inate; /* Inate spell frequency */
- byte freq_spell; /* Other spell frequency */
-
- u32b flags1; /* Flags 1 (general) */
- u32b flags2; /* Flags 2 (abilities) */
- u32b flags3; /* Flags 3 (race/resist) */
- u32b flags4; /* Flags 4 (inate/breath) */
- u32b flags5; /* Flags 5 (normal spells) */
- u32b flags6; /* Flags 6 (special spells) */
- u32b flags7; /* Flags 7 (movement related abilities) */
- u32b flags8; /* Flags 8 (wilderness info) */
- u32b flags9; /* Flags 9 (drops info) */
-
- monster_blow blow[4]; /* Up to four blows per round */
-
- byte body_parts[BODY_MAX]; /* To help to decide what to use when body changing */
+ const char *name = nullptr; /* Name */
+ char *text = nullptr; /* Text */
- byte level; /* Level of creature */
- byte rarity; /* Rarity of creature */
+ u16b hdice = 0; /* Creatures hit dice count */
+ u16b hside = 0; /* Creatures hit dice sides */
+ s16b ac = 0; /* Armour Class */
- byte d_attr; /* Default monster attribute */
- char d_char; /* Default monster character */
+ s16b sleep = 0; /* Inactive counter (base) */
+ byte aaf = 0; /* Area affect radius (1-100) */
+ byte speed = 0; /* Speed (normally 110) */
+ s32b mexp = 0; /* Exp value for kill */
- byte x_attr; /* Desired monster attribute */
- char x_char; /* Desired monster character */
+ s32b weight = 0; /* Weight of the monster */
+ byte freq_inate = 0; /* Inate spell frequency */
+ byte freq_spell = 0; /* Other spell frequency */
- s16b max_num; /* Maximum population allowed per level */
+ monster_race_flag_set flags; /* Flags */
- byte cur_num; /* Monster population on current level */
+ monster_spell_flag_set spells; /* Spells */
+ std::array<monster_blow, 4> blow { }; /* Up to four blows per round */
- s16b r_sights; /* Count sightings of this monster */
- s16b r_deaths; /* Count deaths from this monster */
+ byte body_parts[BODY_MAX] = { 0 }; /* To help to decide what to use when body changing */
- s16b r_pkills; /* Count monsters killed in this life */
- s16b r_tkills; /* Count monsters killed in all lives */
+ byte artifact_idx = 0; /* Artifact index of standard artifact dropped; 0 if none. */
+ int artifact_chance = 0; /* Percentage chance of dropping the artifact. */
- byte r_wake; /* Number of times woken up (?) */
- byte r_ignore; /* Number of times ignored (?) */
+ byte level = 0; /* Level of creature */
+ byte rarity = 0; /* Rarity of creature */
- byte r_xtra1; /* Something (unused) */
- byte r_xtra2; /* Something (unused) */
+ byte d_attr = 0; /* Default monster attribute */
+ char d_char = 0; /* Default monster character */
- byte r_drop_gold; /* Max number of gold dropped at once */
- byte r_drop_item; /* Max number of item dropped at once */
- byte r_cast_inate; /* Max number of inate spells seen */
- byte r_cast_spell; /* Max number of other spells seen */
+ byte x_attr = 0; /* Desired monster attribute */
+ char x_char = 0; /* Desired monster character */
- byte r_blows[4]; /* Number of times each blow type was seen */
+ s16b max_num = 0; /* Maximum population allowed per level */
+ byte cur_num = 0; /* Monster population on current level */
- u32b r_flags1; /* Observed racial flags */
- u32b r_flags2; /* Observed racial flags */
- u32b r_flags3; /* Observed racial flags */
- u32b r_flags4; /* Observed racial flags */
- u32b r_flags5; /* Observed racial flags */
- u32b r_flags6; /* Observed racial flags */
- u32b r_flags7; /* Observed racial flags */
- u32b r_flags8; /* Observed racial flags */
- u32b r_flags9; /* Observed racial flags */
+ s16b r_pkills = 0; /* Count monsters killed in this life */
- bool_ on_saved; /* Is the (unique) on a saved level ? */
+ bool_ on_saved = 0; /* Is the (unique) on a saved level ? */
- byte total_visible; /* Amount of this race that are visible */
+ obj_theme drops; /* The drops type */
- obj_theme drops; /* The drops type */
};
diff --git a/src/monster_race_flag.hpp b/src/monster_race_flag.hpp
new file mode 100644
index 00000000..098e8176
--- /dev/null
+++ b/src/monster_race_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "monster_race_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define RF(tier, index, name) \
+ DECLARE_FLAG(monster_race_flag_set, BOOST_PP_CAT(RF_,name), tier, index)
+#include "monster_race_flag_list.hpp"
+#undef RF
diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp
new file mode 100644
index 00000000..b9d2b079
--- /dev/null
+++ b/src/monster_race_flag_list.hpp
@@ -0,0 +1,152 @@
+/**
+ * X-macro list of all the monster race flags
+ */
+
+/* RF(<tier>, <index>, <name>) */
+
+RF(1, 0, UNIQUE)
+RF(1, 1, QUESTOR)
+RF(1, 2, MALE)
+RF(1, 3, FEMALE)
+RF(1, 4, CHAR_CLEAR)
+RF(1, 5, CHAR_MULTI)
+RF(1, 6, ATTR_CLEAR)
+RF(1, 7, ATTR_MULTI)
+RF(1, 8, FORCE_DEPTH)
+RF(1, 9, FORCE_MAXHP)
+RF(1, 10, FORCE_SLEEP)
+RF(1, 11, FORCE_EXTRA)
+RF(1, 12, FRIEND)
+RF(1, 13, FRIENDS)
+RF(1, 14, ESCORT)
+RF(1, 15, ESCORTS)
+RF(1, 16, NEVER_BLOW)
+RF(1, 17, NEVER_MOVE)
+RF(1, 18, RAND_25)
+RF(1, 19, RAND_50)
+RF(1, 20, ONLY_GOLD)
+RF(1, 21, ONLY_ITEM)
+RF(1, 22, DROP_60)
+RF(1, 23, DROP_90)
+RF(1, 24, DROP_1D2)
+RF(1, 25, DROP_2D2)
+RF(1, 26, DROP_3D2)
+RF(1, 27, DROP_4D2)
+RF(1, 28, DROP_GOOD)
+RF(1, 29, DROP_GREAT)
+RF(1, 30, DROP_USEFUL)
+RF(1, 31, DROP_CHOSEN)
+
+RF(2, 0, STUPID)
+RF(2, 1, SMART)
+RF(2, 2, CAN_SPEAK)
+RF(2, 3, REFLECTING)
+RF(2, 4, INVISIBLE)
+RF(2, 5, COLD_BLOOD)
+RF(2, 6, EMPTY_MIND)
+RF(2, 7, WEIRD_MIND)
+RF(2, 8, DEATH_ORB)
+RF(2, 9, REGENERATE)
+RF(2, 10, SHAPECHANGER)
+RF(2, 11, ATTR_ANY)
+RF(2, 12, POWERFUL)
+RF(2, 13, ELDRITCH_HORROR)
+RF(2, 14, AURA_FIRE)
+RF(2, 15, AURA_ELEC)
+RF(2, 16, OPEN_DOOR)
+RF(2, 17, BASH_DOOR)
+RF(2, 18, PASS_WALL)
+RF(2, 19, KILL_WALL)
+RF(2, 20, MOVE_BODY)
+RF(2, 21, KILL_BODY)
+RF(2, 22, TAKE_ITEM)
+RF(2, 23, KILL_ITEM)
+RF(2, 24, BRAIN_1)
+RF(2, 25, BRAIN_2)
+RF(2, 26, BRAIN_3)
+RF(2, 27, BRAIN_4)
+RF(2, 28, BRAIN_5)
+RF(2, 29, BRAIN_6)
+RF(2, 30, BRAIN_7)
+RF(2, 31, BRAIN_8)
+
+RF(3, 0, ORC)
+RF(3, 1, TROLL)
+RF(3, 2, GIANT)
+RF(3, 3, DRAGON)
+RF(3, 4, DEMON)
+RF(3, 5, UNDEAD)
+RF(3, 6, EVIL)
+RF(3, 7, ANIMAL)
+RF(3, 8, THUNDERLORD)
+RF(3, 9, GOOD)
+RF(3, 10, AURA_COLD)
+RF(3, 11, NONLIVING)
+RF(3, 12, HURT_LITE)
+RF(3, 13, HURT_ROCK)
+RF(3, 14, SUSCEP_FIRE)
+RF(3, 15, SUSCEP_COLD)
+RF(3, 16, IM_ACID)
+RF(3, 17, IM_ELEC)
+RF(3, 18, IM_FIRE)
+RF(3, 19, IM_COLD)
+RF(3, 20, IM_POIS)
+RF(3, 21, RES_TELE)
+RF(3, 22, RES_NETH)
+RF(3, 23, RES_WATE)
+RF(3, 24, RES_PLAS)
+RF(3, 25, RES_NEXU)
+RF(3, 26, RES_DISE)
+RF(3, 28, NO_FEAR)
+RF(3, 29, NO_STUN)
+RF(3, 30, NO_CONF)
+RF(3, 31, NO_SLEEP)
+
+RF(4, 0, AQUATIC)
+RF(4, 1, CAN_SWIM)
+RF(4, 2, CAN_FLY)
+RF(4, 3, FRIENDLY)
+RF(4, 4, PET)
+RF(4, 5, MORTAL)
+RF(4, 6, SPIDER)
+RF(4, 7, NAZGUL)
+RF(4, 8, DG_CURSE)
+RF(4, 9, POSSESSOR)
+RF(4, 10, NO_DEATH)
+RF(4, 11, NO_TARGET)
+RF(4, 12, AI_ANNOY)
+RF(4, 13, AI_SPECIAL)
+RF(4, 14, NEUTRAL)
+RF(4, 16, DROP_RANDART)
+RF(4, 17, AI_PLAYER)
+RF(4, 18, NO_THEFT)
+RF(4, 19, SPIRIT)
+
+RF(5, 0, WILD_ONLY)
+RF(5, 1, WILD_TOWN)
+RF(5, 3, WILD_SHORE)
+RF(5, 4, WILD_OCEAN)
+RF(5, 5, WILD_WASTE)
+RF(5, 6, WILD_WOOD)
+RF(5, 7, WILD_VOLCANO)
+RF(5, 9, WILD_MOUNTAIN)
+RF(5, 10, WILD_GRASS)
+RF(5, 11, NO_CUT)
+RF(5, 15, JOKEANGBAND)
+RF(5, 31, WILD_TOO)
+
+RF(6, 0, DROP_CORPSE)
+RF(6, 1, DROP_SKELETON)
+RF(6, 2, HAS_LITE)
+RF(6, 3, MIMIC)
+RF(6, 4, HAS_EGG)
+RF(6, 5, IMPRESED)
+RF(6, 6, SUSCEP_ACID)
+RF(6, 7, SUSCEP_ELEC)
+RF(6, 8, SUSCEP_POIS)
+RF(6, 9, KILL_TREES)
+RF(6, 10, WYRM_PROTECT)
+RF(6, 11, DOPPLEGANGER)
+RF(6, 12, ONLY_DEPTH)
+RF(6, 13, SPECIAL_GENE)
+RF(6, 14, NEVER_GENE)
diff --git a/src/monster_race_flag_set.hpp b/src/monster_race_flag_set.hpp
new file mode 100644
index 00000000..958201b1
--- /dev/null
+++ b/src/monster_race_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t RF_MAX_TIERS = 6;
+
+typedef flag_set<RF_MAX_TIERS> monster_race_flag_set;
diff --git a/src/monster_spell.cc b/src/monster_spell.cc
new file mode 100644
index 00000000..08627916
--- /dev/null
+++ b/src/monster_spell.cc
@@ -0,0 +1,36 @@
+#include "monster_spell.hpp"
+
+#include "monster_spell_flag.hpp"
+
+#include <boost/preprocessor/cat.hpp>
+
+std::vector<monster_spell const *> const &monster_spells()
+{
+ // Static instance for one-time initialization.
+ static std::vector<monster_spell const *> instance;
+
+ if (instance.empty())
+ {
+#define SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) \
+ instance.emplace_back(new monster_spell { \
+ BOOST_PP_CAT(SF_, BOOST_PP_CAT(name, _IDX)), \
+ BOOST_PP_CAT(SF_, name), \
+ #name, \
+ is_summon, \
+ is_annoy, \
+ is_damage, \
+ is_bolt, \
+ is_smart, \
+ is_innate, \
+ is_escape, \
+ is_tactic, \
+ is_haste, \
+ is_heal, \
+ !is_innate, \
+ });
+#include "monster_spell_flag_list.hpp"
+#undef SF
+ };
+
+ return instance;
+}
diff --git a/src/monster_spell.hpp b/src/monster_spell.hpp
new file mode 100644
index 00000000..4dfaf974
--- /dev/null
+++ b/src/monster_spell.hpp
@@ -0,0 +1,91 @@
+#pragma once
+
+#include "monster_spell_flag_set.hpp"
+
+#include <vector>
+
+struct monster_spell {
+
+ /**
+ * The global index of the spell.
+ */
+ const std::size_t spell_idx;
+
+ /**
+ * Flag set representation of the spell.
+ */
+ const monster_spell_flag_set flag_set;
+
+ /**
+ * System name of the spell as a string.
+ */
+ const char *name;
+
+ /**
+ * Is the spell a summoning spell?
+ */
+ const bool is_summon;
+
+ /**
+ * Is the spell an "annoyance" spell?
+ */
+ const bool is_annoy;
+
+ /**
+ * Is the spell a direct damage spell?
+ */
+ const bool is_damage;
+
+ /**
+ * Is the spell a bolt spell, i.e. would it
+ * affect any creature along the trajectory from
+ * the source to its target?
+ */
+ const bool is_bolt;
+
+ /**
+ * Does the spell require an intelligent caster?
+ */
+ const bool is_smart;
+
+ /**
+ * Is the spell an innate attack? For example, breaths
+ * are innate attacks.
+ */
+ const bool is_innate;
+
+ /**
+ * Is the spell an escape spell?
+ */
+ const bool is_escape;
+
+ /**
+ * Is the spell a "tactical" spell?
+ */
+ const bool is_tactic;
+
+ /**
+ * Does the spell apply haste?
+ */
+ const bool is_haste;
+
+ /**
+ * Does the spell apply any healing?
+ */
+ const bool is_heal;
+
+ /**
+ * Is the spell "magical" in nature? Magical spells
+ * can be stopped by the anti-magic field, and non-magical
+ * ones cannot.
+ *
+ * This is the inverse of the "innate" flag.
+ */
+ const bool is_magic;
+
+};
+
+/**
+ * Get a vector of all the spells.
+ */
+std::vector<monster_spell const *> const &monster_spells();
diff --git a/src/monster_spell_flag.hpp b/src/monster_spell_flag.hpp
new file mode 100644
index 00000000..3de649ec
--- /dev/null
+++ b/src/monster_spell_flag.hpp
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "monster_spell_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) \
+ DECLARE_FLAG(monster_spell_flag_set, BOOST_PP_CAT(SF_,name), tier, index)
+#include "monster_spell_flag_list.hpp"
+#undef SF
+
+//
+// Define index for each flag.
+//
+#define SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) \
+ constexpr std::size_t BOOST_PP_CAT(BOOST_PP_CAT(SF_,name), _IDX) = (tier - 1) * 32 + index;
+#include "monster_spell_flag_list.hpp"
+#undef SF
diff --git a/src/monster_spell_flag_list.hpp b/src/monster_spell_flag_list.hpp
new file mode 100644
index 00000000..42d8a5e9
--- /dev/null
+++ b/src/monster_spell_flag_list.hpp
@@ -0,0 +1,101 @@
+/**
+ * X-macro list of all the monster race flags
+ */
+
+/* SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) */
+
+SF(1, 0, SHRIEK , false, true , false, false, false, true , false, false, false, false)
+SF(1, 1, MULTIPLY , false, false, false, false, false, true , false, false, false, false)
+SF(1, 2, S_ANIMAL , true , false, false, false, true , false, false, false, false, false)
+SF(1, 3, ROCKET , false, false, true , false, false, true , false, false, false, false)
+SF(1, 4, ARROW_1 , false, false, true , true , false, true , false, false, false, false)
+SF(1, 5, ARROW_2 , false, false, true , true , false, true , false, false, false, false)
+SF(1, 6, ARROW_3 , false, false, true , true , false, true , false, false, false, false)
+SF(1, 7, ARROW_4 , false, false, true , true , false, true , false, false, false, false)
+SF(1, 8, BR_ACID , false, false, true , false, false, true , false, false, false, false)
+SF(1, 9, BR_ELEC , false, false, true , false, false, true , false, false, false, false)
+SF(1, 10, BR_FIRE , false, false, true , false, false, true , false, false, false, false)
+SF(1, 11, BR_COLD , false, false, true , false, false, true , false, false, false, false)
+SF(1, 12, BR_POIS , false, false, true , false, false, true , false, false, false, false)
+SF(1, 13, BR_NETH , false, false, true , false, false, true , false, false, false, false)
+SF(1, 14, BR_LITE , false, false, true , false, false, true , false, false, false, false)
+SF(1, 15, BR_DARK , false, false, true , false, false, true , false, false, false, false)
+SF(1, 16, BR_CONF , false, false, true , false, false, true , false, false, false, false)
+SF(1, 17, BR_SOUN , false, false, true , false, false, true , false, false, false, false)
+SF(1, 18, BR_CHAO , false, false, true , false, false, true , false, false, false, false)
+SF(1, 19, BR_DISE , false, false, true , false, false, true , false, false, false, false)
+SF(1, 20, BR_NEXU , false, false, true , false, false, true , false, false, false, false)
+SF(1, 21, BR_TIME , false, false, true , false, false, true , false, false, false, false)
+SF(1, 22, BR_INER , false, false, true , false, false, true , false, false, false, false)
+SF(1, 23, BR_GRAV , false, false, true , false, false, true , false, false, false, false)
+SF(1, 24, BR_SHAR , false, false, true , false, false, true , false, false, false, false)
+SF(1, 25, BR_PLAS , false, false, true , false, false, true , false, false, false, false)
+SF(1, 26, BR_WALL , false, false, true , false, false, true , false, false, false, false)
+SF(1, 27, BR_MANA , false, false, true , false, false, true , false, false, false, false)
+SF(1, 28, BA_NUKE , false, false, true , false, false, false, false, false, false, false)
+SF(1, 29, BR_NUKE , false, false, true , false, false, true , false, false, false, false)
+SF(1, 30, BA_CHAO , false, false, true , false, false, false, false, false, false, false)
+SF(1, 31, BR_DISI , false, false, true , false, false, true , false, false, false, false)
+SF(2, 0, BA_ACID , false, false, true , false, false, false, false, false, false, false)
+SF(2, 1, BA_ELEC , false, false, true , false, false, false, false, false, false, false)
+SF(2, 2, BA_FIRE , false, false, true , false, false, false, false, false, false, false)
+SF(2, 3, BA_COLD , false, false, true , false, false, false, false, false, false, false)
+SF(2, 4, BA_POIS , false, false, true , false, false, false, false, false, false, false)
+SF(2, 5, BA_NETH , false, false, true , false, false, false, false, false, false, false)
+SF(2, 6, BA_WATE , false, false, true , false, false, false, false, false, false, false)
+SF(2, 7, BA_MANA , false, false, true , false, false, false, false, false, false, false)
+SF(2, 8, BA_DARK , false, false, true , false, false, false, false, false, false, false)
+SF(2, 9, DRAIN_MANA , false, true , false, false, false, false, false, false, false, false)
+SF(2, 10, MIND_BLAST , false, true , false, false, false, false, false, false, false, false)
+SF(2, 11, BRAIN_SMASH , false, true , false, false, false, false, false, false, false, false)
+SF(2, 12, CAUSE_1 , false, true , true , false, false, false, false, false, false, false)
+SF(2, 13, CAUSE_2 , false, true , true , false, false, false, false, false, false, false)
+SF(2, 14, CAUSE_3 , false, true , true , false, false, false, false, false, false, false)
+SF(2, 15, CAUSE_4 , false, true , true , false, false, false, false, false, false, false)
+SF(2, 16, BO_ACID , false, false, true , true , false, false, false, false, false, false)
+SF(2, 17, BO_ELEC , false, false, true , true , false, false, false, false, false, false)
+SF(2, 18, BO_FIRE , false, false, true , true , false, false, false, false, false, false)
+SF(2, 19, BO_COLD , false, false, true , true , false, false, false, false, false, false)
+SF(2, 20, BO_POIS , false, false, true , true , false, false, false, false, false, false)
+SF(2, 21, BO_NETH , false, false, true , true , false, false, false, false, false, false)
+SF(2, 22, BO_WATE , false, false, true , true , false, false, false, false, false, false)
+SF(2, 23, BO_MANA , false, false, true , true , false, false, false, false, false, false)
+SF(2, 24, BO_PLAS , false, false, true , true , false, false, false, false, false, false)
+SF(2, 25, BO_ICEE , false, false, true , true , false, false, false, false, false, false)
+SF(2, 26, MISSILE , false, false, true , true , false, false, false, false, false, false)
+SF(2, 27, SCARE , false, true , false, false, true , false, false, false, false, false)
+SF(2, 28, BLIND , false, true , false, false, true , false, false, false, false, false)
+SF(2, 29, CONF , false, true , false, false, true , false, false, false, false, false)
+SF(2, 30, SLOW , false, true , false, false, true , false, false, false, false, false)
+SF(2, 31, HOLD , false, true , false, false, true , false, false, false, false, false)
+SF(3, 0, HASTE , false, false, false, false, true , false, false, false, true , false)
+SF(3, 1, HAND_DOOM , false, false, true , false, false, false, false, false, false, false)
+SF(3, 2, HEAL , false, false, false, false, true , false, false, false, false, true )
+SF(3, 3, S_ANIMALS , true , false, false, false, true , false, false, false, false, false)
+SF(3, 4, BLINK , false, false, false, false, true , false, true , true , false, false)
+SF(3, 5, TPORT , false, false, false, false, true , false, true , false, false, false)
+SF(3, 6, TELE_TO , false, true , false, false, false, false, false, false, false, false)
+SF(3, 7, TELE_AWAY , false, false, false, false, true , false, true , false, false, false)
+SF(3, 8, TELE_LEVEL , false, false, false, false, true , false, true , false, false, false)
+SF(3, 9, DARKNESS , false, true , false, false, false, false, false, false, false, false)
+SF(3, 11, FORGET , false, true , false, false, false, false, false, false, false, false)
+SF(3, 12, RAISE_DEAD , false, false, false, false, false, false, false, false, false, false)
+SF(3, 13, S_BUG , true , false, false, false, true , false, false, false, false, false)
+SF(3, 14, S_RNG , true , false, false, false, true , false, false, false, false, false)
+SF(3, 15, S_THUNDERLORD, true , false, false, false, true , false, false, false, false, false)
+SF(3, 16, S_KIN , true , false, false, false, true , false, false, false, false, false)
+SF(3, 17, S_HI_DEMON , true , false, false, false, true , false, false, false, false, false)
+SF(3, 18, S_MONSTER , true , false, false, false, true , false, false, false, false, false)
+SF(3, 19, S_MONSTERS , true , false, false, false, true , false, false, false, false, false)
+SF(3, 20, S_ANT , true , false, false, false, true , false, false, false, false, false)
+SF(3, 21, S_SPIDER , true , false, false, false, true , false, false, false, false, false)
+SF(3, 22, S_HOUND , true , false, false, false, true , false, false, false, false, false)
+SF(3, 23, S_HYDRA , true , false, false, false, true , false, false, false, false, false)
+SF(3, 24, S_ANGEL , true , false, false, false, true , false, false, false, false, false)
+SF(3, 25, S_DEMON , true , false, false, false, true , false, false, false, false, false)
+SF(3, 26, S_UNDEAD , true , false, false, false, true , false, false, false, false, false)
+SF(3, 27, S_DRAGON , true , false, false, false, true , false, false, false, false, false)
+SF(3, 28, S_HI_UNDEAD , true , false, false, false, true , false, false, false, false, false)
+SF(3, 29, S_HI_DRAGON , true , false, false, false, true , false, false, false, false, false)
+SF(3, 30, S_WRAITH , true , false, false, false, true , false, false, false, false, false)
+SF(3, 31, S_UNIQUE , true , false, false, false, true , false, false, false, false, false)
diff --git a/src/monster_spell_flag_set.hpp b/src/monster_spell_flag_set.hpp
new file mode 100644
index 00000000..37d31665
--- /dev/null
+++ b/src/monster_spell_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t SF_MAX_TIERS = 3;
+
+typedef flag_set<SF_MAX_TIERS> monster_spell_flag_set;
diff --git a/src/monster_type.hpp b/src/monster_type.hpp
index 8353f228..ed6d3d2a 100644
--- a/src/monster_type.hpp
+++ b/src/monster_type.hpp
@@ -4,6 +4,7 @@
#include "monster_blow.hpp"
#include "monster_race_fwd.hpp"
+#include <array>
#include <cassert>
#include <vector>
#include <memory>
@@ -28,12 +29,7 @@ struct monster_type
s32b hp = 0; /* Current Hit points */
s32b maxhp = 0; /* Max Hit points */
- monster_blow blow[4] = { /* Up to four blows per round */
- { 0, 0, 0, 0 },
- { 0, 0, 0, 0 },
- { 0, 0, 0, 0 },
- { 0, 0, 0, 0 },
- };
+ std::array<monster_blow, 4> blow {};/* Up to four blows per round */
byte speed = 0; /* Speed (normally 110) */
byte level = 0; /* Level of creature */
diff --git a/src/notes.cc b/src/notes.cc
index 326381c9..17990992 100644
--- a/src/notes.cc
+++ b/src/notes.cc
@@ -10,6 +10,7 @@
#include "notes.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "player_class.hpp"
#include "player_type.hpp"
#include "util.hpp"
@@ -20,14 +21,14 @@
/*
* Show the notes file on the screen
*/
-void show_notes_file(void)
+void show_notes_file()
{
char basename[13];
char buf[1024];
char caption[10 + 13];
/* Hack -- extract first 8 characters of name and append an extension */
- (void)strnfmt(basename, sizeof(basename), "%.8s.nte", player_base);
+ strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str());
basename[sizeof(basename) - 1] = '\0';
/* Build the path */
@@ -37,7 +38,7 @@ void show_notes_file(void)
sprintf(caption, "Note file %s", basename);
/* Invoke show_file */
- (void)show_file(buf, caption, 0, 0);
+ show_file(buf, caption);
/* Done */
return;
@@ -47,14 +48,14 @@ void show_notes_file(void)
* Output a string to the notes file.
* This is the only function that references that file.
*/
-void output_note(char *final_note)
+void output_note(const char *final_note)
{
FILE *fff;
char basename[13];
char buf[1024];
/* Hack -- extract first 8 characters of name and append an extension */
- (void)strnfmt(basename, sizeof(basename), "%.8s.nte", player_base);
+ strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str());
basename[sizeof(basename) - 1] = '\0';
/* Build the path */
@@ -113,6 +114,8 @@ void add_note(char *note, char code)
*/
void add_note_type(int note_number)
{
+ auto const &class_info = game->edit_data.class_info;
+
char true_long_day[50];
char buf[1024];
time_t ct = time((time_t*)0);
@@ -129,9 +132,10 @@ void add_note_type(int note_number)
char player[100];
/* Build the string containing the player information */
+ auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem);
sprintf(player,
"the %s %s",
- get_player_race_name(p_ptr->prace, p_ptr->pracem),
+ player_race_name.c_str(),
class_info[p_ptr->pclass].spec[p_ptr->pspec].title);
/* Add in "character start" information */
@@ -141,7 +145,7 @@ void add_note_type(int note_number)
"%s %s\n"
"Born on %s\n"
"================================================\n",
- player_name, player, true_long_day);
+ game->player_name.c_str(), player, true_long_day);
break;
}
@@ -152,7 +156,7 @@ void add_note_type(int note_number)
"%s slew Morgoth on %s\n"
"Long live %s!\n"
"================================================",
- player_name, true_long_day, player_name);
+ game->player_name.c_str(), true_long_day, game->player_name.c_str());
break;
}
diff --git a/src/notes.hpp b/src/notes.hpp
index e8c22bb7..5c182858 100644
--- a/src/notes.hpp
+++ b/src/notes.hpp
@@ -1,6 +1,6 @@
#pragma once
-extern void show_notes_file(void);
-extern void output_note(char *final_note);
-extern void add_note(char *note, char code);
-extern void add_note_type(int note_number);
+void show_notes_file();
+void output_note(char const *final_note);
+void add_note(char *note, char code);
+void add_note_type(int note_number);
diff --git a/src/obj_theme.hpp b/src/obj_theme.hpp
index 13f185e8..d10d17fa 100644
--- a/src/obj_theme.hpp
+++ b/src/obj_theme.hpp
@@ -8,8 +8,45 @@
*/
struct obj_theme
{
- byte treasure;
- byte combat;
- byte magic;
- byte tools;
+ byte treasure = 0;
+ byte combat = 0;
+ byte magic = 0;
+ byte tools = 0;
+
+ bool operator == (obj_theme const &other) const
+ {
+ return
+ (treasure == other.treasure) &&
+ (combat == other.combat) &&
+ (magic == other.magic) &&
+ (tools == other.tools);
+ }
+
+ bool operator != (obj_theme const &other) const
+ {
+ return !(*this == other);
+ }
+
+ static constexpr obj_theme no_theme()
+ {
+ return equal_spread(100);
+ }
+
+ static constexpr obj_theme defaults()
+ {
+ return equal_spread(20);
+ }
+
+private:
+
+ static constexpr obj_theme equal_spread(byte v)
+ {
+ obj_theme ot;
+ ot.treasure = v;
+ ot.combat = v;
+ ot.magic = v;
+ ot.tools = v;
+ return ot;
+ }
+
};
diff --git a/src/object1.cc b/src/object1.cc
index 6bbf23e9..3fb2ef26 100644
--- a/src/object1.cc
+++ b/src/object1.cc
@@ -18,6 +18,7 @@
#include "ego_item_type.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hook_get_in.hpp"
#include "hooks.hpp"
#include "lua_bind.hpp"
@@ -26,15 +27,18 @@
#include "monster2.hpp"
#include "monster_ego.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
+#include "object_flag_meta.hpp"
+#include "object_flag_set.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "options.hpp"
#include "player_race.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "set_type.hpp"
#include "skills.hpp"
#include "spell_type.hpp"
@@ -43,7 +47,6 @@
#include "stats.hpp"
#include "store_info_type.hpp"
#include "tables.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -52,10 +55,15 @@
#include "xtra1.hpp"
#include "z-rand.hpp"
+#include <boost/algorithm/string/join.hpp>
+#include <boost/algorithm/string/predicate.hpp>
#include <cassert>
+#include <fmt/format.h>
+#include <utility>
-static bool_ apply_flags_set(s16b a_idx, s16b set_idx,
- u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp);
+using boost::starts_with;
+
+static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f);
/*
* Hack -- note that "TERM_MULTI" is now just "TERM_VIOLET".
@@ -322,14 +330,8 @@ static char scroll_adj[MAX_TITLES][16];
static byte scroll_col[MAX_TITLES];
-/*
- * Certain items have a flavor
- * This function is used only by "flavor_init()"
- */
-static byte object_flavor(int k_idx)
+static byte object_flavor(object_kind const *k_ptr)
{
- object_kind *k_ptr = &k_info[k_idx];
-
/* Analyze the item */
switch (k_ptr->tval)
{
@@ -381,7 +383,7 @@ static byte object_flavor(int k_idx)
}
/* No flavor */
- return (0);
+ return 0;
}
@@ -391,10 +393,8 @@ static byte object_flavor(int k_idx)
*
* XXX XXX XXX Add "EASY_KNOW" flag to "k_info.txt" file
*/
-static bool_ object_easy_know(int i)
+static bool_ object_easy_know(object_kind const *k_ptr)
{
- object_kind *k_ptr = &k_info[i];
-
/* Analyze the "tval" */
switch (k_ptr->tval)
{
@@ -427,7 +427,7 @@ static bool_ object_easy_know(int i)
case TV_ROD:
case TV_ROD_MAIN:
{
- if (k_ptr->flags3 & TR3_NORM_ART)
+ if (k_ptr->flags & TR_NORM_ART)
return ( FALSE );
return (TRUE);
}
@@ -437,7 +437,7 @@ static bool_ object_easy_know(int i)
case TV_AMULET:
case TV_LITE:
{
- if (k_ptr->flags3 & (TR3_EASY_KNOW)) return (TRUE);
+ if (k_ptr->flags & TR_EASY_KNOW) return (TRUE);
return (FALSE);
}
}
@@ -446,6 +446,25 @@ static bool_ object_easy_know(int i)
return (FALSE);
}
+
+
+/**
+ * Shuffle flavor arrays into a random permutation
+ */
+template <std::size_t N>
+static void shuffle_flavors(cptr adj[], byte col[])
+{
+ // The classic Fisher-Yates shuffle
+ for (std::size_t i = N - 1; i > 0; i--)
+ {
+ int j = rand_int(i + 1);
+ std::swap(adj[i], adj[j]);
+ std::swap(col[i], col[j]);
+ }
+}
+
+
+
/*
* Prepare the "variable" part of the "k_info" array.
*
@@ -477,165 +496,73 @@ static bool_ object_easy_know(int i)
*
* Note that the "hacked seed" may provide an RNG with alternating parity!
*/
-void flavor_init(void)
+void flavor_init()
{
- int i, j;
-
- byte temp_col;
-
- cptr temp_adj;
-
-
- /* Hack -- Use the "simple" RNG */
- Rand_quick = TRUE;
+ auto &k_info = game->edit_data.k_info;
/* Hack -- Induce consistant flavors */
- Rand_value = seed_flavor;
-
+ set_quick_rng(seed_flavor());
/* Efficiency -- Rods/Wands share initial array */
- for (i = 0; i < MAX_METALS; i++)
+ for (std::size_t i = 0; i < MAX_METALS; i++)
{
rod_adj[i] = wand_adj[i];
rod_col[i] = wand_col[i];
}
- /* Rings have "ring colors" */
- for (i = 0; i < MAX_ROCKS; i++)
- {
- j = rand_int(MAX_ROCKS);
- temp_adj = ring_adj[i];
- ring_adj[i] = ring_adj[j];
- ring_adj[j] = temp_adj;
- temp_col = ring_col[i];
- ring_col[i] = ring_col[j];
- ring_col[j] = temp_col;
- }
-
- /* Amulets have "amulet colors" */
- for (i = 0; i < MAX_AMULETS; i++)
- {
- j = rand_int(MAX_AMULETS);
- temp_adj = amulet_adj[i];
- amulet_adj[i] = amulet_adj[j];
- amulet_adj[j] = temp_adj;
- temp_col = amulet_col[i];
- amulet_col[i] = amulet_col[j];
- amulet_col[j] = temp_col;
- }
-
- /* Staffs */
- for (i = 0; i < MAX_WOODS; i++)
- {
- j = rand_int(MAX_WOODS);
- temp_adj = staff_adj[i];
- staff_adj[i] = staff_adj[j];
- staff_adj[j] = temp_adj;
- temp_col = staff_col[i];
- staff_col[i] = staff_col[j];
- staff_col[j] = temp_col;
- }
-
- /* Wands */
- for (i = 0; i < MAX_METALS; i++)
- {
- j = rand_int(MAX_METALS);
- temp_adj = wand_adj[i];
- wand_adj[i] = wand_adj[j];
- wand_adj[j] = temp_adj;
- temp_col = wand_col[i];
- wand_col[i] = wand_col[j];
- wand_col[j] = temp_col;
- }
-
- /* Rods */
- for (i = 0; i < MAX_METALS; i++)
- {
- j = rand_int(MAX_METALS);
- temp_adj = rod_adj[i];
- rod_adj[i] = rod_adj[j];
- rod_adj[j] = temp_adj;
- temp_col = rod_col[i];
- rod_col[i] = rod_col[j];
- rod_col[j] = temp_col;
- }
-
- /* Foods (Mushrooms) */
- for (i = 0; i < MAX_SHROOM; i++)
- {
- j = rand_int(MAX_SHROOM);
- temp_adj = food_adj[i];
- food_adj[i] = food_adj[j];
- food_adj[j] = temp_adj;
- temp_col = food_col[i];
- food_col[i] = food_col[j];
- food_col[j] = temp_col;
- }
-
- /* Potions */
- for (i = 4; i < MAX_COLORS; i++)
- {
- j = rand_int(MAX_COLORS - 4) + 4;
- temp_adj = potion_adj[i];
- potion_adj[i] = potion_adj[j];
- potion_adj[j] = temp_adj;
- temp_col = potion_col[i];
- potion_col[i] = potion_col[j];
- potion_col[j] = temp_col;
- }
+ /* Object flavors */
+ shuffle_flavors<MAX_ROCKS>(ring_adj, ring_col);
+ shuffle_flavors<MAX_AMULETS>(amulet_adj, amulet_col);
+ shuffle_flavors<MAX_WOODS>(staff_adj, staff_col);
+ shuffle_flavors<MAX_METALS>(wand_adj, wand_col);
+ shuffle_flavors<MAX_METALS>(rod_adj, rod_col);
+ shuffle_flavors<MAX_SHROOM>(food_adj, food_col);
+ shuffle_flavors<MAX_COLORS - 4>(potion_adj + 4, potion_col + 4);
/* Scrolls (random titles, always white) */
- for (i = 0; i < MAX_TITLES; i++)
+ for (std::size_t i = 0; i < MAX_TITLES; i++)
{
/* Get a new title */
while (TRUE)
{
- char buf[80];
-
- bool_ okay;
-
- /* Start a new title */
- buf[0] = '\0';
+ std::string buf;
/* Collect words until done */
while (1)
{
- int q, s;
-
- char tmp[80];
-
- /* Start a new word */
- tmp[0] = '\0';
-
/* Choose one or two syllables */
- s = ((rand_int(100) < 30) ? 1 : 2);
+ int s = ((rand_int(100) < 30) ? 1 : 2);
/* Add a one or two syllable word */
- for (q = 0; q < s; q++)
+ std::string tmp;
+ for (int q = 0; q < s; q++)
{
- /* Add the syllable */
- strcat(tmp, syllables[rand_int(MAX_SYLLABLES)]);
+ tmp += syllables[rand_int(MAX_SYLLABLES)];
}
/* Stop before getting too long */
- if (strlen(buf) + 1 + strlen(tmp) > 15) break;
-
- /* Add a space */
- strcat(buf, " ");
+ if (buf.size() + tmp.size() + 1 > 15)
+ {
+ break;
+ }
- /* Add the word */
- strcat(buf, tmp);
+ /* Add the word with separator */
+ if (buf.size() > 0)
+ {
+ buf += " ";
+ }
+ buf += tmp;
}
/* Save the title */
- strcpy(scroll_adj[i], buf + 1);
+ strcpy(scroll_adj[i], buf.c_str());
/* Assume okay */
- okay = TRUE;
+ bool_ okay = TRUE;
/* Check for "duplicate" scroll titles */
- for (j = 0; j < i; j++)
+ for (std::size_t j = 0; j < i; j++)
{
cptr hack1 = scroll_adj[j];
cptr hack2 = scroll_adj[i];
@@ -661,26 +588,28 @@ void flavor_init(void)
scroll_col[i] = TERM_WHITE;
}
-
/* Hack -- Use the "complex" RNG */
- Rand_quick = FALSE;
+ set_complex_rng();
/* Analyze every object */
- for (i = 1; i < max_k_idx; i++)
+ for (auto &k_ref: k_info)
{
- object_kind *k_ptr = &k_info[i];
+ auto k_ptr = &k_ref;
/* Skip "empty" objects */
if (!k_ptr->name) continue;
/* Extract "flavor" (if any) */
- k_ptr->flavor = object_flavor(i);
+ k_ptr->flavor = object_flavor(k_ptr);
/* No flavor yields aware */
- if ((!k_ptr->flavor) && (k_ptr->tval != TV_ROD_MAIN)) k_ptr->aware = TRUE;
+ if ((!k_ptr->flavor) && (k_ptr->tval != TV_ROD_MAIN))
+ {
+ k_ptr->aware = TRUE;
+ }
/* Check for "easily known" */
- k_ptr->easy_know = object_easy_know(i);
+ k_ptr->easy_know = object_easy_know(k_ptr);
}
}
@@ -698,81 +627,62 @@ void flavor_init(void)
*
* The "prefs" parameter is no longer meaningful. XXX XXX XXX
*/
-void reset_visuals(void)
+void reset_visuals()
{
- int i;
+ auto &st_info = game->edit_data.st_info;
+ auto &race_mod_info = game->edit_data.race_mod_info;
+ auto &re_info = game->edit_data.re_info;
+ auto &r_info = game->edit_data.r_info;
+ auto &f_info = game->edit_data.f_info;
+ auto &k_info = game->edit_data.k_info;
/* Extract some info about terrain features */
- for (i = 0; i < max_f_idx; i++)
+ for (auto &f_ref: f_info)
{
- feature_type *f_ptr = &f_info[i];
-
- /* Assume we will use the underlying values */
- f_ptr->x_attr = f_ptr->d_attr;
- f_ptr->x_char = f_ptr->d_char;
+ f_ref.x_attr = f_ref.d_attr;
+ f_ref.x_char = f_ref.d_char;
}
/* Extract default attr/char code for stores */
- for (i = 0; i < max_st_idx; i++)
+ for (auto &st_ref: st_info)
{
- store_info_type *st_ptr = &st_info[i];
-
/* Default attr/char */
- st_ptr->x_attr = st_ptr->d_attr;
- st_ptr->x_char = st_ptr->d_char;
+ st_ref.x_attr = st_ref.d_attr;
+ st_ref.x_char = st_ref.d_char;
}
/* Extract default attr/char code for objects */
- for (i = 0; i < max_k_idx; i++)
+ for (auto &k_ref: k_info)
{
- object_kind *k_ptr = &k_info[i];
-
/* Default attr/char */
- k_ptr->x_attr = k_ptr->d_attr;
- k_ptr->x_char = k_ptr->d_char;
+ k_ref.x_attr = k_ref.d_attr;
+ k_ref.x_char = k_ref.d_char;
}
/* Extract default attr/char code for monsters */
- for (i = 0; i < max_r_idx; i++)
+ for (auto &r_ref: r_info)
{
- monster_race *r_ptr = &r_info[i];
-
/* Default attr/char */
- r_ptr->x_attr = r_ptr->d_attr;
- r_ptr->x_char = r_ptr->d_char;
+ r_ref.x_attr = r_ref.d_attr;
+ r_ref.x_char = r_ref.d_char;
}
/* Reset attr/char code for ego monster overlay graphics */
- for (i = 0; i < max_re_idx; i++)
+ for (auto &re_ref: re_info)
{
- monster_ego *re_ptr = &re_info[i];
-
/* Default attr/char */
- re_ptr->g_attr = 0;
- re_ptr->g_char = 0;
+ re_ref.g_attr = 0;
+ re_ref.g_char = 0;
}
/* Reset attr/char code for race modifier overlay graphics */
- for (i = 0; i < max_rmp_idx; i++)
- {
- player_race_mod *rmp_ptr = &race_mod_info[i];
-
- /* Default attr/char */
- rmp_ptr->g_attr = 0;
- rmp_ptr->g_char = 0;
- }
-
- /* Reset attr/char code for trap overlay graphics */
- for (i = 0; i < max_rmp_idx; i++)
+ for (auto &rmp: race_mod_info)
{
- trap_type *t_ptr = &t_info[i];
-
/* Default attr/char */
- t_ptr->g_attr = 0;
- t_ptr->g_char = 0;
+ rmp.g_attr = 0;
+ rmp.g_char = 0;
}
-
/* Normal symbols */
process_pref_file("font.prf");
}
@@ -781,8 +691,15 @@ void reset_visuals(void)
/*
* Extract "xtra" flags from object.
*/
-static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b *esp)
+static void object_flags_xtra(object_type const *o_ptr, object_flag_set *f)
{
+ // Artifacts don't get *ego* extra powers.
+ if (!o_ptr->artifact_name.empty())
+ {
+ return;
+ }
+
+ // Add sustain or power.
switch (o_ptr->xtra1)
{
case EGO_XTRA_SUSTAIN:
@@ -791,22 +708,22 @@ static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b
switch (o_ptr->xtra2 % 6)
{
case 0:
- (*f2) |= (TR2_SUST_STR);
+ (*f) |= TR_SUST_STR;
break;
case 1:
- (*f2) |= (TR2_SUST_INT);
+ (*f) |= TR_SUST_INT;
break;
case 2:
- (*f2) |= (TR2_SUST_WIS);
+ (*f) |= TR_SUST_WIS;
break;
case 3:
- (*f2) |= (TR2_SUST_DEX);
+ (*f) |= TR_SUST_DEX;
break;
case 4:
- (*f2) |= (TR2_SUST_CON);
+ (*f) |= TR_SUST_CON;
break;
case 5:
- (*f2) |= (TR2_SUST_CHR);
+ (*f) |= TR_SUST_CHR;
break;
}
@@ -819,135 +736,94 @@ static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b
switch (o_ptr->xtra2 % 11)
{
case 0:
- (*f2) |= (TR2_RES_BLIND);
+ (*f) |= TR_RES_BLIND;
break;
case 1:
- (*f2) |= (TR2_RES_CONF);
+ (*f) |= TR_RES_CONF;
break;
case 2:
- (*f2) |= (TR2_RES_SOUND);
+ (*f) |= TR_RES_SOUND;
break;
case 3:
- (*f2) |= (TR2_RES_SHARDS);
+ (*f) |= TR_RES_SHARDS;
break;
case 4:
- (*f2) |= (TR2_RES_NETHER);
+ (*f) |= TR_RES_NETHER;
break;
case 5:
- (*f2) |= (TR2_RES_NEXUS);
+ (*f) |= TR_RES_NEXUS;
break;
case 6:
- (*f2) |= (TR2_RES_CHAOS);
+ (*f) |= TR_RES_CHAOS;
break;
case 7:
- (*f2) |= (TR2_RES_DISEN);
+ (*f) |= TR_RES_DISEN;
break;
case 8:
- (*f2) |= (TR2_RES_POIS);
+ (*f) |= TR_RES_POIS;
break;
case 9:
- (*f2) |= (TR2_RES_DARK);
+ (*f) |= TR_RES_DARK;
break;
case 10:
- (*f2) |= (TR2_RES_LITE);
+ (*f) |= TR_RES_LITE;
break;
}
break;
}
- case EGO_XTRA_ABILITY:
- {
- /* Choose an ability */
- switch (o_ptr->xtra2 % 8)
- {
- case 0:
- (*f3) |= (TR3_FEATHER);
- break;
- case 1:
- (*f3) |= (TR3_LITE1);
- break;
- case 2:
- (*f3) |= (TR3_SEE_INVIS);
- break;
- case 3:
- (*esp) |= (ESP_ALL);
- break;
- case 4:
- (*f3) |= (TR3_SLOW_DIGEST);
- break;
- case 5:
- (*f3) |= (TR3_REGEN);
- break;
- case 6:
- (*f2) |= (TR2_FREE_ACT);
- break;
- case 7:
- (*f2) |= (TR2_HOLD_LIFE);
- break;
- }
-
- break;
- }
-
}
}
+/*
+ * Disregard sets when calculating flags?
+ */
+bool_ object_flags_no_set = FALSE;
/*
* Obtain the "flags" for an item
*/
-bool_ object_flags_no_set = FALSE;
-void object_flags(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
+object_flag_set object_flags(object_type const *o_ptr)
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
+
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Base object */
- (*f1) = k_ptr->flags1;
- (*f2) = k_ptr->flags2;
- (*f3) = k_ptr->flags3;
- (*f4) = k_ptr->flags4;
- (*f5) = k_ptr->flags5;
- (*esp) = k_ptr->esp;
+ auto f = k_ptr->flags;
/* Artifact */
if (o_ptr->name1)
{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
- (*f1) = a_ptr->flags1;
- (*f2) = a_ptr->flags2;
- (*f3) = a_ptr->flags3;
- (*f4) = a_ptr->flags4;
- (*f5) = a_ptr->flags5;
- (*esp) = a_ptr->esp;
+ f = a_ptr->flags;
if ((!object_flags_no_set) && (a_ptr->set != -1))
- apply_flags_set(o_ptr->name1, a_ptr->set, f1, f2, f3, f4, f5, esp);
+ {
+ apply_flags_set(o_ptr->name1, a_ptr->set, &f);
+ }
}
- /* Random artifact ! */
- if (o_ptr->art_flags1 || o_ptr->art_flags2 || o_ptr->art_flags3 || o_ptr->art_flags4 || o_ptr->art_flags5 || o_ptr->art_esp)
- {
- (*f1) |= o_ptr->art_flags1;
- (*f2) |= o_ptr->art_flags2;
- (*f3) |= o_ptr->art_flags3;
- (*f4) |= o_ptr->art_flags4;
- (*f5) |= o_ptr->art_flags5;
- (*esp) |= o_ptr->art_esp;
- }
+ /* Mix in art_{flags,esp} */
+ f |= o_ptr->art_flags;
/* Extra powers */
- if (!(o_ptr->art_name))
- {
- object_flags_xtra(o_ptr, f2, f3, esp);
- }
+ object_flags_xtra(o_ptr, &f);
+
+ return f;
}
/* Return object granted power */
int object_power(object_type *o_ptr)
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
+ auto const &e_info = game->edit_data.e_info;
+
+ auto k_ptr = &k_info[o_ptr->k_idx];
int power = -1;
/* Base object */
@@ -956,24 +832,33 @@ int object_power(object_type *o_ptr)
/* Ego-item */
if (o_ptr->name2)
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
+ auto e_ptr = &e_info[o_ptr->name2];
- if (power == -1) power = e_ptr->power;
+ if (power == -1)
+ {
+ power = e_ptr->power;
+ }
if (o_ptr->name2b)
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2b];
+ auto e_ptr = &e_info[o_ptr->name2b];
- if (power == -1) power = e_ptr->power;
+ if (power == -1)
+ {
+ power = e_ptr->power;
+ }
}
}
/* Artifact */
if (o_ptr->name1)
{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
- if (power == -1) power = a_ptr->power;
+ if (power == -1)
+ {
+ power = a_ptr->power;
+ }
}
return (power);
@@ -984,210 +869,107 @@ int object_power(object_type *o_ptr)
/*
* Obtain the "flags" for an item which are known to the player
*/
-void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
+object_flag_set object_flags_known(object_type const *o_ptr)
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
- /* Clear */
- (*f1) = (*f2) = (*f3) = (*f4) = (*esp) = (*f5) = 0L;
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Must be identified */
- if (!object_known_p(o_ptr)) return;
+ if (!object_known_p(o_ptr))
+ {
+ return object_flag_set();
+ }
/* Base object */
- (*f1) = k_ptr->flags1;
- (*f2) = k_ptr->flags2;
- (*f3) = k_ptr->flags3;
- (*f4) = k_ptr->flags4;
- (*f5) = k_ptr->flags5;
- (*esp) = k_ptr->esp;
-
- (*f1) |= k_ptr->oflags1;
- (*f2) |= k_ptr->oflags2;
- (*f3) |= k_ptr->oflags3;
- (*f4) |= k_ptr->oflags4;
- (*f5) |= k_ptr->oflags5;
- (*esp) |= k_ptr->oesp;
+ auto flags = k_ptr->flags;
+
+ /* Obvious flags */
+ flags |= k_ptr->oflags;
/* Artifact */
if (o_ptr->name1)
{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
/* Need full knowledge or spoilers */
if ((o_ptr->ident & IDENT_MENTAL))
{
- (*f1) = a_ptr->flags1;
- (*f2) = a_ptr->flags2;
- (*f3) = a_ptr->flags3;
- (*f4) = a_ptr->flags4;
- (*f5) = a_ptr->flags5;
- (*esp) = a_ptr->esp;
+ flags = a_ptr->flags;
if ((!object_flags_no_set) && (a_ptr->set != -1))
- apply_flags_set(o_ptr->name1, a_ptr->set, f1, f2, f3, f4, f5, esp);
+ {
+ apply_flags_set(o_ptr->name1, a_ptr->set, &flags);
+ }
}
else
{
- (*f1) = (*f2) = (*f3) = (*f4) = (*esp) = (*f5) = 0L;
+ flags = object_flag_set();
}
- (*f1) |= a_ptr->oflags1;
- (*f2) |= a_ptr->oflags2;
- (*f3) |= a_ptr->oflags3;
- (*f4) |= a_ptr->oflags4;
- (*f5) |= a_ptr->oflags5;
- (*esp) |= a_ptr->oesp;
+ flags |= a_ptr->oflags;
}
/* Random artifact or ego item! */
- if (o_ptr->art_flags1 || o_ptr->art_flags2 || o_ptr->art_flags3 || o_ptr->art_flags4 || o_ptr->art_flags5 || o_ptr->art_esp)
+ if (o_ptr->art_flags)
{
/* Need full knowledge or spoilers */
if ((o_ptr->ident & IDENT_MENTAL))
{
- (*f1) |= o_ptr->art_flags1;
- (*f2) |= o_ptr->art_flags2;
- (*f3) |= o_ptr->art_flags3;
- (*f4) |= o_ptr->art_flags4;
- (*f5) |= o_ptr->art_flags5;
- (*esp) |= o_ptr->art_esp;
+ flags |= o_ptr->art_flags;
}
- (*f1) |= o_ptr->art_oflags1;
- (*f2) |= o_ptr->art_oflags2;
- (*f3) |= o_ptr->art_oflags3;
- (*f4) |= o_ptr->art_oflags4;
- (*f5) |= o_ptr->art_oflags5;
- (*esp) |= o_ptr->art_oesp;
+ flags |= o_ptr->art_oflags;
}
/* Full knowledge for *identified* objects */
- if (!(o_ptr->ident & IDENT_MENTAL)) return;
-
- if (!(o_ptr->art_name))
+ if (!(o_ptr->ident & IDENT_MENTAL))
{
- object_flags_xtra(o_ptr, f2, f3, esp);
+ return flags;
}
- /* Hack - Res Chaos -> Res Confusion */
- if (*f2 & TR2_RES_CHAOS) (*f2) |= (TR2_RES_CONF);
-}
-
-
-
-
-
-/*
- * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),
- * and return a pointer to the terminator (t + 1).
- */
-static char *object_desc_chr(char *t, char c)
-{
- /* Copy the char */
- *t++ = c;
+ /* Extra powers */
+ object_flags_xtra(o_ptr, &flags);
- /* Terminate */
- *t = '\0';
+ /* Hack - Res Chaos -> Res Confusion */
+ if (flags & TR_RES_CHAOS)
+ {
+ flags |= TR_RES_CONF;
+ }
- /* Result */
- return (t);
+ // Done
+ return flags;
}
-/*
- * Print a string "s" into a string "t", as if by strcpy(t, s),
- * and return a pointer to the terminator.
+/**
+ * Calculate amount of EXP needed for the given object to
+ * level, assuming it's a sentient object.
*/
-static char *object_desc_str(char *t, cptr s)
+s32b calc_object_need_exp(object_type const *o_ptr)
{
- /* Copy the string */
- while (*s) *t++ = *s++;
-
- /* Terminate */
- *t = '\0';
-
- /* Result */
- return (t);
+ return (player_exp[o_ptr->elevel - 1] * 5 / 2);
}
-/*
- * Do the actual conversion of a number for object_desc_num() and
- * object_desc_int().
- */
-static char *convert_number(char *result, u32b num)
-{
- char *tp;
- char temp[11];
-
- tp = temp;
- *tp = '0' + (num % 10);
- for (num /= 10; num != 0; num /= 10)
- {
- *++tp = '0' + (num % 10);
- }
- while (tp != temp)
- {
- *result++ = *tp--;
- }
- *result++ = *tp;
- *result = '\0';
-
- return result;
-}
-
-/*
- * Print a nnumber "n" into a string "t", as if by
- * sprintf(t, "%u", n), and return a pointer to the terminator.
+/**
+ * Calculate the PVAL mask.
*/
-static char *object_desc_num(char *result, s32b num)
+static object_flag_set compute_pval_mask()
{
- u32b n;
-
- if (num < 0)
+ object_flag_set f;
+ for (auto const object_flag_meta: object_flags_meta())
{
- *result++ = '-';
- n = -num;
+ if (object_flag_meta->is_pval)
+ {
+ f |= object_flag_meta->flag_set;
+ }
}
- else
- n = num;
-
- /* Result */
- return convert_number(result, n);
+ return f;
}
-/*
- * Print an signed number "num" into a string "result", as if by
- * sprintf(t, "%+d", n), and return a pointer to the terminator.
- * Note that we always print a sign, either "+" or "-".
- */
-static char *object_desc_int(char *result, s32b num)
-{
- u32b n;
-
- /* Negative */
- if (num < 0)
- {
- /* Take the absolute value */
- n = -num;
-
- /* Use a "minus" sign */
- *result++ = '-';
- }
- /* Positive (or zero) */
- else
- {
- /* Use the actual number */
- n = num;
-
- /* Use a "plus" sign */
- *result++ = '+';
- }
- /* Result */
- return convert_number(result, n);
-}
/*
* Creates a description of the item "o_ptr", and stores it in "out_val".
@@ -1234,55 +1016,41 @@ static char *object_desc_int(char *result, s32b num)
* 2 -- The Cloak of Death [1,+3] (+2 to Stealth)
* 3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty}
*/
-void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
+static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode)
{
- bool_ hack_name = FALSE;
- cptr basenm, modstr;
- int indexx;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
+ auto const &e_info = game->edit_data.e_info;
+ auto const &random_artifacts = game->random_artifacts;
+ static auto const TR_PVAL_MASK = compute_pval_mask();
- bool_ aware = FALSE;
- bool_ known = FALSE;
+ bool_ hack_name = FALSE;
bool_ append_name = FALSE;
bool_ show_weapon = FALSE;
bool_ show_armour = FALSE;
- cptr s, u;
- char *t;
-
- char p1 = '(', p2 = ')';
- char b1 = '[', b2 = ']';
- char c1 = '{', c2 = '}';
-
- char tmp_val[160];
- char tmp_val2[90];
-
- s32b power;
- u32b f1, f2, f3, f4, f5, esp;
-
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
-
- cptr str;
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
+ auto const flags = object_flags(o_ptr);
/* See if the object is "aware" */
- if (object_aware_p(o_ptr)) aware = TRUE;
+ bool_ aware = object_aware_p(o_ptr);
/* See if the object is "known" */
- if (object_known_p(o_ptr)) known = TRUE;
+ bool_ known = object_known_p(o_ptr);
/* Hack -- Extract the sub-type "indexx" */
- indexx = o_ptr->sval;
+ auto const indexx = o_ptr->sval;
/* Extract default "base" string */
- basenm = k_ptr->name;
+ std::string basenm(k_ptr->name);
/* Assume no "modifier" string */
- modstr = "";
+ std::string modstr;
/* Analyze the object */
switch (o_ptr->tval)
@@ -1318,14 +1086,6 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
break;
}
- /* Trapping Kits */
- case TV_TRAPKIT:
- {
- modstr = basenm;
- basenm = "& # Trap Set~";
- break;
- }
-
/* Armour */
case TV_BOOTS:
case TV_GLOVES:
@@ -1359,7 +1119,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
else
basenm = aware ? "& # Amulet~" : "& # Amulet~";
- if (known && !o_ptr->art_name && artifact_p(o_ptr))
+ if (known && o_ptr->artifact_name.empty() && artifact_p(o_ptr))
{
basenm = k_ptr->name;
}
@@ -1382,7 +1142,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Hack -- The One Ring */
if (!aware && (o_ptr->sval == SV_RING_POWER)) modstr = "Plain Gold";
- if (known && !o_ptr->art_name && artifact_p(o_ptr))
+ if (known && o_ptr->artifact_name.empty() && artifact_p(o_ptr))
{
basenm = k_ptr->name;
}
@@ -1530,53 +1290,57 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Hack -- Gold/Gems */
case TV_GOLD:
{
- strcpy(buf, basenm);
- return;
+ return basenm;
}
case TV_CORPSE:
{
- monster_race* r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
+
modstr = basenm;
- if (r_ptr->flags1 & RF1_UNIQUE)
- basenm = format("& %s's #~", r_ptr->name);
+ if (r_ptr->flags & RF_UNIQUE)
+ {
+ basenm = fmt::format("& {}'s #~", r_ptr->name);
+ }
else
- basenm = format("& %s #~", r_ptr->name);
+ {
+ basenm = fmt::format("& {} #~", r_ptr->name);
+ }
break;
}
case TV_EGG:
{
- monster_race* r_ptr = &r_info[o_ptr->pval2];
- modstr = basenm;
+ auto r_ptr = &r_info[o_ptr->pval2];
- basenm = format("& %s #~", r_ptr->name);
+ modstr = basenm;
+ basenm = fmt::format("& {} #~", r_ptr->name);
break;
}
case TV_HYPNOS:
{
/* We print hit points further down. --dsb */
- monster_race* r_ptr = &r_info[o_ptr->pval];
+ auto r_ptr = &r_info[o_ptr->pval];
+
modstr = basenm;
- basenm = format("& %s~", r_ptr->name);
+ basenm = fmt::format("& {}~", r_ptr->name);
break;
}
case TV_TOTEM:
{
- char name[80];
monster_type monster;
-
monster.r_idx = o_ptr->pval;
monster.ego = o_ptr->pval2;
monster.ml = TRUE;
monster.status = MSTATUS_ENEMY;
+ char name[80];
monster_desc(name, &monster, 0x188);
modstr = basenm;
- basenm = format("& #~ of %s", name);
+ basenm = fmt::format("& #~ of {}", name);
break;
}
@@ -1595,23 +1359,6 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
break;
}
- case TV_RUNE2:
- {
- if (o_ptr->sval != RUNE_STONE)
- {
- modstr = basenm;
- basenm = "& Rune~ [#]";
- }
- break;
- }
-
- case TV_RUNE1:
- {
- modstr = basenm;
- basenm = "& Rune~ [#]";
- break;
- }
-
case TV_DAEMON_BOOK:
case TV_BOOK:
{
@@ -1625,36 +1372,31 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Used in the "inventory" routine */
default:
- {
- strcpy(buf, "(nothing)");
- return;
- }
+ return "(nothing)";
}
/* Mega Hack */
- if ((!hack_name) && known && (k_ptr->flags5 & TR5_FULL_NAME))
+ if ((!hack_name) && known && (k_ptr->flags & TR_FULL_NAME))
{
basenm = k_ptr->name;
}
+ /* Copy of the base string _without_ a prefix */
+ std::string s;
/* Start dumping the result */
- t = tmp_val;
+ std::string t;
/* The object "expects" a "number" */
- if (basenm[0] == '&')
+ if (starts_with(basenm, "&"))
{
- monster_race* r_ptr;
cptr ego = NULL;
- if (o_ptr->tval == TV_CORPSE) r_ptr = &r_info[o_ptr->pval2];
- else r_ptr = &r_info[o_ptr->pval];
-
/* Grab any ego-item name */
if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN))
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
- ego_item_type *e2_ptr = &e_info[o_ptr->name2b];
+ auto e_ptr = &e_info[o_ptr->name2];
+ auto e2_ptr = &e_info[o_ptr->name2b];
if (e_ptr->before)
{
@@ -1667,7 +1409,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
}
/* Skip the ampersand (and space) */
- s = basenm + 2;
+ s = basenm.substr(2);
/* No prefix */
if (pref <= 0)
@@ -1678,74 +1420,77 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Hack -- None left */
else if (o_ptr->number <= 0)
{
- t = object_desc_str(t, "no more ");
+ t += "no more ";
}
/* Extract the number */
else if (o_ptr->number > 1)
{
- t = object_desc_num(t, o_ptr->number);
- t = object_desc_chr(t, ' ');
+ t += std::to_string(o_ptr->number);
+ t += ' ';
}
- else if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags1 & RF1_UNIQUE))
- {}
-
+ else if ((o_ptr->tval == TV_CORPSE) && (r_info[o_ptr->pval2].flags & RF_UNIQUE))
+ {
+ /* Nothing */
+ }
- else if ((o_ptr->tval == TV_HYPNOS) && (r_ptr->flags1 & RF1_UNIQUE))
- {}
+ else if ((o_ptr->tval == TV_HYPNOS) && (r_info[o_ptr->pval].flags & RF_UNIQUE))
+ {
+ /* Nothing */
+ }
/* Hack -- The only one of its kind */
- else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
+ else if (known && artifact_p(o_ptr))
{
- t = object_desc_str(t, "The ");
+ t += "The ";
}
else if (ego != NULL)
{
if (is_a_vowel(ego[0]))
{
- t = object_desc_str(t, "an ");
+ t += "an ";
}
else
{
- t = object_desc_str(t, "a ");
+ t += "a ";
}
}
/* A single one, with a vowel in the modifier */
- else if ((*s == '#') && (is_a_vowel(modstr[0])))
+ else if ((s[0] == '#') && (is_a_vowel(modstr[0])))
{
- t = object_desc_str(t, "an ");
+ t += "an ";
}
/* A single one, with a vowel */
- else if (is_a_vowel(*s))
+ else if (is_a_vowel(s[0]))
{
- t = object_desc_str(t, "an ");
+ t += "an ";
}
/* A single one, without a vowel */
else
{
- t = object_desc_str(t, "a ");
+ t += "a ";
}
/* Grab any ego-item name */
if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN))
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
- ego_item_type *e2_ptr = &e_info[o_ptr->name2b];
+ auto e_ptr = &e_info[o_ptr->name2];
+ auto e2_ptr = &e_info[o_ptr->name2b];
if (e_ptr->before)
{
- t = object_desc_str(t, e_ptr->name);
- t = object_desc_chr(t, ' ');
+ t += e_ptr->name;
+ t += ' ';
}
if (e2_ptr->before)
{
- t = object_desc_str(t, e2_ptr->name);
- t = object_desc_chr(t, ' ');
+ t += e2_ptr->name;
+ t += ' ';
}
}
@@ -1753,16 +1498,10 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Dagger inscribed {@w0%Smelly} will be named
* Smelly Dagger {@w0} */
- if (o_ptr->note)
+ if (auto str = strchr(o_ptr->inscription.c_str(), '%'))
{
- str = strchr(quark_str(o_ptr->note), '%');
-
- /* Add the false name */
- if (str)
- {
- t = object_desc_str(t, &str[1]);
- t = object_desc_chr(t, ' ');
- }
+ t += &str[1];
+ t += ' ';
}
}
@@ -1782,14 +1521,14 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Hack -- all gone */
else if (o_ptr->number <= 0)
{
- t = object_desc_str(t, "no more ");
+ t += "no more ";
}
/* Prefix a number if required */
else if (o_ptr->number > 1)
{
- t = object_desc_num(t, o_ptr->number);
- t = object_desc_chr(t, ' ');
+ t += std::to_string(o_ptr->number);
+ t += ' ';
}
else if (o_ptr->tval == TV_RANDART)
@@ -1798,9 +1537,9 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
}
/* Hack -- The only one of its kind */
- else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
+ else if (known && artifact_p(o_ptr))
{
- t = object_desc_str(t, "The ");
+ t += "The ";
}
/* Hack -- single items get no prefix */
@@ -1812,100 +1551,91 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Grab any ego-item name */
if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN))
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
- ego_item_type *e2_ptr = &e_info[o_ptr->name2b];
+ auto e_ptr = &e_info[o_ptr->name2];
+ auto e2_ptr = &e_info[o_ptr->name2b];
if (e_ptr->before)
{
- t = object_desc_str(t, e_ptr->name);
- t = object_desc_chr(t, ' ');
+ t += e_ptr->name;
+ t += ' ';
}
if (e2_ptr->before)
{
- t = object_desc_str(t, e2_ptr->name);
- t = object_desc_chr(t, ' ');
+ t += e2_ptr->name;
+ t += ' ';
}
}
}
- /* Paranoia -- skip illegal tildes */
- /* while (*s == '~') s++; */
-
/* Copy the string */
- for (; *s; s++)
+ for (auto const c: s)
{
/* Pluralizer */
- if (*s == '~')
+ if (c == '~')
{
/* Add a plural if needed */
if ((o_ptr->number != 1) && (pref >= 0))
{
- char k = t[ -1];
+ assert(t.size() > 0);
+ char k = t[t.size() - 1];
/* XXX XXX XXX Mega-Hack */
/* Hack -- "Cutlass-es" and "Torch-es" */
- if ((k == 's') || (k == 'h')) *t++ = 'e';
+ if ((k == 's') || (k == 'h')) {
+ t += "e";
+ }
/* Add an 's' */
- *t++ = 's';
+ t += "s";
}
}
/* Modifier */
- else if (*s == '#')
+ else if (c == '#')
{
/* Grab any ego-item name */
if (o_ptr->tval == TV_ROD_MAIN)
{
- t = object_desc_chr(t, ' ');
+ t += ' ';
if (known && o_ptr->name2)
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
- t = object_desc_str(t, e_ptr->name);
+ auto e_ptr = &e_info[o_ptr->name2];
+ t += e_ptr->name;
}
}
/* Insert the modifier */
- for (u = modstr; *u; u++) *t++ = *u;
+ t += modstr;
}
/* Normal */
else
{
/* Copy */
- *t++ = *s;
+ t += c;
}
}
- /* Terminate */
- *t = '\0';
-
-
/* Append the "kind name" to the "base name" */
if ((append_name) && (!artifact_p(o_ptr)))
{
- t = object_desc_str(t, " of ");
+ t += " of ";
if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)))
{
- t = object_desc_str(t, spell_type_name(spell_at(o_ptr->pval2)));
+ t += spell_type_name(spell_at(o_ptr->pval2));
if (mode >= 1)
{
s32b bonus = o_ptr->pval3 & 0xFFFF;
s32b max = o_ptr->pval3 >> 16;
-
- t = object_desc_chr(t, '[');
- t = object_desc_num(t, bonus);
- t = object_desc_chr(t, '|');
- t = object_desc_num(t, max);
- t = object_desc_chr(t, ']');
+ t += fmt::format("[{:d}|{:d}]", bonus, max);
}
}
else
{
- t = object_desc_str(t, k_ptr->name);
+ t += k_ptr->name;
}
}
@@ -1916,93 +1646,77 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* -TM- Hack -- Add false-artifact names */
/* Dagger inscribed {@w0#of Smell} will be named
* Dagger of Smell {@w0} */
- if (o_ptr->note)
+ if (auto str = strchr(o_ptr->inscription.c_str(), '#'))
{
- str = strchr(quark_str(o_ptr->note), '#');
-
- /* Add the false name */
- if (str)
- {
- t = object_desc_chr(t, ' ');
- t = object_desc_str(t, &str[1]);
- }
+ t += ' ';
+ t += &str[1];
}
/* Is it a new random artifact ? */
- if (o_ptr->art_name)
+ if (!o_ptr->artifact_name.empty())
{
- t = object_desc_chr(t, ' ');
-
- t = object_desc_str(t, quark_str(o_ptr->art_name));
+ t += ' ';
+ t += o_ptr->artifact_name;
}
/* Grab any artifact name */
else if (o_ptr->name1)
{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
/* Unique corpses don't require another name */
if (o_ptr->tval != TV_CORPSE)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_str(t, a_ptr->name);
+ t += ' ';
+ t += a_ptr->name;
}
}
/* Grab any ego-item name */
else if ((o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN))
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
- ego_item_type *e2_ptr = &e_info[o_ptr->name2b];
+ auto e_ptr = &e_info[o_ptr->name2];
+ auto e2_ptr = &e_info[o_ptr->name2b];
if (o_ptr->name2 && !e_ptr->before)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_str(t, e_ptr->name);
+ t += ' ';
+ t += e_ptr->name;
}
if (o_ptr->name2b && !e2_ptr->before)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_str(t, e2_ptr->name);
+ t += ' ';
+ t += e2_ptr->name;
}
}
}
/* It contains a spell */
- if ((known) && (f5 & TR5_SPELL_CONTAIN) && (o_ptr->pval2 != -1))
+ if (known && (flags & TR_SPELL_CONTAIN) && (o_ptr->pval2 != -1))
{
- t = object_desc_str(t, format(" [%s]", spell_type_name(spell_at(o_ptr->pval2))));
+ t += fmt::format(" [{}]", spell_type_name(spell_at(o_ptr->pval2)));
}
/* Add symbiote hp here, after the "fake-artifact" name. --dsb */
if (o_ptr->tval == TV_HYPNOS)
{
- t = object_desc_str(t, " (");
- t = object_desc_num(t, o_ptr->pval2);
- t = object_desc_str(t, " hp)");
+ t += fmt::format(" ({:d} hp)", o_ptr->pval2);
}
/* No more details wanted */
- if (mode < 1) goto copyback;
+ if (mode < 1)
+ {
+ return t;
+ }
/* Hack -- Some objects can have an exp level */
- if ((f4 & TR4_LEVELS) && known)
+ if ((flags & TR_LEVELS) && known)
{
- t = object_desc_str(t, " (E:");
- if (o_ptr->elevel < PY_MAX_LEVEL)
- {
- /* Formula from check_experience_obj(). */
- s32b need = player_exp[o_ptr->elevel - 1] * 5 / 2;
- t = object_desc_num(t, need - o_ptr->exp);
- }
- else
- {
- t = object_desc_str(t, "*****");
- }
- t = object_desc_str(t, ", L:");
- t = object_desc_num(t, o_ptr->elevel);
- t = object_desc_chr(t, ')');
+ auto need_exp = (o_ptr->elevel < PY_MAX_LEVEL)
+ ? std::to_string(calc_object_need_exp(o_ptr) - o_ptr->exp)
+ : "*****";
+ t += fmt::format(" (E:{}, L:{})", need_exp, o_ptr->elevel);
}
/* Hack -- Chests must be described in detail */
@@ -2017,35 +1731,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* May be "empty" */
else if (!o_ptr->pval)
{
- t = object_desc_str(t, " (empty)");
- }
-
- /* May be "disarmed" */
- else if (o_ptr->pval < 0)
- {
- t = object_desc_str(t, " (disarmed)");
- }
-
- /* Describe the traps, if any */
- else
- {
- /* Describe the traps */
- t = object_desc_str(t, " (");
- if (t_info[o_ptr->pval].ident)
- {
- t = object_desc_str(t, t_info[o_ptr->pval].name);
- }
- else
- {
- t = object_desc_str(t, "trapped");
- }
- t = object_desc_str(t, ")");
+ t += " (empty)";
}
}
/* Display the item like a weapon */
- if (f3 & (TR3_SHOW_MODS)) show_weapon = TRUE;
+ if (flags & TR_SHOW_MODS) show_weapon = TRUE;
/* Display the item like a weapon */
if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE;
@@ -2062,7 +1754,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
case TV_ARROW:
/* Exploding arrow? */
if (o_ptr->pval2 != 0)
- t = object_desc_str(t, " (exploding)");
+ t += " (exploding)";
/* No break, we want to continue the description */
case TV_BOOMERANG:
@@ -2076,12 +1768,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
break;
/* Append a "damage" string */
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, p1);
- t = object_desc_num(t, o_ptr->dd);
- t = object_desc_chr(t, 'd');
- t = object_desc_num(t, o_ptr->ds);
- t = object_desc_chr(t, p2);
+ t += fmt::format(" ({:d}d{:d})", o_ptr->dd, o_ptr->ds);
/* All done */
break;
@@ -2089,19 +1776,14 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Bows get a special "damage string" */
case TV_BOW:
-
/* Mega-Hack -- Extract the "base power" */
- power = (o_ptr->sval % 10);
+ s32b power = (o_ptr->sval % 10);
/* Apply the "Extra Might" flag */
- if (f3 & (TR3_XTRA_MIGHT)) power += o_ptr->pval;
+ if (flags & TR_XTRA_MIGHT) power += o_ptr->pval;
/* Append a special "damage" string */
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, p1);
- t = object_desc_chr(t, 'x');
- t = object_desc_num(t, power);
- t = object_desc_chr(t, p2);
+ t += fmt::format(" (x{:d})", power);
/* All done */
break;
@@ -2114,34 +1796,29 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Show the tohit/todam on request */
if (show_weapon)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, p1);
- t = object_desc_int(t, o_ptr->to_h);
- t = object_desc_chr(t, ',');
- t = object_desc_int(t, o_ptr->to_d);
- t = object_desc_chr(t, p2);
+ t += fmt::format(" ({:+d},{:+d})", o_ptr->to_h, o_ptr->to_d);
}
/* Show the tohit if needed */
else if (o_ptr->to_h)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, p1);
- t = object_desc_int(t, o_ptr->to_h);
- if (!(f3 & (TR3_HIDE_TYPE)) || o_ptr->art_name)
- t = object_desc_str(t, " to accuracy");
- t = object_desc_chr(t, p2);
+ t += fmt::format(" ({:+d}", o_ptr->to_h);
+ if (!(flags & TR_HIDE_TYPE) || (!o_ptr->artifact_name.empty()))
+ {
+ t += " to accuracy";
+ }
+ t += ')';
}
/* Show the todam if needed */
else if (o_ptr->to_d)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, p1);
- t = object_desc_int(t, o_ptr->to_d);
- if (!(f3 & (TR3_HIDE_TYPE)) || o_ptr->art_name)
- t = object_desc_str(t, " to damage");
- t = object_desc_chr(t, p2);
+ t += fmt::format(" ({:+d}", o_ptr->to_d);
+ if (!(flags & TR_HIDE_TYPE) || (!o_ptr->artifact_name.empty()))
+ {
+ t += " to damage";
+ }
+ t += ')';
}
}
@@ -2152,49 +1829,37 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
/* Show the armor class info */
if (show_armour)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, b1);
- t = object_desc_num(t, o_ptr->ac);
- t = object_desc_chr(t, ',');
- t = object_desc_int(t, o_ptr->to_a);
- t = object_desc_chr(t, b2);
+ t += fmt::format(" [{:d},{:+d}]", o_ptr->ac, o_ptr->to_a);
}
/* No base armor, but does increase armor */
else if (o_ptr->to_a)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, b1);
- t = object_desc_int(t, o_ptr->to_a);
- t = object_desc_chr(t, b2);
+ t += fmt::format(" [{:+d}]", o_ptr->to_a);
}
}
/* Hack -- always show base armor */
else if (show_armour)
{
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, b1);
- t = object_desc_num(t, o_ptr->ac);
- t = object_desc_chr(t, b2);
+ t += fmt::format(" [{:d}]", o_ptr->ac);
}
- if ((f1 & TR1_MANA) && (known) && (o_ptr->pval > 0))
+ if ((flags & TR_MANA) && known && (o_ptr->pval > 0))
{
- t = object_desc_chr(t, '(');
- t = object_desc_num(t, 100 * o_ptr->pval / 5);
- t = object_desc_str(t, "%)");
+ t += fmt::format("({:d}%)", 100 * o_ptr->pval / 5);
}
- if ((known) && (f2 & TR2_LIFE) ) /* Can disp neg now -- Improv */
+ if (known && (flags & TR_LIFE) ) /* Can disp neg now -- Improv */
{
- t = object_desc_chr(t, '(');
- t = object_desc_num(t, 100 * o_ptr->pval / 5);
- t = object_desc_str(t, "%)");
+ t += fmt::format("({:d}%)", 100 * o_ptr->pval / 5);
}
/* No more details wanted */
- if (mode < 2) goto copyback;
+ if (mode < 2)
+ {
+ return t;
+ }
/* Hack -- Wands and Staffs have charges */
@@ -2202,13 +1867,8 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
((o_ptr->tval == TV_STAFF) ||
(o_ptr->tval == TV_WAND)))
{
- /* Dump " (N charges)" */
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, p1);
- t = object_desc_num(t, o_ptr->pval);
- t = object_desc_str(t, " charge");
- if (o_ptr->pval != 1) t = object_desc_chr(t, 's');
- t = object_desc_chr(t, p2);
+ auto plural = (o_ptr->pval != 1) ? "s" : "";
+ t += fmt::format(" ({:d} charge{})", o_ptr->pval, plural);
}
/*
@@ -2216,12 +1876,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
*/
else if (known && (o_ptr->tval == TV_ROD_MAIN))
{
- /* Display prettily. */
- t = object_desc_str(t, " (");
- t = object_desc_num(t, o_ptr->timeout);
- t = object_desc_chr(t, '/');
- t = object_desc_num(t, o_ptr->pval2);
- t = object_desc_chr(t, ')');
+ t += fmt::format(" ({:d}/{:d})", o_ptr->timeout, o_ptr->pval2);
}
/*
@@ -2229,201 +1884,166 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
*/
else if (known && (o_ptr->tval == TV_ROD))
{
- /* Display prettily. */
- t = object_desc_str(t, " (");
- t = object_desc_num(t, o_ptr->pval);
- t = object_desc_str(t, " Mana to cast");
- t = object_desc_chr(t, ')');
+ t += fmt::format(" ({:d} Mana to cast)", o_ptr->pval);
}
/* Hack -- Process Lanterns/Torches */
- else if ((o_ptr->tval == TV_LITE) && (f4 & TR4_FUEL_LITE))
+ else if ((o_ptr->tval == TV_LITE) && (flags & TR_FUEL_LITE))
{
- /* Hack -- Turns of light for normal lites */
- t = object_desc_str(t, " (with ");
- t = object_desc_num(t, o_ptr->timeout);
- t = object_desc_str(t, " turns of light)");
+ t += fmt::format(" (with {:d} turns of light)", o_ptr->timeout);
}
/* Dump "pval" flags for wearable items */
- if (known && ((f1 & (TR1_PVAL_MASK)) || (f5 & (TR5_PVAL_MASK))))
+ if (known && (flags & TR_PVAL_MASK))
{
/* Start the display */
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, p1);
-
- /* Dump the "pval" itself */
- t = object_desc_int(t, o_ptr->pval);
+ t += fmt::format(" ({:+d}", o_ptr->pval);
/* Do not display the "pval" flags */
- if (f3 & (TR3_HIDE_TYPE))
+ if (flags & TR_HIDE_TYPE)
{
/* Nothing */
}
/* Speed */
- else if (f1 & (TR1_SPEED))
+ else if (flags & TR_SPEED)
{
- /* Dump " to speed" */
- t = object_desc_str(t, " to speed");
+ t += " to speed";
}
/* Attack speed */
- else if (f1 & (TR1_BLOWS))
+ else if (flags & TR_BLOWS)
{
- /* Add " attack" */
- t = object_desc_str(t, " attack");
-
- /* Add "attacks" */
- if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's');
+ t += " attack";
+ if (ABS(o_ptr->pval) != 1)
+ {
+ t += 's';
+ }
}
/* Critical chance */
- else if (f5 & (TR5_CRIT))
+ else if (flags & TR_CRIT)
{
- /* Add " attack" */
- t = object_desc_str(t, "% of critical hits");
+ t += "% of critical hits";
}
/* Stealth */
- else if (f1 & (TR1_STEALTH))
- {
- /* Dump " to stealth" */
- t = object_desc_str(t, " to stealth");
- }
-
- /* Search */
- else if (f1 & (TR1_SEARCH))
+ else if (flags & TR_STEALTH)
{
- /* Dump " to searching" */
- t = object_desc_str(t, " to searching");
+ t += " to stealth";
}
/* Infravision */
- else if (f1 & (TR1_INFRA))
+ else if (flags & TR_INFRA)
{
- /* Dump " to infravision" */
- t = object_desc_str(t, " to infravision");
+ t += " to infravision";
}
/* Tunneling */
- else if (f1 & (TR1_TUNNEL))
+ else if (flags & TR_TUNNEL)
{
/* Nothing */
}
/* Finish the display */
- t = object_desc_chr(t, p2);
+ t += ')';
}
/* Indicate "charging" artifacts XXX XXX XXX */
- if (known && (f3 & TR3_ACTIVATE) && o_ptr->timeout)
+ if (known && (flags & TR_ACTIVATE) && o_ptr->timeout)
{
- if(o_ptr->tval == TV_EGG)
- /* Hack -- Dump " (stopped)" if relevant */
- t = object_desc_str(t, " (stopped)");
+ if (o_ptr->tval == TV_EGG)
+ {
+ t += " (stopped)";
+ }
else
- /* Hack -- Dump " (charging)" if relevant */
- t = object_desc_str(t, " (charging)");
- }
-
- /* Indicate "charging" Mage Staffs XXX XXX XXX */
- if (known && o_ptr->timeout && (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)))
- {
- /* Hack -- Dump " (charging spell1)" if relevant */
- t = object_desc_str(t, " (charging spell1)");
- }
- if (known && o_ptr->xtra2 && (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)))
- {
- /* Hack -- Dump " (charging spell2)" if relevant */
- t = object_desc_str(t, " (charging spell2)");
+ {
+ t += " (charging)";
+ }
}
/* No more details wanted */
- if (mode < 3) goto copyback;
-
-
- /* No inscription yet */
- tmp_val2[0] = '\0';
-
- /* Sensed stuff */
- if (o_ptr->ident & (IDENT_SENSE))
+ if (mode < 3)
{
- strcpy(tmp_val2, sense_desc[o_ptr->sense]);
+ return t;
}
- /* Hack - Note "cursed" if the item is 'known' and cursed */
- if (cursed_p(o_ptr) && (known) && (!tmp_val2[0]))
- {
- if (tmp_val2[0]) strcat(tmp_val2, ", ");
- strcat(tmp_val2, "cursed");
- }
- /* Use the standard inscription if available */
- if (o_ptr->note)
+ /* Inscribe */
{
- char *u = tmp_val2;
+ std::vector<std::string> inscrip;
- if (tmp_val2[0]) strcat(tmp_val2, ", ");
-
- strcat(tmp_val2, quark_str(o_ptr->note));
-
- for (; *u && (*u != '#') && (*u != '%'); u++);
+ /* Sensed stuff */
+ if ((o_ptr->ident & (IDENT_SENSE)) && sense_desc[o_ptr->sense] && sense_desc[o_ptr->sense][0] != '\0')
+ {
+ inscrip.push_back(sense_desc[o_ptr->sense]);
+ }
- *u = '\0';
- }
+ /* Hack - Note "cursed" if the item is 'known' and cursed */
+ if (cursed_p(o_ptr) && known && inscrip.empty())
+ {
+ inscrip.push_back("cursed");
+ }
- /* Mega-Hack -- note empty wands/staffs */
- if (!known && (o_ptr->ident & (IDENT_EMPTY)))
- {
- if (tmp_val2[0]) strcat(tmp_val2, ", ");
- strcat(tmp_val2, "empty");
- }
+ /* Use the standard inscription if available;
+ Chop at '#' or '%' if present. The suffix of the
+ '%' or '#' is handled elsewhere in this function.
+ */
+ if (auto const pos = o_ptr->inscription.find_first_of("%#") != std::string::npos)
+ {
+ inscrip.push_back(o_ptr->inscription.substr(0, pos));
+ }
- /* Note "tried" if the object has been tested unsuccessfully */
- if (!aware && object_tried_p(o_ptr))
- {
- if (tmp_val2[0]) strcat(tmp_val2, ", ");
- strcpy(tmp_val2, "tried");
- }
+ /* Mega-Hack -- note empty wands/staffs */
+ if (!known && (o_ptr->ident & (IDENT_EMPTY)))
+ {
+ inscrip.push_back("empty");
+ }
- /* Note the discount, if any */
- if ((o_ptr->discount) && (!tmp_val2[0]))
- {
- object_desc_num(tmp_val2, o_ptr->discount);
- strcat(tmp_val2, "% off");
- }
+ /* Note "tried" if the object has been tested unsuccessfully */
+ if (!aware && object_tried_p(o_ptr))
+ {
+ inscrip.push_back("tried");
+ }
- /* Append the inscription, if any */
- if (tmp_val2[0])
- {
- int n;
+ /* Note the discount, if any */
+ if ((o_ptr->discount) && o_ptr->inscription.empty())
+ {
+ inscrip.push_back(fmt::format("{:d}% off", o_ptr->discount));
+ }
- /* Hack -- How much so far */
- n = (t - tmp_val);
+ /* Append the user's inscription */
+ if (!o_ptr->inscription.empty())
+ {
+ inscrip.push_back(o_ptr->inscription);
+ }
- /* Paranoia -- do not be stupid */
- if (n > 75) n = 75;
+ /* Append the inscription, if any */
+ if (!inscrip.empty())
+ {
+ auto inscrip_str = boost::algorithm::join(inscrip, ", ");
- /* Hack -- shrink the inscription */
- tmp_val2[75 - n] = '\0';
+ /* Make sure we don't exceed 75 characters */
+ t.resize(std::min<std::size_t>(t.size(), 75));
- /* Append the inscription */
- t = object_desc_chr(t, ' ');
- t = object_desc_chr(t, c1);
- t = object_desc_str(t, tmp_val2);
- t = object_desc_chr(t, c2);
+ /* Append the inscription */
+ t += fmt::format(" {{{}}}", inscrip_str);
+ }
}
-copyback:
- /* Here's where we dump the built string into buf. */
- tmp_val[79] = '\0';
- t = tmp_val;
- while ((*(buf++) = *(t++))); /* copy the string over */
+
+ return t;
}
+void object_desc(char *buf, object_type const *o_ptr, int pref, int mode)
+{
+ auto s = object_desc_aux(o_ptr, pref, mode);
+ auto n = std::min<std::size_t>(s.size(), 79);
+ s.copy(buf, n);
+ buf[n] = '\0';
+}
/*
* Hack -- describe an item currently in a store's inventory
@@ -2431,6 +2051,8 @@ copyback:
*/
void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode)
{
+ auto &k_info = game->edit_data.k_info;
+
/* Save the "aware" flag */
bool_ hack_aware = k_info[o_ptr->k_idx].aware;
@@ -2463,18 +2085,16 @@ void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode)
* Determine the "Activation" (if any) for an artifact
* Return a string, or NULL for "no activation"
*/
-cptr item_activation(object_type *o_ptr, byte num)
+cptr item_activation(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
- /* Needed hacks */
- static char rspell[2][80];
+ auto const &a_info = game->edit_data.a_info;
+ auto const &e_info = game->edit_data.e_info;
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Require activation ability */
- if (!(f3 & (TR3_ACTIVATE))) return (NULL);
+ if (!(flags & TR_ACTIVATE)) return (NULL);
/*
@@ -2484,29 +2104,6 @@ cptr item_activation(object_type *o_ptr, byte num)
* for art_name
*/
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))
- {
- int gf, mod, mana;
-
- if (!num)
- {
- gf = o_ptr->pval & 0xFFFF;
- mod = o_ptr->pval3 & 0xFFFF;
- mana = o_ptr->pval2 & 0xFF;
- }
- else
- {
- gf = o_ptr->pval >> 16;
- mod = o_ptr->pval3 >> 16;
- mana = o_ptr->pval2 >> 8;
- }
- sprintf(rspell[num], "runespell(%s, %s, %d) every %d turns",
- k_info[lookup_kind(TV_RUNE1, gf)].name,
- k_info[lookup_kind(TV_RUNE2, mod)].name,
- mana, mana * 5);
- return rspell[num];
- }
-
if (o_ptr->tval == TV_EGG)
{
return "stop or resume the egg development";
@@ -2546,8 +2143,16 @@ static bool_ grab_tval_desc(int tval)
return TRUE;
}
-#define CHECK_FIRST(txt, first) \
-if ((first)) { (first) = FALSE; text_out((txt)); } else text_out(", ");
+static void check_first(bool_ *first)
+{
+ if (*first) {
+ *first = FALSE;
+ }
+ else
+ {
+ text_out(", ");
+ }
+}
/*
* Display the damage done with a multiplier
@@ -2559,7 +2164,7 @@ void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr agai
dam = (o_ptr->dd + (o_ptr->dd * o_ptr->ds)) * 5 * mult;
dam += (o_ptr->to_d + p_ptr->to_d + p_ptr->to_d_melee) * 10;
dam *= p_ptr->num_blow;
- CHECK_FIRST("", *first);
+ check_first(first);
if (dam > 0)
{
if (dam % 10)
@@ -2576,7 +2181,7 @@ void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr agai
dam = (o_ptr->dd + (o_ptr->dd * o_ptr->ds)) * 5 * mult2;
dam += (o_ptr->to_d + p_ptr->to_d + p_ptr->to_d_melee) * 10;
dam *= p_ptr->num_blow;
- CHECK_FIRST("", *first);
+ check_first(first);
if (dam > 0)
{
if (dam % 10)
@@ -2596,12 +2201,11 @@ void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr agai
void display_weapon_damage(object_type *o_ptr)
{
object_type forge, *old_ptr = &forge;
- u32b f1, f2, f3, f4, f5, esp;
bool_ first = TRUE;
bool_ full = o_ptr->ident & (IDENT_MENTAL);
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Ok now the hackish stuff, we replace the current weapon with this one */
object_copy(old_ptr, &p_ptr->inventory[INVEN_WIELD]);
@@ -2612,23 +2216,23 @@ void display_weapon_damage(object_type *o_ptr)
text_out_c(TERM_L_GREEN, format("%d ", p_ptr->num_blow));
text_out(format("blow%s and do an average damage per turn of ", (p_ptr->num_blow) ? "s" : ""));
- if (full && (f1 & TR1_SLAY_ANIMAL)) output_dam(o_ptr, 2, 0, "animals", NULL, &first);
- if (full && (f1 & TR1_SLAY_EVIL)) output_dam(o_ptr, 2, 0, "evil creatures", NULL, &first);
- if (full && (f1 & TR1_SLAY_ORC)) output_dam(o_ptr, 3, 0, "orcs", NULL, &first);
- if (full && (f1 & TR1_SLAY_TROLL)) output_dam(o_ptr, 3, 0, "trolls", NULL, &first);
- if (full && (f1 & TR1_SLAY_GIANT)) output_dam(o_ptr, 3, 0, "giants", NULL, &first);
- if (full && (f1 & TR1_KILL_DRAGON)) output_dam(o_ptr, 5, 0, "dragons", NULL, &first);
- else if (full && (f1 & TR1_SLAY_DRAGON)) output_dam(o_ptr, 3, 0, "dragons", NULL, &first);
- if (full && (f5 & TR5_KILL_UNDEAD)) output_dam(o_ptr, 5, 0, "undead", NULL, &first);
- else if (full && (f1 & TR1_SLAY_UNDEAD)) output_dam(o_ptr, 3, 0, "undead", NULL, &first);
- if (full && (f5 & TR5_KILL_DEMON)) output_dam(o_ptr, 5, 0, "demons", NULL, &first);
- else if (full && (f1 & TR1_SLAY_DEMON)) output_dam(o_ptr, 3, 0, "demons", NULL, &first);
-
- if (full && (f1 & TR1_BRAND_FIRE)) output_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_COLD)) output_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_ELEC)) output_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_ACID)) output_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_POIS)) output_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first);
+ if (full && (flags & TR_SLAY_ANIMAL)) output_dam(o_ptr, 2, 0, "animals", NULL, &first);
+ if (full && (flags & TR_SLAY_EVIL)) output_dam(o_ptr, 2, 0, "evil creatures", NULL, &first);
+ if (full && (flags & TR_SLAY_ORC)) output_dam(o_ptr, 3, 0, "orcs", NULL, &first);
+ if (full && (flags & TR_SLAY_TROLL)) output_dam(o_ptr, 3, 0, "trolls", NULL, &first);
+ if (full && (flags & TR_SLAY_GIANT)) output_dam(o_ptr, 3, 0, "giants", NULL, &first);
+ if (full && (flags & TR_KILL_DRAGON)) output_dam(o_ptr, 5, 0, "dragons", NULL, &first);
+ else if (full && (flags & TR_SLAY_DRAGON)) output_dam(o_ptr, 3, 0, "dragons", NULL, &first);
+ if (full && (flags & TR_KILL_UNDEAD)) output_dam(o_ptr, 5, 0, "undead", NULL, &first);
+ else if (full && (flags & TR_SLAY_UNDEAD)) output_dam(o_ptr, 3, 0, "undead", NULL, &first);
+ if (full && (flags & TR_KILL_DEMON)) output_dam(o_ptr, 5, 0, "demons", NULL, &first);
+ else if (full && (flags & TR_SLAY_DEMON)) output_dam(o_ptr, 3, 0, "demons", NULL, &first);
+
+ if (full && (flags & TR_BRAND_FIRE)) output_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_COLD)) output_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_ELEC)) output_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_ACID)) output_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_POIS)) output_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first);
output_dam(o_ptr, 1, 0, (first) ? "all monsters" : "other monsters", NULL, &first);
@@ -2656,7 +2260,7 @@ void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr
dam *= tmul;
if (!is_boomerang) dam += (p_ptr->to_d_ranged) * 10;
dam *= mult;
- CHECK_FIRST("", *first);
+ check_first(first);
if (dam > 0)
{
if (dam % 10)
@@ -2676,7 +2280,7 @@ void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr
dam *= tmul;
if (!is_boomerang) dam += (p_ptr->to_d_ranged) * 10;
dam *= mult2;
- CHECK_FIRST("", *first);
+ check_first(first);
if (dam > 0)
{
if (dam % 10)
@@ -2695,35 +2299,34 @@ void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr
*/
void display_ammo_damage(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
bool_ first = TRUE;
int i;
bool_ full = o_ptr->ident & (IDENT_MENTAL);
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
if (o_ptr->tval == TV_BOOMERANG)
text_out("\nUsing it you would do an average damage per throw of ");
else
text_out("\nUsing it with your current shooter you would do an average damage per shot of ");
- if (full && (f1 & TR1_SLAY_ANIMAL)) output_ammo_dam(o_ptr, 2, 0, "animals", NULL, &first);
- if (full && (f1 & TR1_SLAY_EVIL)) output_ammo_dam(o_ptr, 2, 0, "evil creatures", NULL, &first);
- if (full && (f1 & TR1_SLAY_ORC)) output_ammo_dam(o_ptr, 3, 0, "orcs", NULL, &first);
- if (full && (f1 & TR1_SLAY_TROLL)) output_ammo_dam(o_ptr, 3, 0, "trolls", NULL, &first);
- if (full && (f1 & TR1_SLAY_GIANT)) output_ammo_dam(o_ptr, 3, 0, "giants", NULL, &first);
- if (full && (f1 & TR1_KILL_DRAGON)) output_ammo_dam(o_ptr, 5, 0, "dragons", NULL, &first);
- else if (full && (f1 & TR1_SLAY_DRAGON)) output_ammo_dam(o_ptr, 3, 0, "dragons", NULL, &first);
- if (full && (f5 & TR5_KILL_UNDEAD)) output_ammo_dam(o_ptr, 5, 0, "undeads", NULL, &first);
- else if (full && (f1 & TR1_SLAY_UNDEAD)) output_ammo_dam(o_ptr, 3, 0, "undeads", NULL, &first);
- if (full && (f5 & TR5_KILL_DEMON)) output_ammo_dam(o_ptr, 5, 0, "demons", NULL, &first);
- else if (full && (f1 & TR1_SLAY_DEMON)) output_ammo_dam(o_ptr, 3, 0, "demons", NULL, &first);
-
- if (full && (f1 & TR1_BRAND_FIRE)) output_ammo_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_COLD)) output_ammo_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_ELEC)) output_ammo_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_ACID)) output_ammo_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first);
- if (full && (f1 & TR1_BRAND_POIS)) output_ammo_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first);
+ if (full && (flags & TR_SLAY_ANIMAL)) output_ammo_dam(o_ptr, 2, 0, "animals", NULL, &first);
+ if (full && (flags & TR_SLAY_EVIL)) output_ammo_dam(o_ptr, 2, 0, "evil creatures", NULL, &first);
+ if (full && (flags & TR_SLAY_ORC)) output_ammo_dam(o_ptr, 3, 0, "orcs", NULL, &first);
+ if (full && (flags & TR_SLAY_TROLL)) output_ammo_dam(o_ptr, 3, 0, "trolls", NULL, &first);
+ if (full && (flags & TR_SLAY_GIANT)) output_ammo_dam(o_ptr, 3, 0, "giants", NULL, &first);
+ if (full && (flags & TR_KILL_DRAGON)) output_ammo_dam(o_ptr, 5, 0, "dragons", NULL, &first);
+ else if (full && (flags & TR_SLAY_DRAGON)) output_ammo_dam(o_ptr, 3, 0, "dragons", NULL, &first);
+ if (full && (flags & TR_KILL_UNDEAD)) output_ammo_dam(o_ptr, 5, 0, "undeads", NULL, &first);
+ else if (full && (flags & TR_SLAY_UNDEAD)) output_ammo_dam(o_ptr, 3, 0, "undeads", NULL, &first);
+ if (full && (flags & TR_KILL_DEMON)) output_ammo_dam(o_ptr, 5, 0, "demons", NULL, &first);
+ else if (full && (flags & TR_SLAY_DEMON)) output_ammo_dam(o_ptr, 3, 0, "demons", NULL, &first);
+
+ if (full && (flags & TR_BRAND_FIRE)) output_ammo_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_COLD)) output_ammo_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_ELEC)) output_ammo_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_ACID)) output_ammo_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first);
+ if (full && (flags & TR_BRAND_POIS)) output_ammo_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first);
output_ammo_dam(o_ptr, 1, 0, (first) ? "all monsters" : "other monsters", NULL, &first);
text_out(". ");
@@ -2767,7 +2370,7 @@ static void describe_device(object_type *o_ptr)
});
text_out("\nSpell level: ");
- sprintf(buf, FMTs32b, get_level(o_ptr->pval2, 50, 0));
+ sprintf(buf, FMTs32b, get_level(o_ptr->pval2, 50));
text_out_c(TERM_L_BLUE, buf);
text_out("\nMinimum Magic Device level to increase spell level: ");
@@ -2796,6 +2399,9 @@ static void describe_device(object_type *o_ptr)
*/
static cptr object_out_desc_where_found(s16b level, s16b dungeon)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto const &wf_info = game->edit_data.wf_info;
+
static char str[80];
if (dungeon == DUNGEON_WILDERNESS)
@@ -2816,7 +2422,7 @@ static cptr object_out_desc_where_found(s16b level, s16b dungeon)
}
else
{
- sprintf(str, "on level %d of %s", level, d_info[dungeon].name);
+ sprintf(str, "on level %d of %s", level, d_info[dungeon].name.c_str());
}
return str;
@@ -2827,29 +2433,25 @@ static cptr object_out_desc_where_found(s16b level, s16b dungeon)
*/
bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it)
{
- u32b f1, f2, f3, f4, f5, esp;
-
- const char *txt;
+ auto const &set_info = game->edit_data.set_info;
+ auto const &st_info = game->edit_data.st_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
cptr vp[64];
byte vc[64];
int vn;
- bool_ first = TRUE;
+ object_flag_set flags;
/* Extract the flags */
if ((!(o_ptr->ident & (IDENT_MENTAL))) && (!fff))
{
- f1 = o_ptr->art_oflags1;
- f2 = o_ptr->art_oflags2;
- f3 = o_ptr->art_oflags3;
- f4 = o_ptr->art_oflags4;
- f5 = o_ptr->art_oflags5;
- esp = o_ptr->art_oesp;
+ flags = o_ptr->art_oflags;
}
else
{
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ flags = object_flags(o_ptr);
}
if (fff)
@@ -2879,7 +2481,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
{
if (o_ptr->k_idx && (!trim_down))
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto k_ptr = &k_info[o_ptr->k_idx];
text_out_c(TERM_ORANGE, k_ptr->text);
text_out("\n");
@@ -2887,41 +2489,38 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
if (o_ptr->name1 && (!trim_down))
{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
text_out_c(TERM_YELLOW, a_ptr->text);
text_out("\n");
if (a_ptr->set != -1)
{
- text_out_c(TERM_GREEN, set_info[a_ptr->set].desc);
+ text_out_c(TERM_GREEN, set_info[a_ptr->set].desc.c_str());
text_out("\n");
}
}
- if ((f4 & TR4_LEVELS) && (!trim_down))
+ if ((flags & TR_LEVELS) && (!trim_down))
{
- int j = 0;
-
- if (count_bits(o_ptr->pval3) == 0) text_out("It is sentient");
+ if (o_ptr->pval3 == 0) text_out("It is sentient");
else if (count_bits(o_ptr->pval3) > 1) text_out("It is sentient and can have access to the realms of ");
else text_out("It is sentient and can have access to the realm of ");
- first = TRUE;
- txt = "";
- for (j = 0; j < MAX_FLAG_GROUP; j++)
+ bool_ first = TRUE;
+ for (std::size_t j = 0; j < flags_groups().size(); j++)
{
if (BIT(j) & o_ptr->pval3)
{
- CHECK_FIRST(txt, first);
- text_out_c(flags_groups[j].color, flags_groups[j].name);
+ check_first(&first);
+ text_out_c(flags_groups()[j].color, flags_groups()[j].name);
}
}
text_out(". ");
}
- if (f4 & TR4_ULTIMATE)
+ if (flags & TR_ULTIMATE)
{
if ((wield_slot(o_ptr) == INVEN_WIELD) ||
(wield_slot(o_ptr) == INVEN_BOW))
@@ -2930,24 +2529,17 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
text_out_c(TERM_VIOLET, "It is the ultimate armor. ");
}
- if (f4 & TR4_COULD2H) text_out("It can be wielded two-handed. ");
- if (f4 & TR4_MUST2H) text_out("It must be wielded two-handed. ");
+ if (flags & TR_COULD2H) text_out("It can be wielded two-handed. ");
+ if (flags & TR_MUST2H) text_out("It must be wielded two-handed. ");
/* Mega-Hack -- describe activation */
- if (f3 & (TR3_ACTIVATE))
+ if (flags & TR_ACTIVATE)
{
text_out("It can be activated for ");
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))
- {
- text_out(item_activation(o_ptr, 0));
- text_out(" and ");
- text_out(item_activation(o_ptr, 1));
- }
- else
- text_out(item_activation(o_ptr, 0));
+ text_out(item_activation(o_ptr));
/* Mega-hack -- get rid of useless line for e.g. randarts */
- if (f5 & (TR5_ACTIVATE_NO_WIELD))
+ if (flags & TR_ACTIVATE_NO_WIELD)
text_out(". ");
else
text_out(" if it is being worn. ");
@@ -2960,23 +2552,25 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
text_out(" if it is being worn. ");
}
- /* Hack -- describe lites */
- if ((o_ptr->tval == TV_LITE) || (f3 & TR3_LITE1) || (f4 & TR4_LITE2) || (f4 & TR4_LITE3))
+ /* Describe light sources */
{
int radius = 0;
- if (f3 & TR3_LITE1) radius++;
- if (f4 & TR4_LITE2) radius += 2;
- if (f4 & TR4_LITE3) radius += 3;
+ if (flags & TR_LITE1) radius += 1;
+ if (flags & TR_LITE2) radius += 2;
+ if (flags & TR_LITE3) radius += 3;
if (radius > 5) radius = 5;
- if (f4 & TR4_FUEL_LITE)
+ if (radius > 0)
{
- text_out(format("It provides light (radius %d) when fueled. ", radius));
- }
- else
- {
- text_out(format("It provides light (radius %d) forever. ", radius));
+ if (flags & TR_FUEL_LITE)
+ {
+ text_out(format("It provides light (radius %d) when fueled. ", radius));
+ }
+ else
+ {
+ text_out(format("It provides light (radius %d). ", radius));
+ }
}
}
@@ -2986,12 +2580,12 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
text_out("It prevents the space-time continuum from being disrupted. ");
}
- if (f4 & TR4_ANTIMAGIC_50)
+ if (flags & TR_ANTIMAGIC_50)
{
text_out("It generates an antimagic field. ");
}
- if (f5 & TR5_SPELL_CONTAIN)
+ if (flags & TR_SPELL_CONTAIN)
{
if (o_ptr->pval2 == -1)
text_out("It can be used to store a spell. ");
@@ -3001,21 +2595,19 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
/* Pick up stat bonuses */
vn = 0;
- if (f1 & (TR1_STR)) vp[vn++] = "strength";
- if (f1 & (TR1_INT)) vp[vn++] = "intelligence";
- if (f1 & (TR1_WIS)) vp[vn++] = "wisdom";
- if (f1 & (TR1_DEX)) vp[vn++] = "dexterity";
- if (f1 & (TR1_CON)) vp[vn++] = "constitution";
- if (f1 & (TR1_CHR)) vp[vn++] = "charisma";
- if ((o_ptr->tval != TV_TRAPKIT) && (f1 & (TR1_STEALTH))) vp[vn++] = "stealth";
- if (f1 & (TR1_SEARCH)) vp[vn++] = "searching";
- if (f1 & (TR1_INFRA)) vp[vn++] = "infravision";
- if (f1 & (TR1_TUNNEL)) vp[vn++] = "ability to tunnel";
- if (f1 & (TR1_SPEED)) vp[vn++] = "speed";
- if (f1 & (TR1_BLOWS)) vp[vn++] = "attack speed";
- if (f5 & (TR5_CRIT)) vp[vn++] = "ability to score critical hits";
- if (f5 & (TR5_LUCK)) vp[vn++] = "luck";
- if (f1 & (TR1_SPELL)) vp[vn++] = "spell power";
+ if (flags & TR_STR) vp[vn++] = "strength";
+ if (flags & TR_INT) vp[vn++] = "intelligence";
+ if (flags & TR_WIS) vp[vn++] = "wisdom";
+ if (flags & TR_DEX) vp[vn++] = "dexterity";
+ if (flags & TR_CON) vp[vn++] = "constitution";
+ if (flags & TR_CHR) vp[vn++] = "charisma";
+ if (flags & TR_INFRA) vp[vn++] = "infravision";
+ if (flags & TR_TUNNEL) vp[vn++] = "ability to tunnel";
+ if (flags & TR_SPEED) vp[vn++] = "speed";
+ if (flags & TR_BLOWS) vp[vn++] = "attack speed";
+ if (flags & TR_CRIT) vp[vn++] = "ability to score critical hits";
+ if (flags & TR_LUCK) vp[vn++] = "luck";
+ if (flags & TR_SPELL) vp[vn++] = "spell power";
/* Describe */
if (vn)
@@ -3051,8 +2643,8 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
vn = 0;
- if (f1 & (TR1_MANA)) vp[vn++] = "mana capacity";
- if (f2 & (TR2_LIFE)) vp[vn++] = "hit points";
+ if (flags & TR_MANA) vp[vn++] = "mana capacity";
+ if (flags & TR_LIFE) vp[vn++] = "hit points";
/* Describe with percentuals */
if (vn)
@@ -3084,28 +2676,23 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
text_out(". ");
}
- if ((o_ptr->tval == TV_TRAPKIT) && (f1 & (TR1_STEALTH)))
- {
- text_out("It is well-hidden. ");
- }
-
vn = 0;
- if (f1 & (TR1_BRAND_ACID))
+ if (flags & TR_BRAND_ACID)
{
vc[vn] = TERM_GREEN;
vp[vn++] = "acid";
}
- if (f1 & (TR1_BRAND_ELEC))
+ if (flags & TR_BRAND_ELEC)
{
vc[vn] = TERM_L_BLUE;
vp[vn++] = "electricity";
}
- if (f1 & (TR1_BRAND_FIRE))
+ if (flags & TR_BRAND_FIRE)
{
vc[vn] = TERM_RED;
vp[vn++] = "fire";
}
- if (f1 & (TR1_BRAND_COLD))
+ if (flags & TR_BRAND_COLD)
{
vc[vn] = TERM_L_WHITE;
vp[vn++] = "frost";
@@ -3133,296 +2720,261 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
}
- if (f1 & (TR1_BRAND_POIS))
+ if (flags & TR_BRAND_POIS)
{
text_out("It ");
text_out_c(TERM_L_GREEN, "poisons your foes");
text_out(". ");
}
- if (f1 & (TR1_CHAOTIC))
+ if (flags & TR_CHAOTIC)
{
text_out("It produces chaotic effects. ");
}
- if (f1 & (TR1_VAMPIRIC))
+ if (flags & TR_VAMPIRIC)
{
text_out("It drains life from your foes. ");
}
- if (f1 & (TR1_IMPACT))
+ if (flags & TR_IMPACT)
{
text_out("It can cause earthquakes. ");
}
- if (f1 & (TR1_VORPAL))
+ if (flags & TR_VORPAL)
{
text_out("It is very sharp and can cut your foes. ");
}
- if (f5 & (TR5_WOUNDING))
+ if (flags & TR_WOUNDING)
{
text_out("It is very sharp and can make your foes bleed. ");
}
- if (f1 & (TR1_KILL_DRAGON))
+ if (flags & TR_KILL_DRAGON)
{
text_out("It is a great bane of dragons. ");
}
- else if (f1 & (TR1_SLAY_DRAGON))
+ else if (flags & TR_SLAY_DRAGON)
{
text_out("It is especially deadly against dragons. ");
}
- if (f1 & (TR1_SLAY_ORC))
+
+ if (flags & TR_SLAY_ORC)
{
text_out("It is especially deadly against orcs. ");
}
- if (f1 & (TR1_SLAY_TROLL))
+
+ if (flags & TR_SLAY_TROLL)
{
text_out("It is especially deadly against trolls. ");
}
- if (f1 & (TR1_SLAY_GIANT))
+
+ if (flags & TR_SLAY_GIANT)
{
text_out("It is especially deadly against giants. ");
}
- if (f5 & (TR5_KILL_DEMON))
+
+ if (flags & TR_KILL_DEMON)
{
text_out("It is a great bane of demons. ");
}
- else if (f1 & (TR1_SLAY_DEMON))
+ else if (flags & TR_SLAY_DEMON)
{
text_out("It strikes at demons with holy wrath. ");
}
- if (f5 & (TR5_KILL_UNDEAD))
+
+ if (flags & TR_KILL_UNDEAD)
{
text_out("It is a great bane of undead. ");
}
- else if (f1 & (TR1_SLAY_UNDEAD))
+ else if (flags & TR_SLAY_UNDEAD)
{
text_out("It strikes at undead with holy wrath. ");
}
- if (f1 & (TR1_SLAY_EVIL))
+
+ if (flags & TR_SLAY_EVIL)
{
text_out("It fights against evil with holy fury. ");
}
- if (f1 & (TR1_SLAY_ANIMAL))
+
+ if (flags & TR_SLAY_ANIMAL)
{
text_out("It is especially deadly against natural creatures. ");
}
- if (f2 & (TR2_INVIS))
+ if (flags & TR_INVIS)
{
text_out("It makes you invisible. ");
}
- if (o_ptr->tval != TV_TRAPKIT)
+ vn = 0;
+ if (flags & TR_SUST_STR)
{
- vn = 0;
- if (f2 & (TR2_SUST_STR))
- {
- vp[vn++] = "strength";
- }
- if (f2 & (TR2_SUST_INT))
- {
- vp[vn++] = "intelligence";
- }
- if (f2 & (TR2_SUST_WIS))
- {
- vp[vn++] = "wisdom";
- }
- if (f2 & (TR2_SUST_DEX))
- {
- vp[vn++] = "dexterity";
- }
- if (f2 & (TR2_SUST_CON))
- {
- vp[vn++] = "constitution";
- }
- if (f2 & (TR2_SUST_CHR))
- {
- vp[vn++] = "charisma";
- }
- /* Describe */
- if (vn)
- {
- int i;
-
- /* Intro */
- text_out("It sustains ");
-
- /* List */
- for (i = 0; i < vn; i++)
- {
- /* Connectives */
- if (i == 0) text_out("your ");
- else if (i < (vn - 1)) text_out(", ");
- else text_out(" and ");
+ vp[vn++] = "strength";
+ }
+ if (flags & TR_SUST_INT)
+ {
+ vp[vn++] = "intelligence";
+ }
+ if (flags & TR_SUST_WIS)
+ {
+ vp[vn++] = "wisdom";
+ }
+ if (flags & TR_SUST_DEX)
+ {
+ vp[vn++] = "dexterity";
+ }
+ if (flags & TR_SUST_CON)
+ {
+ vp[vn++] = "constitution";
+ }
+ if (flags & TR_SUST_CHR)
+ {
+ vp[vn++] = "charisma";
+ }
+ /* Describe */
+ if (vn)
+ {
+ int i;
- /* Dump the stat */
- text_out(vp[i]);
- }
- text_out(". ");
- }
+ /* Intro */
+ text_out("It sustains ");
- vn = 0;
- if (f2 & (TR2_IM_ACID))
- {
- vc[vn] = TERM_GREEN;
- vp[vn++] = "acid";
- }
- if (f2 & (TR2_IM_ELEC))
- {
- vc[vn] = TERM_L_BLUE;
- vp[vn++] = "electricity";
- }
- if (f2 & (TR2_IM_FIRE))
- {
- vc[vn] = TERM_RED;
- vp[vn++] = "fire";
- }
- if (f2 & (TR2_IM_COLD))
- {
- vc[vn] = TERM_L_WHITE;
- vp[vn++] = "cold";
- }
- if (f4 & (TR4_IM_NETHER))
- {
- vc[vn] = TERM_L_GREEN;
- vp[vn++] = "nether";
- }
- /* Describe */
- if (vn)
+ /* List */
+ for (i = 0; i < vn; i++)
{
- int i;
-
- /* Intro */
- text_out("It provides immunity ");
-
- /* List */
- for (i = 0; i < vn; i++)
- {
- /* Connectives */
- if (i == 0) text_out("to ");
- else if (i < (vn - 1)) text_out(", ");
- else text_out(" and ");
+ /* Connectives */
+ if (i == 0) text_out("your ");
+ else if (i < (vn - 1)) text_out(", ");
+ else text_out(" and ");
- /* Dump the stat */
- text_out_c(vc[i], vp[i]);
- }
- text_out(". ");
+ /* Dump the stat */
+ text_out(vp[i]);
}
+ text_out(". ");
}
- else
+
+ vn = 0;
+ if (flags & TR_IM_ACID)
{
- if (f2 & (TRAP2_AUTOMATIC_5))
- {
- text_out("It can rearm itself. ");
- }
- if (f2 & (TRAP2_AUTOMATIC_99))
- {
- text_out("It rearms itself. ");
- }
- if (f2 & (TRAP2_KILL_GHOST))
- {
- text_out("It is effective against Ghosts. ");
- }
- if (f2 & (TRAP2_TELEPORT_TO))
- {
- text_out("It can teleport monsters to you. ");
- }
- if (f2 & (TRAP2_ONLY_DRAGON))
- {
- text_out("It can only be set off by dragons. ");
- }
- if (f2 & (TRAP2_ONLY_DEMON))
- {
- text_out("It can only be set off by demons. ");
- }
- if (f2 & (TRAP2_ONLY_UNDEAD))
- {
- text_out("It can only be set off by undead. ");
- }
- if (f2 & (TRAP2_ONLY_ANIMAL))
- {
- text_out("It can only be set off by animals. ");
- }
- if (f2 & (TRAP2_ONLY_EVIL))
+ vc[vn] = TERM_GREEN;
+ vp[vn++] = "acid";
+ }
+ if (flags & TR_IM_ELEC)
+ {
+ vc[vn] = TERM_L_BLUE;
+ vp[vn++] = "electricity";
+ }
+ if (flags & TR_IM_FIRE)
+ {
+ vc[vn] = TERM_RED;
+ vp[vn++] = "fire";
+ }
+ if (flags & TR_IM_COLD)
+ {
+ vc[vn] = TERM_L_WHITE;
+ vp[vn++] = "cold";
+ }
+ if (flags & TR_IM_NETHER)
+ {
+ vc[vn] = TERM_L_GREEN;
+ vp[vn++] = "nether";
+ }
+ /* Describe */
+ if (vn)
+ {
+ int i;
+
+ /* Intro */
+ text_out("It provides immunity ");
+
+ /* List */
+ for (i = 0; i < vn; i++)
{
- text_out("It can only be set off by evil creatures. ");
+ /* Connectives */
+ if (i == 0) text_out("to ");
+ else if (i < (vn - 1)) text_out(", ");
+ else text_out(" and ");
+
+ /* Dump the stat */
+ text_out_c(vc[i], vp[i]);
}
+ text_out(". ");
}
- if (f2 & (TR2_FREE_ACT))
+ if (flags & TR_FREE_ACT)
{
text_out("It provides immunity to paralysis. ");
}
- if (f2 & (TR2_RES_FEAR))
+ if (flags & TR_RES_FEAR)
{
text_out("It makes you completely fearless. ");
}
vn = 0;
- if (f2 & (TR2_HOLD_LIFE))
+ if (flags & TR_HOLD_LIFE)
{
vp[vn++] = "life draining";
}
- if ((f2 & (TR2_RES_ACID)) && !(f2 & (TR2_IM_ACID)))
+ if ((flags & TR_RES_ACID) && !(flags & TR_IM_ACID))
{
vp[vn++] = "acid";
}
- if ((f2 & (TR2_RES_ELEC)) && !(f2 & (TR2_IM_ELEC)))
+ if ((flags & TR_RES_ELEC) && !(flags & TR_IM_ELEC))
{
vp[vn++] = "electricity";
}
- if ((f2 & (TR2_RES_FIRE)) && !(f2 & (TR2_IM_FIRE)))
+ if ((flags & TR_RES_FIRE) && !(flags & TR_IM_FIRE))
{
vp[vn++] = "fire";
}
- if ((f2 & (TR2_RES_COLD)) && !(f2 & (TR2_IM_COLD)))
+ if ((flags & TR_RES_COLD) && !(flags & TR_IM_COLD))
{
vp[vn++] = "cold";
}
- if (f2 & (TR2_RES_POIS))
+ if (flags & TR_RES_POIS)
{
vp[vn++] = "poison";
}
- if (f2 & (TR2_RES_LITE))
+ if (flags & TR_RES_LITE)
{
vp[vn++] = "light";
}
- if (f2 & (TR2_RES_DARK))
+ if (flags & TR_RES_DARK)
{
vp[vn++] = "dark";
}
- if (f2 & (TR2_RES_BLIND))
+ if (flags & TR_RES_BLIND)
{
vp[vn++] = "blindness";
}
- if (f2 & (TR2_RES_CONF))
+ if (flags & TR_RES_CONF)
{
vp[vn++] = "confusion";
}
- if (f2 & (TR2_RES_SOUND))
+ if (flags & TR_RES_SOUND)
{
vp[vn++] = "sound";
}
- if (f2 & (TR2_RES_SHARDS))
+ if (flags & TR_RES_SHARDS)
{
vp[vn++] = "shards";
}
- if ((f2 & (TR2_RES_NETHER)) && !(f4 & (TR4_IM_NETHER)))
+ if ((flags & TR_RES_NETHER) && !(flags & TR_IM_NETHER))
{
vp[vn++] = "nether";
}
- if (f2 & (TR2_RES_NEXUS))
+ if (flags & TR_RES_NEXUS)
{
vp[vn++] = "nexus";
}
- if (f2 & (TR2_RES_CHAOS))
+ if (flags & TR_RES_CHAOS)
{
vp[vn++] = "chaos";
}
- if (f2 & (TR2_RES_DISEN))
+ if (flags & TR_RES_DISEN)
{
vp[vn++] = "disenchantment";
}
@@ -3448,61 +3000,65 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
text_out(". ");
}
- if (f2 & (TR2_SENS_FIRE))
+ if (flags & TR_SENS_FIRE)
{
text_out("It renders you especially vulnerable to fire. ");
}
- if (f3 & (TR3_WRAITH))
+ if (flags & TR_WRAITH)
{
text_out("It renders you incorporeal. ");
}
- if (f5 & (TR5_WATER_BREATH))
+ if (flags & TR_WATER_BREATH)
{
text_out("It allows you to breathe underwater. ");
}
- if (f5 & (TR5_MAGIC_BREATH))
+ if (flags & TR_MAGIC_BREATH)
{
text_out("It allows you to breathe without air. ");
}
- if (f3 & (TR3_FEATHER))
+ if (flags & TR_FEATHER)
{
text_out("It allows you to levitate. ");
}
- if (f4 & (TR4_FLY))
+ if (flags & TR_FLY)
{
text_out("It allows you to fly. ");
}
- if (f4 & (TR4_CLIMB))
+ if (flags & TR_CLIMB)
{
text_out("It allows you to climb mountains. ");
}
- if (f5 & (TR5_IMMOVABLE))
+ if (flags & TR_IMMOVABLE)
{
text_out("It renders you immovable. ");
}
- if (f3 & (TR3_SEE_INVIS))
+ if (flags & TR_SEE_INVIS)
{
text_out("It allows you to see invisible monsters. ");
}
- if (esp)
+
+ // ESP_*
{
- if (esp & ESP_ALL) text_out("It gives telepathic powers. ");
+ if (flags & ESP_ALL)
+ {
+ text_out("It gives telepathic powers. ");
+ }
else
{
vn = 0;
- if (esp & ESP_ORC) vp[vn++] = "orcs";
- if (esp & ESP_TROLL) vp[vn++] = "trolls";
- if (esp & ESP_DRAGON) vp[vn++] = "dragons";
- if (esp & ESP_SPIDER) vp[vn++] = "spiders";
- if (esp & ESP_GIANT) vp[vn++] = "giants";
- if (esp & ESP_DEMON) vp[vn++] = "demons";
- if (esp & ESP_UNDEAD) vp[vn++] = "undead";
- if (esp & ESP_EVIL) vp[vn++] = "evil beings";
- if (esp & ESP_ANIMAL) vp[vn++] = "animals";
- if (esp & ESP_THUNDERLORD) vp[vn++] = "thunderlords";
- if (esp & ESP_GOOD) vp[vn++] = "good beings";
- if (esp & ESP_NONLIVING) vp[vn++] = "non-living things";
- if (esp & ESP_UNIQUE) vp[vn++] = "unique beings";
+ if (flags & ESP_ORC) vp[vn++] = "orcs";
+ if (flags & ESP_TROLL) vp[vn++] = "trolls";
+ if (flags & ESP_DRAGON) vp[vn++] = "dragons";
+ if (flags & ESP_SPIDER) vp[vn++] = "spiders";
+ if (flags & ESP_GIANT) vp[vn++] = "giants";
+ if (flags & ESP_DEMON) vp[vn++] = "demons";
+ if (flags & ESP_UNDEAD) vp[vn++] = "undead";
+ if (flags & ESP_EVIL) vp[vn++] = "evil beings";
+ if (flags & ESP_ANIMAL) vp[vn++] = "animals";
+ if (flags & ESP_THUNDERLORD) vp[vn++] = "thunderlords";
+ if (flags & ESP_GOOD) vp[vn++] = "good beings";
+ if (flags & ESP_NONLIVING) vp[vn++] = "non-living things";
+ if (flags & ESP_UNIQUE) vp[vn++] = "unique beings";
/* Describe */
if (vn)
{
@@ -3527,55 +3083,55 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
}
}
- if (f3 & (TR3_SLOW_DIGEST))
+ if (flags & TR_SLOW_DIGEST)
{
text_out("It slows your metabolism. ");
}
- if (f3 & (TR3_REGEN))
+ if (flags & TR_REGEN)
{
text_out("It speeds your regenerative powers. ");
}
- if (f2 & (TR2_REFLECT))
+ if (flags & TR_REFLECT)
{
text_out("It reflects bolts and arrows. ");
}
- if (f3 & (TR3_SH_FIRE))
+ if (flags & TR_SH_FIRE)
{
text_out("It produces a fiery sheath. ");
}
- if (f3 & (TR3_SH_ELEC))
+ if (flags & TR_SH_ELEC)
{
text_out("It produces an electric sheath. ");
}
- if (f3 & (TR3_NO_MAGIC))
+ if (flags & TR_NO_MAGIC)
{
text_out("It produces an anti-magic shell. ");
}
- if (f3 & (TR3_NO_TELE))
+ if (flags & TR_NO_TELE)
{
text_out("It prevents teleportation. ");
}
- if (f3 & (TR3_XTRA_MIGHT))
+ if (flags & TR_XTRA_MIGHT)
{
text_out("It fires missiles with extra might. ");
}
- if (f3 & (TR3_XTRA_SHOTS))
+ if (flags & TR_XTRA_SHOTS)
{
text_out("It fires missiles excessively fast. ");
}
vn = 0;
- if (f5 & (TR5_DRAIN_MANA))
+ if (flags & TR_DRAIN_MANA)
{
vc[vn] = TERM_BLUE;
vp[vn++] = "mana";
}
- if (f5 & (TR5_DRAIN_HP))
+ if (flags & TR_DRAIN_HP)
{
vc[vn] = TERM_RED;
vp[vn++] = "life";
}
- if (f3 & (TR3_DRAIN_EXP))
+ if (flags & TR_DRAIN_EXP)
{
vc[vn] = TERM_L_DARK;
vp[vn++] = "experience";
@@ -3602,38 +3158,38 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
text_out(". ");
}
- if (f3 & (TR3_BLESSED))
+ if (flags & TR_BLESSED)
{
text_out("It has been blessed by the gods. ");
}
- if (f4 & (TR4_AUTO_ID))
+ if (flags & TR_AUTO_ID)
{
text_out("It identifies all items for you. ");
}
- if (f3 & (TR3_TELEPORT))
+ if (flags & TR_TELEPORT)
{
text_out("It induces random teleportation. ");
}
- if (f3 & (TR3_AGGRAVATE))
+ if (flags & TR_AGGRAVATE)
{
text_out("It aggravates nearby creatures. ");
}
- if (f4 & (TR4_NEVER_BLOW))
+ if (flags & TR_NEVER_BLOW)
{
text_out("It can't attack. ");
}
- if (f4 & (TR4_BLACK_BREATH))
+ if (flags & TR_BLACK_BREATH)
{
text_out("It fills you with the Black Breath. ");
}
if (cursed_p(o_ptr))
{
- if (f3 & (TR3_PERMA_CURSE))
+ if (flags & TR_PERMA_CURSE)
{
text_out("It is permanently cursed. ");
}
- else if (f3 & (TR3_HEAVY_CURSE))
+ else if (flags & TR_HEAVY_CURSE)
{
text_out("It is heavily cursed. ");
}
@@ -3642,68 +3198,68 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
text_out("It is cursed. ");
}
}
- if (f3 & (TR3_TY_CURSE))
+ if (flags & TR_TY_CURSE)
{
text_out("It carries an ancient foul curse. ");
}
- if (f4 & (TR4_DG_CURSE))
+ if (flags & TR_DG_CURSE)
{
text_out("It carries an ancient Morgothian curse. ");
}
- if (f4 & (TR4_CLONE))
+ if (flags & TR_CLONE)
{
text_out("It can clone monsters. ");
}
- if (f4 & (TR4_CURSE_NO_DROP))
+ if (flags & TR_CURSE_NO_DROP)
{
text_out("It cannot be dropped while cursed. ");
}
- if (f3 & (TR3_AUTO_CURSE))
+ if (flags & TR_AUTO_CURSE)
{
text_out("It can re-curse itself. ");
}
- if (f4 & (TR4_CAPACITY))
+ if (flags & TR_CAPACITY)
{
text_out("It can hold more mana. ");
}
- if (f4 & (TR4_CHEAPNESS))
+ if (flags & TR_CHEAPNESS)
{
text_out("It can cast spells for a lesser mana cost. ");
}
- if (f4 & (TR4_FAST_CAST))
+ if (flags & TR_FAST_CAST)
{
text_out("It can cast spells faster. ");
}
- if (f4 & (TR4_CHARGING))
+ if (flags & TR_CHARGING)
{
text_out("It regenerates its mana faster. ");
}
- if (f5 & (TR5_RES_MORGUL))
+ if (flags & TR_RES_MORGUL)
{
text_out("It can resist being shattered by morgul beings. ");
}
- if ((f3 & (TR3_IGNORE_ACID)) && (f3 & (TR3_IGNORE_FIRE)) && (f3 & (TR3_IGNORE_COLD)) && (f3 & (TR3_IGNORE_ELEC)))
+ if ((flags & TR_IGNORE_ACID) && (flags & TR_IGNORE_FIRE) && (flags & TR_IGNORE_COLD) && (flags & TR_IGNORE_ELEC))
{
text_out("It cannot be harmed by acid, cold, lightning or fire. ");
}
else
{
- if (f3 & (TR3_IGNORE_ACID))
+ if (flags & TR_IGNORE_ACID)
{
text_out("It cannot be harmed by acid. ");
}
- if (f3 & (TR3_IGNORE_ELEC))
+ if (flags & TR_IGNORE_ELEC)
{
text_out("It cannot be harmed by electricity. ");
}
- if (f3 & (TR3_IGNORE_FIRE))
+ if (flags & TR_IGNORE_FIRE)
{
text_out("It cannot be harmed by fire. ");
}
- if (f3 & (TR3_IGNORE_COLD))
+ if (flags & TR_IGNORE_COLD)
{
text_out("It cannot be harmed by cold. ");
}
@@ -3767,7 +3323,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
/* Copying how others seem to do it. -- neil */
if (o_ptr->tval == TV_RING || o_ptr->tval == TV_AMULET ||
- !trim_down || (ego_item_p(o_ptr)) || (artifact_p(o_ptr)))
+ !trim_down || ego_item_p(o_ptr) || artifact_p(o_ptr))
{
/* Where did we found it ? */
if (o_ptr->found == OBJ_FOUND_MONSTER)
@@ -3803,12 +3359,12 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait
else if (o_ptr->found == OBJ_FOUND_STORE)
{
text_out(format("\nYou bought it from the %s.",
- st_info[o_ptr->found_aux1].name));
+ st_info[o_ptr->found_aux1].name.c_str()));
}
else if (o_ptr->found == OBJ_FOUND_STOLEN)
{
text_out(format("\nYou stole it from the %s.",
- st_info[o_ptr->found_aux1].name));
+ st_info[o_ptr->found_aux1].name.c_str()));
}
else if (o_ptr->found == OBJ_FOUND_SELFMADE)
{
@@ -3943,24 +3499,6 @@ static int get_slot(int slot)
*/
s16b wield_slot_ideal(object_type const *o_ptr, bool_ ideal)
{
- /* Theme has restrictions for winged races. */
- if (game_module_idx == MODULE_THEME)
- {
- cptr race_name = rp_ptr->title;
-
- if (streq(race_name, "Dragon") ||
- streq(race_name, "Eagle"))
- {
- switch (o_ptr->tval)
- {
- case TV_CLOAK:
- case TV_HARD_ARMOR:
- case TV_DRAG_ARMOR:
- return -1;
- }
- }
- }
-
/* Slot for equipment */
switch (o_ptr->tval)
{
@@ -4365,15 +3903,15 @@ static bool item_tester_okay(object_type const *o_ptr, object_filter_t const &fi
-static void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filter);
-static void show_inven_aux(bool_ mirror, bool_ everything, object_filter_t const &filter);
+static void show_equip_aux(bool_ mirror, object_filter_t const &filter);
+static void show_inven_aux(bool_ mirror, object_filter_t const &filter);
/*
* Choice window "shadow" of the "show_inven()" function
*/
-void display_inven(void)
+void display_inven()
{
- show_inven_aux(TRUE, inventory_no_move, object_filter::True());
+ show_inven_aux(TRUE, object_filter::True());
}
@@ -4381,16 +3919,18 @@ void display_inven(void)
/*
* Choice window "shadow" of the "show_equip()" function
*/
-void display_equip(void)
+void display_equip()
{
- show_equip_aux(TRUE, inventory_no_move, object_filter::True());
+ show_equip_aux(TRUE, object_filter::True());
}
/* Get the color of the letter idx */
-byte get_item_letter_color(object_type *o_ptr)
+byte get_item_letter_color(object_type const *o_ptr)
{
+ auto const &a_info = game->edit_data.a_info;
+
byte color = TERM_WHITE;
/* Must have knowlegde */
@@ -4399,7 +3939,7 @@ byte get_item_letter_color(object_type *o_ptr)
if (ego_item_p(o_ptr)) color = TERM_L_BLUE;
if (artifact_p(o_ptr)) color = TERM_YELLOW;
if (o_ptr->name1 && ( -1 != a_info[o_ptr->name1].set)) color = TERM_GREEN;
- if (o_ptr->name1 && (a_info[o_ptr->name1].flags4 & TR4_ULTIMATE) && (o_ptr->ident & (IDENT_MENTAL))) color = TERM_VIOLET;
+ if (o_ptr->name1 && (a_info[o_ptr->name1].flags & TR_ULTIMATE) && (o_ptr->ident & (IDENT_MENTAL))) color = TERM_VIOLET;
return (color);
}
@@ -4410,7 +3950,7 @@ byte get_item_letter_color(object_type *o_ptr)
*
* Hack -- do not display "trailing" empty slots
*/
-void show_inven_aux(bool_ mirror, bool_ everything, const object_filter_t &filter)
+void show_inven_aux(bool_ mirror, const object_filter_t &filter)
{
int i, j, k, l, z = 0;
int row, col, len, lim;
@@ -4464,16 +4004,13 @@ void show_inven_aux(bool_ mirror, bool_ everything, const object_filter_t &filte
/* Is this item acceptable? */
if (!item_tester_okay(o_ptr, filter))
{
- if ( !everything )
- continue;
- out_index[k] = -i - 1;
- }
- else
- {
- /* Save the object index */
- out_index[k] = i + 1;
+ /* Skip to next slot */
+ continue;
}
+ /* Save the object index */
+ out_index[k] = i + 1;
+
/* Describe the object */
object_desc(o_name, o_ptr, TRUE, 3);
@@ -4482,7 +4019,7 @@ void show_inven_aux(bool_ mirror, bool_ everything, const object_filter_t &filte
/* Save the object color, and description */
out_color[k] = tval_to_attr[o_ptr->tval % 128];
- (void)strcpy(out_desc[k], o_name);
+ strcpy(out_desc[k], o_name);
/* Find the predicted "line length" */
l = strlen(out_desc[k]) + 5;
@@ -4572,7 +4109,7 @@ void show_inven_aux(bool_ mirror, bool_ everything, const object_filter_t &filte
static void show_inven(object_filter_t const &filter)
{
- show_inven_aux(FALSE, FALSE, filter);
+ show_inven_aux(FALSE, filter);
}
void show_inven_full()
@@ -4584,7 +4121,7 @@ void show_inven_full()
static void show_equip(object_filter_t const &filter)
{
- show_equip_aux(FALSE, FALSE, filter);
+ show_equip_aux(FALSE, filter);
}
void show_equip_full()
@@ -4597,7 +4134,7 @@ void show_equip_full()
/*
* Display the equipment.
*/
-void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filter)
+void show_equip_aux(bool_ mirror, object_filter_t const &filter)
{
int i, j, k, l;
int row, col, len, lim, idx;
@@ -4652,7 +4189,6 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte
!o_ptr->k_idx &&
p_ptr->inventory[i - INVEN_ARM + INVEN_WIELD].k_idx)
{
- u32b f1, f2, f3, f4, f5, esp;
object_type *q_ptr = &p_ptr->inventory[i - INVEN_ARM + INVEN_WIELD];
char q_name[80];
@@ -4660,9 +4196,9 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte
object_desc(q_name, q_ptr, TRUE, 3);
/* Get weapon flags */
- object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(q_ptr);
- if (f4 & TR4_MUST2H)
+ if (flags & TR_MUST2H)
{
sprintf(o_name, "(two handed) %s", q_name);
@@ -4676,7 +4212,7 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte
/* Save the color */
out_color[k] = TERM_L_RED;
- (void)strcpy(out_desc[k], o_name);
+ strcpy(out_desc[k], o_name);
continue;
}
}
@@ -4696,7 +4232,7 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte
/* Save the color */
out_color[k] = TERM_L_BLUE;
- (void)strcpy(out_desc[k], o_name);
+ strcpy(out_desc[k], o_name);
}
else
{
@@ -4707,22 +4243,21 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte
/* Truncate the description */
o_name[lim] = 0;
+
/* Is this item acceptable? */
if (!item_tester_okay(o_ptr, filter))
{
- if (!everything) continue;
- out_index[k] = -1;
- }
- else
- {
- /* Save the index */
- out_index[k] = idx;
+ /* Skip to next slot */
+ continue;
}
+
+ /* Save the index */
+ out_index[k] = idx;
out_rindex[k] = i;
/* Save the color */
out_color[k] = tval_to_attr[o_ptr->tval % 128];
- (void)strcpy(out_desc[k], o_name);
+ strcpy(out_desc[k], o_name);
}
/* Extract the maximal length (see below) */
@@ -4784,7 +4319,7 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte
/* Use labels */
{
/* Mention the use */
- (void)sprintf(tmp_val, "%-14s: ", mention_use(out_rindex[j]));
+ sprintf(tmp_val, "%-14s: ", mention_use(out_rindex[j]));
put_str(tmp_val, row + j, col + 5);
/* Display the entry itself */
@@ -4827,12 +4362,12 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte
/*
* Flip "inven" and "equip" in any sub-windows
*/
-void toggle_inven_equip(void)
+void toggle_inven_equip()
{
int j;
/* Scan windows */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
/* Unused */
if (!angband_term[j]) continue;
@@ -4883,7 +4418,7 @@ bool_ verify(cptr prompt, int item)
object_desc(o_name, o_ptr, TRUE, 3);
/* Prompt */
- (void)sprintf(out_val, "%s %s? ", prompt, o_name);
+ sprintf(out_val, "%s %s? ", prompt, o_name);
/* Query */
return (get_check(out_val));
@@ -4897,18 +4432,17 @@ bool_ verify(cptr prompt, int item)
*/
static bool_ get_item_allow(int item)
{
- cptr s;
-
- object_type *o_ptr;
-
/* Get object */
- o_ptr = get_object(item);
+ auto o_ptr = get_object(item);
/* No inscription */
- if (!o_ptr->note) return (TRUE);
+ if (o_ptr->inscription.empty())
+ {
+ return TRUE;
+ }
/* Find a '!' */
- s = strchr(quark_str(o_ptr->note), '!');
+ auto s = strchr(o_ptr->inscription.c_str(), '!');
/* Process preventions */
while (s)
@@ -4958,23 +4492,25 @@ static bool get_item_okay(int i, object_filter_t const &filter)
*/
static int get_tag(int *cp, char tag)
{
- int i;
- cptr s;
-
-
/* Check every object */
- for (i = 0; i < INVEN_TOTAL; ++i)
+ for (int i = 0; i < INVEN_TOTAL; ++i)
{
object_type *o_ptr = &p_ptr->inventory[i];
/* Skip non-objects */
- if (!o_ptr->k_idx) continue;
+ if (!o_ptr->k_idx)
+ {
+ continue;
+ }
/* Skip empty inscriptions */
- if (!o_ptr->note) continue;
+ if (o_ptr->inscription.empty())
+ {
+ continue;
+ }
/* Find a '@' */
- s = strchr(quark_str(o_ptr->note), '@');
+ auto s = strchr(o_ptr->inscription.c_str(), '@');
/* Process all tags */
while (s)
@@ -5319,7 +4855,7 @@ static bool_ get_item_floor(int *cp, cptr pmt, cptr str, int mode, object_filter
int ne = 0;
/* Scan windows */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
/* Unused */
if (!angband_term[j]) continue;
@@ -6109,7 +5645,7 @@ static void absorb_gold(cave_type const *c_ptr)
object_type *o_ptr = &o_list[this_o_idx];
/* Hack -- disturb */
- disturb(0);
+ disturb();
/* Pick up gold */
if (o_ptr->tval == TV_GOLD)
@@ -6173,12 +5709,6 @@ void py_pickup_floor(int pickup)
/* Get the tile */
auto c_ptr = &cave[p_ptr->py][p_ptr->px];
- /* Hack -- ignore monster traps */
- if (c_ptr->feat == FEAT_MON_TRAP)
- {
- return;
- }
-
/* Try to grab ammo */
pickup_ammo();
@@ -6218,7 +5748,7 @@ void py_pickup_floor(int pickup)
bool_ do_pickup = TRUE;
/* Hack -- query every item */
- if (carry_query_flag || (!can_carry_heavy(&o_list[floor_o_idx])))
+ if (options->carry_query_flag || !can_carry_heavy(&o_list[floor_o_idx]))
{
char o_name[80] = "";
object_desc(o_name, o_ptr, TRUE, 3);
@@ -6292,13 +5822,13 @@ static void gain_flag_group(object_type *o_ptr)
while (tries--)
{
- grp = rand_int(MAX_FLAG_GROUP);
+ grp = rand_int(flags_groups().size());
/* If we already got this group continue */
if (o_ptr->pval3 & BIT(grp)) continue;
/* Not enough points ? */
- if (flags_groups[grp].price > o_ptr->pval2) continue;
+ if (flags_groups()[grp].price > o_ptr->pval2) continue;
/* Ok, enough points and not already got it */
break;
@@ -6307,7 +5837,7 @@ static void gain_flag_group(object_type *o_ptr)
/* Ack, nothing found */
if (tries <= 1) return;
- o_ptr->pval2 -= flags_groups[grp].price;
+ o_ptr->pval2 -= flags_groups()[grp].price;
o_ptr->pval3 |= BIT(grp);
/* Message */
@@ -6315,124 +5845,83 @@ static void gain_flag_group(object_type *o_ptr)
char o_name[80];
object_desc(o_name, o_ptr, FALSE, 0);
- msg_format("%s gains access to the %s realm.", o_name, flags_groups[grp].name);
+ msg_format("%s gains access to the %s realm.", o_name, flags_groups()[grp].name);
}
}
-static u32b get_flag(object_type *o_ptr, int grp, int k)
+static object_flag_set get_flag(object_type *o_ptr, int grp)
{
- u32b f = 0, flag_set = 0;
int tries = 1000;
- u32b f1, f2, f3, f4, f5, esp, flag_test;
-
- /* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
/* get the corresponding flag set of the group */
- switch (k)
- {
- case 0:
- flag_set = flags_groups[grp].flags1;
- flag_test = f1;
- break;
- case 1:
- flag_set = flags_groups[grp].flags2;
- flag_test = f2;
- break;
- case 2:
- flag_set = flags_groups[grp].flags3;
- flag_test = f3;
- break;
- case 3:
- flag_set = flags_groups[grp].flags4;
- flag_test = f4;
- break;
- case 4:
- flag_set = flags_groups[grp].esp;
- flag_test = esp;
- break;
- default:
- flag_set = flags_groups[grp].flags1;
- flag_test = f1;
- break;
- }
+ auto const flag_set = flags_groups()[grp].flags;
+ auto const flag_test = object_flags(o_ptr);
/* If no flags, no need to look */
- if (!count_bits(flag_set)) return 0;
+ if (flag_set.empty())
+ {
+ return object_flag_set();
+ }
while (tries--)
{
- /* get a random flag */
- f = BIT(rand_int(32));
+ // Choose a random flag
+ auto const f = object_flag_set::make_bit(rand_int(object_flag_set::nbits));
- /* is it part of the group */
- if (!(f & flag_set)) continue;
+ // Ignore if not part of the group
+ if (!(f & flag_set))
+ {
+ continue;
+ }
- /* Already got it */
- if (f & flag_test) continue;
+ // Ignore if already present
+ if (f & flag_test)
+ {
+ continue;
+ }
- /* Ok one */
- break;
+ // Got a match!
+ return f;
}
- if (tries <= 1) return (0);
- else return (f);
+ // Exhausted the number of tries
+ return object_flag_set();
}
/* Add a flags from a flag group */
static void gain_flag_group_flag(object_type *o_ptr)
{
- int grp = 0, k = 0;
- u32b f = 0;
- int tries = 20000;
-
- if (!count_bits(o_ptr->pval3)) return;
-
- while (tries--)
+ // Try a "few" times to see if we can't find a flag.
+ for (int tries = 20000; tries > 0; tries--)
{
- /* Get a flag set */
- k = rand_int(5);
+ // Choose a random flag group
+ auto grp = rand_int(flags_groups().size());
- /* get a flag group */
- grp = rand_int(MAX_FLAG_GROUP);
-
- if (!(BIT(grp) & o_ptr->pval3)) continue;
-
- /* Return a flag from the group/set */
- f = get_flag(o_ptr, grp, k);
-
- if (!f) continue;
+ // If that group isn't available to the object, then choose a new one.
+ if (!(BIT(grp) & o_ptr->pval3))
+ {
+ continue;
+ }
- break;
- }
+ // Get an as-yet unused flag from the group, if possible.
+ auto const f = get_flag(o_ptr, grp);
- if (tries <= 1) return;
+ // If we couldn't find a flag, then we try again.
+ if (f.empty())
+ {
+ continue;
+ }
- switch (k)
- {
- case 0:
- o_ptr->art_flags1 |= f;
- break;
- case 1:
- o_ptr->art_flags2 |= f;
- break;
- case 2:
- o_ptr->art_flags3 |= f;
- break;
- case 3:
- o_ptr->art_flags4 |= f;
- break;
- case 4:
- o_ptr->art_esp |= f;
- break;
- }
+ // Got a flag; mix it into the object.
+ o_ptr->art_flags |= f;
- /* Message */
- {
+ // Describe what happened
char o_name[80];
-
object_desc(o_name, o_ptr, FALSE, 0);
- msg_format("%s gains a new power from the %s realm.", o_name, flags_groups[grp].name);
+ msg_format("%s gains a new power from the %s realm.", o_name, flags_groups()[grp].name);
+
+ // We're done.
+ return;
}
}
@@ -6441,11 +5930,6 @@ static void gain_flag_group_flag(object_type *o_ptr)
*/
void object_gain_level(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
- /* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
/* First it can gain some tohit and todam */
if ((o_ptr->tval == TV_AXE) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) ||
(o_ptr->tval == TV_HAFTED) || (o_ptr->tval == TV_MSTAFF))
@@ -6468,16 +5952,31 @@ void object_gain_level(object_type *o_ptr)
}
else
{
- if (!o_ptr->pval3) gain_flag_group(o_ptr);
+ // Gain a group if none are available.
+ if (!o_ptr->pval3)
+ {
+ gain_flag_group(o_ptr);
+ }
+ // Gain a flag
gain_flag_group_flag(o_ptr);
- if (!o_ptr->pval) o_ptr->pval = 1;
+ // Increase/grant PVAL
+ if (!o_ptr->pval)
+ {
+ o_ptr->pval = 1;
+ }
else
{
- while (magik(20 - (o_ptr->pval * 2))) o_ptr->pval++;
+ while (magik(20 - (o_ptr->pval * 2)))
+ {
+ o_ptr->pval++;
+ }
- if (o_ptr->pval > 5) o_ptr->pval = 5;
+ if (o_ptr->pval > 5)
+ {
+ o_ptr->pval = 5;
+ }
}
}
}
@@ -6489,12 +5988,22 @@ void object_gain_level(object_type *o_ptr)
*/
bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent)
{
- set_type *s_ptr = &set_info[set_idx];
- int i;
+ auto &set_info = game->edit_data.set_info;
+ auto const &a_info = game->edit_data.a_info;
if ( -1 == a_info[a_idx].set) return (FALSE);
+
+ auto s_ptr = &set_info[set_idx];
+
+ int i;
for (i = 0; i < s_ptr->num; i++)
- if (a_idx == s_ptr->arts[i].a_idx) break;
+ {
+ if (a_idx == s_ptr->arts[i].a_idx)
+ {
+ break;
+ }
+ }
+
if (!s_ptr->arts[i].present)
{
s_ptr->num_use++;
@@ -6505,21 +6014,31 @@ bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent)
}
else if ((s_ptr->num_use == s_ptr->num) && (!silent))
{
- cmsg_format(TERM_GREEN, "%s item set completed.", s_ptr->name);
+ cmsg_format(TERM_GREEN, "%s item set completed.", s_ptr->name.c_str());
}
return (TRUE);
}
+
return (FALSE);
}
bool_ takeoff_set(s16b a_idx, s16b set_idx)
{
- set_type *s_ptr = &set_info[set_idx];
- int i;
+ auto &set_info = game->edit_data.set_info;
+ auto const &a_info = game->edit_data.a_info;
if ( -1 == a_info[a_idx].set) return (FALSE);
+
+ auto s_ptr = &set_info[set_idx];
+
+ int i;
for (i = 0; i < s_ptr->num; i++)
- if (a_idx == s_ptr->arts[i].a_idx) break;
+ {
+ if (a_idx == s_ptr->arts[i].a_idx)
+ {
+ break;
+ }
+ }
if (s_ptr->arts[i].present)
{
@@ -6530,48 +6049,60 @@ bool_ takeoff_set(s16b a_idx, s16b set_idx)
if (s_ptr->num_use == s_ptr->num - 1)
{
- cmsg_format(TERM_GREEN, "%s item set not complete anymore.", s_ptr->name);
+ cmsg_format(TERM_GREEN, "%s item set not complete anymore.", s_ptr->name.c_str());
}
return (TRUE);
}
+
return (FALSE);
}
-bool_ apply_set(s16b a_idx, s16b set_idx)
+void apply_set(s16b a_idx, s16b set_idx)
{
- set_type *s_ptr = &set_info[set_idx];
- int i, j;
+ auto const &set_info = game->edit_data.set_info;
+ auto const &a_info = game->edit_data.a_info;
- if ( -1 == a_info[a_idx].set) return (FALSE);
+ if ( -1 == a_info[a_idx].set)
+ {
+ return;
+ }
+
+ auto s_ptr = &set_info[set_idx];
+
+ int i;
for (i = 0; i < s_ptr->num; i++)
- if (a_idx == s_ptr->arts[i].a_idx) break;
+ {
+ if (a_idx == s_ptr->arts[i].a_idx)
+ {
+ break;
+ }
+ }
+
if (s_ptr->arts[i].present)
{
- for (j = 0; j < s_ptr->num_use; j++)
+ for (int j = 0; j < s_ptr->num_use; j++)
{
- apply_flags(s_ptr->arts[i].flags1[j],
- s_ptr->arts[i].flags2[j],
- s_ptr->arts[i].flags3[j],
- s_ptr->arts[i].flags4[j],
- s_ptr->arts[i].flags5[j],
- s_ptr->arts[i].esp[j],
+ apply_flags(s_ptr->arts[i].flags[j],
s_ptr->arts[i].pval[j],
0, 0, 0, 0);
}
- return (TRUE);
}
- return (FALSE);
}
-static bool_ apply_flags_set(s16b a_idx, s16b set_idx,
- u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
+static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f)
{
- set_type *s_ptr = &set_info[set_idx];
- int i, j;
+ auto const &set_info = game->edit_data.set_info;
+ auto const &a_info = game->edit_data.a_info;
- if ( -1 == a_info[a_idx].set) return (FALSE);
+ if ( -1 == a_info[a_idx].set)
+ {
+ return;
+ }
+ auto s_ptr = &set_info[set_idx];
+
+ int i;
for (i = 0; i < s_ptr->num; i++)
{
if (a_idx == s_ptr->arts[i].a_idx) break;
@@ -6579,18 +6110,11 @@ static bool_ apply_flags_set(s16b a_idx, s16b set_idx,
if (s_ptr->arts[i].present)
{
- for (j = 0; j < s_ptr->num_use; j++)
+ for (int j = 0; j < s_ptr->num_use; j++)
{
- (*f1) |= s_ptr->arts[i].flags1[j];
- (*f2) |= s_ptr->arts[i].flags2[j];
- (*f3) |= s_ptr->arts[i].flags3[j];
- (*f4) |= s_ptr->arts[i].flags4[j];
- (*f5) |= s_ptr->arts[i].flags5[j];
- (*esp) |= s_ptr->arts[i].esp[j];
+ (*f) |= s_ptr->arts[i].flags[j];
}
- return (TRUE);
}
- return (FALSE);
}
/*
@@ -6601,6 +6125,9 @@ static bool_ apply_flags_set(s16b a_idx, s16b set_idx,
byte object_attr(object_type const *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+ auto const &random_artifacts = game->random_artifacts;
+
if (o_ptr->tval == TV_RANDART)
{
return random_artifacts[o_ptr->sval].attr;
@@ -6617,6 +6144,9 @@ byte object_attr(object_type const *o_ptr)
byte object_attr_default(object_type *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+ auto const &random_artifacts = game->random_artifacts;
+
if (o_ptr->tval == TV_RANDART)
{
return random_artifacts[o_ptr->sval].attr;
@@ -6639,6 +6169,8 @@ byte object_attr_default(object_type *o_ptr)
char object_char(object_type const *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
if (k_info[o_ptr->k_idx].flavor)
{
return misc_to_char[k_info[o_ptr->k_idx].flavor];
@@ -6651,6 +6183,8 @@ char object_char(object_type const *o_ptr)
char object_char_default(object_type const *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
if (k_info[o_ptr->k_idx].flavor)
{
return misc_to_char[k_info[o_ptr->k_idx].flavor];
@@ -6666,11 +6200,13 @@ char object_char_default(object_type const *o_ptr)
*/
bool artifact_p(object_type const *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
return
(o_ptr->tval == TV_RANDART) ||
(o_ptr->name1 ? true : false) ||
- (o_ptr->art_name ? true : false) ||
- ((k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) ? true : false);
+ (!o_ptr->artifact_name.empty()) ||
+ ((k_info[o_ptr->k_idx].flags & TR_NORM_ART) ? true : false);
}
/**
diff --git a/src/object1.hpp b/src/object1.hpp
index ec8f9367..8b9d6dc9 100644
--- a/src/object1.hpp
+++ b/src/object1.hpp
@@ -2,45 +2,48 @@
#include "h-basic.h"
#include "object_filter.hpp"
+#include "object_flag_set.hpp"
#include <boost/optional.hpp>
#include <functional>
typedef std::function<boost::optional<int>(object_filter_t const &filter)> select_by_name_t;
-extern byte get_item_letter_color(object_type *o_ptr);
-extern void object_pickup(int this_o_idx);
-extern bool_ apply_set(s16b a_idx, s16b set_idx);
-extern bool_ takeoff_set(s16b a_idx, s16b set_idx);
-extern bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent);
-extern bool_ verify(cptr prompt, int item);
-extern void flavor_init(void);
-extern void reset_visuals(void);
-extern int object_power(object_type *o_ptr);
+byte get_item_letter_color(object_type const *o_ptr);
+void object_pickup(int this_o_idx);
+void apply_set(s16b a_idx, s16b set_idx);
+bool_ takeoff_set(s16b a_idx, s16b set_idx);
+bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent);
+bool_ verify(cptr prompt, int item);
+void flavor_init();
+void reset_visuals();
+int object_power(object_type *o_ptr);
extern bool_ object_flags_no_set;
-extern void object_flags(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp);
-extern void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp);
-extern void object_desc(char *buf, object_type *o_ptr, int pref, int mode);
-extern void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode);
-extern bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it);
-extern char index_to_label(int i);
-extern s16b wield_slot_ideal(object_type const *o_ptr, bool_ ideal);
-extern s16b wield_slot(object_type const *o_ptr);
-extern cptr describe_use(int i);
-extern void display_inven(void);
-extern void display_equip(void);
-extern void show_inven_full();
-extern void show_equip_full();
-extern void toggle_inven_equip(void);
-extern bool_ get_item(int *cp, cptr pmt, cptr str, int mode, object_filter_t const &filter = object_filter::True(), select_by_name_t const &select_by_name = select_by_name_t());
-extern cptr item_activation(object_type *o_ptr,byte num);
-extern void py_pickup_floor(int pickup);
-extern void object_gain_level(object_type *o_ptr);
-extern byte object_attr(object_type const *o_ptr);
-extern byte object_attr_default(object_type *o_ptr);
-extern char object_char(object_type const *o_ptr);
-extern char object_char_default(object_type const *o_ptr);
-extern bool artifact_p(object_type const *o_ptr);
-extern bool ego_item_p(object_type const *o_ptr);
-extern bool is_ego_p(object_type const *o_ptr, s16b ego);
-extern bool cursed_p(object_type const *o_ptr);
+object_flag_set object_flags(object_type const *o_ptr);
+object_flag_set object_flags_known(object_type const *o_ptr);
+
+s32b calc_object_need_exp(object_type const *o_ptr);
+void object_desc(char *buf, object_type const *o_ptr, int pref, int mode);
+void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode);
+bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it);
+char index_to_label(int i);
+s16b wield_slot_ideal(object_type const *o_ptr, bool_ ideal);
+s16b wield_slot(object_type const *o_ptr);
+cptr describe_use(int i);
+void display_inven();
+void display_equip();
+void show_inven_full();
+void show_equip_full();
+void toggle_inven_equip();
+bool_ get_item(int *cp, cptr pmt, cptr str, int mode, object_filter_t const &filter = object_filter::True(), select_by_name_t const &select_by_name = select_by_name_t());
+cptr item_activation(object_type *o_ptr);
+void py_pickup_floor(int pickup);
+void object_gain_level(object_type *o_ptr);
+byte object_attr(object_type const *o_ptr);
+byte object_attr_default(object_type *o_ptr);
+char object_char(object_type const *o_ptr);
+char object_char_default(object_type const *o_ptr);
+bool artifact_p(object_type const *o_ptr);
+bool ego_item_p(object_type const *o_ptr);
+bool is_ego_p(object_type const *o_ptr, s16b ego);
+bool cursed_p(object_type const *o_ptr);
diff --git a/src/object2.cc b/src/object2.cc
index 620037a3..2d6ea672 100644
--- a/src/object2.cc
+++ b/src/object2.cc
@@ -15,14 +15,20 @@
#include "spell_type.hpp"
#include "device_allocation.hpp"
#include "dungeon_info_type.hpp"
+#include "ego_flag.hpp"
#include "ego_item_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "mimic.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
+#include "object_flag.hpp"
+#include "object_flag_meta.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "options.hpp"
@@ -34,7 +40,6 @@
#include "spells3.hpp"
#include "spells5.hpp"
#include "tables.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "variable.hpp"
#include "wilderness_map.hpp"
@@ -49,7 +54,7 @@
/*
* Calculate the player's total inventory weight.
*/
-s32b calc_total_weight(void)
+s32b calc_total_weight()
{
int i;
s32b total;
@@ -234,6 +239,8 @@ static void compact_objects_aux(int i1, int i2)
*/
void compact_objects(int size)
{
+ auto const &k_info = game->edit_data.k_info;
+
int i, y, x, num;
int cur_lev, cur_dis, chance;
@@ -263,7 +270,7 @@ void compact_objects(int size)
{
object_type *o_ptr = &o_list[i];
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Skip dead objects */
if (!o_ptr->k_idx) continue;
@@ -306,7 +313,7 @@ void compact_objects(int size)
chance = chance - cur_lev / 2;
/* Artifacts */
- if ( artifact_p(o_ptr) || o_ptr->art_name )
+ if (artifact_p(o_ptr))
{
/* Artifacts are "immune if the level is lower */
/* than 300 + artifact level */
@@ -314,7 +321,7 @@ void compact_objects(int size)
continue;
/* That's 400 + level for fixed artifacts */
- if ( (k_ptr->flags3 & TR3_NORM_ART) && cur_lev < 400 + k_ptr->level )
+ if ( (k_ptr->flags & TR_NORM_ART) && cur_lev < 400 + k_ptr->level )
continue;
/* Never protect if level is high enough; so we don't wipe a better artifact */
@@ -369,8 +376,11 @@ void compact_objects(int size)
* clear those fields for grids/monsters containing objects,
* and we clear it once for every such object.
*/
-void wipe_o_list(void)
+void wipe_o_list()
{
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+
int i;
/* Delete the existing objects */
@@ -382,7 +392,7 @@ void wipe_o_list(void)
if (!o_ptr->k_idx) continue;
/* Mega-Hack -- preserve artifacts */
- if (!character_dungeon || p_ptr->preserve)
+ if (!character_dungeon || options->preserve)
{
/* Hack -- Preserve unknown artifacts */
if (artifact_p(o_ptr) && !object_known_p(o_ptr))
@@ -390,9 +400,9 @@ void wipe_o_list(void)
/* Mega-Hack -- Preserve the artifact */
if (o_ptr->tval == TV_RANDART)
{
- random_artifacts[o_ptr->sval].generated = FALSE;
+ game->random_artifacts[o_ptr->sval].generated = FALSE;
}
- else if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART)
+ else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART)
{
k_info[o_ptr->k_idx].artifact = FALSE;
}
@@ -447,7 +457,7 @@ void wipe_o_list(void)
* This routine should almost never fail, but in case it does,
* we must be sure to handle "failure" of this routine.
*/
-s16b o_pop(void)
+s16b o_pop()
{
int i;
@@ -500,28 +510,25 @@ s16b o_pop(void)
/*
* Apply a "object restriction function" to the "object allocation table"
*/
-errr get_obj_num_prep(void)
+errr get_obj_num_prep()
{
- int i;
-
- /* Get the entry */
- alloc_entry *table = alloc_kind_table;
+ auto &alloc = game->alloc;
/* Scan the allocation table */
- for (i = 0; i < alloc_kind_size; i++)
+ for (auto &&entry: alloc.kind_table)
{
/* Accept objects which pass the restriction, if any */
- if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
+ if (!get_obj_num_hook || (*get_obj_num_hook)(entry.index))
{
/* Accept this object */
- table[i].prob2 = table[i].prob1;
+ entry.prob2 = entry.prob1;
}
/* Do not use this object */
else
{
/* Decline this object */
- table[i].prob2 = 0;
+ entry.prob2 = 0;
}
}
@@ -548,11 +555,13 @@ errr get_obj_num_prep(void)
*/
s16b get_obj_num(int level)
{
- int i, j, p;
+ auto const &k_info = game->edit_data.k_info;
+ auto &alloc = game->alloc;
+
+ std::size_t i, j;
+ int p;
int k_idx;
long value, total;
- object_kind *k_ptr;
- alloc_entry *table = alloc_kind_table;
/* Boost level */
@@ -571,51 +580,56 @@ s16b get_obj_num(int level)
total = 0L;
/* Process probabilities */
- for (i = 0; i < alloc_kind_size; i++)
+ for (i = 0; i < alloc.kind_table.size(); i++)
{
+ auto &entry = alloc.kind_table[i];
+
/* Objects are sorted by depth */
- if (table[i].level > level) break;
+ if (entry.level > level) break;
/* Default */
- table[i].prob3 = 0;
+ entry.prob3 = 0;
/* Access the index */
- k_idx = table[i].index;
+ k_idx = entry.index;
/* Access the actual kind */
- k_ptr = &k_info[k_idx];
+ auto k_ptr = &k_info[k_idx];
/* Hack -- prevent embedded chests */
if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
/* Accept */
- table[i].prob3 = table[i].prob2;
+ entry.prob3 = entry.prob2;
/* Total */
- total += table[i].prob3;
+ total += entry.prob3;
}
/* No legal objects */
if (total <= 0) return (0);
-
/* Pick an object */
value = rand_int(total);
/* Find the object */
- for (i = 0; i < alloc_kind_size; i++)
+ for (i = 0; i < alloc.kind_table.size(); i++)
{
+ auto &entry = alloc.kind_table[i];
+
/* Found the entry */
- if (value < table[i].prob3) break;
+ if (value < entry.prob3) break;
/* Decrement */
- value = value - table[i].prob3;
+ value = value - entry.prob3;
}
-
/* Power boost */
p = rand_int(100);
+ /* Shorthand */
+ auto &table = alloc.kind_table;
+
/* Try for a "better" object once (50%) or twice (10%) */
if (p < 60)
{
@@ -626,8 +640,9 @@ s16b get_obj_num(int level)
value = rand_int(total);
/* Find the monster */
- for (i = 0; i < alloc_kind_size; i++)
+ for (i = 0; i < table.size(); i++)
{
+
/* Found the entry */
if (value < table[i].prob3) break;
@@ -649,7 +664,7 @@ s16b get_obj_num(int level)
value = rand_int(total);
/* Find the object */
- for (i = 0; i < alloc_kind_size; i++)
+ for (i = 0; i < table.size(); i++)
{
/* Found the entry */
if (value < table[i].prob3) break;
@@ -714,6 +729,8 @@ void object_known(object_type *o_ptr)
*/
bool object_known_p(object_type const *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
return ((o_ptr->ident & (IDENT_KNOWN)) ||
(k_info[o_ptr->k_idx].easy_know && k_info[o_ptr->k_idx].aware));
}
@@ -725,6 +742,8 @@ bool object_known_p(object_type const *o_ptr)
*/
void object_aware(object_type *o_ptr)
{
+ auto &k_info = game->edit_data.k_info;
+
/* Fully aware of the effects */
k_info[o_ptr->k_idx].aware = TRUE;
}
@@ -734,6 +753,8 @@ void object_aware(object_type *o_ptr)
*/
bool object_aware_p(object_type const *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
return k_info[o_ptr->k_idx].aware;
}
@@ -743,6 +764,8 @@ bool object_aware_p(object_type const *o_ptr)
*/
void object_tried(object_type *o_ptr)
{
+ auto &k_info = game->edit_data.k_info;
+
/* Mark it as tried (even if "aware") */
k_info[o_ptr->k_idx].tried = TRUE;
}
@@ -753,6 +776,8 @@ void object_tried(object_type *o_ptr)
*/
bool object_tried_p(object_type const *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
return k_info[o_ptr->k_idx].tried;
}
@@ -763,7 +788,10 @@ bool object_tried_p(object_type const *o_ptr)
*/
static s32b object_value_base(object_type const *o_ptr)
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Aware item -- use template cost */
if ((object_aware_p(o_ptr)) && (o_ptr->tval != TV_EGG)) return (k_ptr->cost);
@@ -810,7 +838,7 @@ static s32b object_value_base(object_type const *o_ptr)
/* Eggs */
case TV_EGG:
{
- monster_race *r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
/* Pay the monster level */
return (r_ptr->level * 100) + 100;
@@ -825,139 +853,139 @@ static s32b object_value_base(object_type const *o_ptr)
}
/* Return the value of the flags the object has... */
-s32b flag_cost(object_type const * o_ptr, int plusses)
+s32b flag_cost(object_type const *o_ptr, int plusses)
{
- s32b total = 0;
- u32b f1, f2, f3, f4, f5, esp;
+ auto const flags = object_flags(o_ptr);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- if (f5 & TR5_TEMPORARY)
+ if (flags & TR_TEMPORARY)
{
return 0;
}
- if (f4 & TR4_CURSE_NO_DROP)
+
+ if (flags & TR_CURSE_NO_DROP)
{
return 0;
}
- if (f1 & TR1_STR) total += (1000 * plusses);
- if (f1 & TR1_INT) total += (1000 * plusses);
- if (f1 & TR1_WIS) total += (1000 * plusses);
- if (f1 & TR1_DEX) total += (1000 * plusses);
- if (f1 & TR1_CON) total += (1000 * plusses);
- if (f1 & TR1_CHR) total += (250 * plusses);
- if (f1 & TR1_CHAOTIC) total += 10000;
- if (f1 & TR1_VAMPIRIC) total += 13000;
- if (f1 & TR1_STEALTH) total += (250 * plusses);
- if (f1 & TR1_SEARCH) total += (100 * plusses);
- if (f1 & TR1_INFRA) total += (150 * plusses);
- if (f1 & TR1_TUNNEL) total += (175 * plusses);
- if ((f1 & TR1_SPEED) && (plusses > 0))
+
+ s32b total = 0;
+
+ if (flags & TR_STR) total += (1000 * plusses);
+ if (flags & TR_INT) total += (1000 * plusses);
+ if (flags & TR_WIS) total += (1000 * plusses);
+ if (flags & TR_DEX) total += (1000 * plusses);
+ if (flags & TR_CON) total += (1000 * plusses);
+ if (flags & TR_CHR) total += (250 * plusses);
+ if (flags & TR_CHAOTIC) total += 10000;
+ if (flags & TR_VAMPIRIC) total += 13000;
+ if (flags & TR_STEALTH) total += (250 * plusses);
+ if (flags & TR_INFRA) total += (150 * plusses);
+ if (flags & TR_TUNNEL) total += (175 * plusses);
+ if ((flags & TR_SPEED) && (plusses > 0))
total += (10000 + (2500 * plusses));
- if ((f1 & TR1_BLOWS) && (plusses > 0))
+ if ((flags & TR_BLOWS) && (plusses > 0))
total += (10000 + (2500 * plusses));
- if (f1 & TR1_MANA) total += (1000 * plusses);
- if (f1 & TR1_SPELL) total += (2000 * plusses);
- if (f1 & TR1_SLAY_ANIMAL) total += 3500;
- if (f1 & TR1_SLAY_EVIL) total += 4500;
- if (f1 & TR1_SLAY_UNDEAD) total += 3500;
- if (f1 & TR1_SLAY_DEMON) total += 3500;
- if (f1 & TR1_SLAY_ORC) total += 3000;
- if (f1 & TR1_SLAY_TROLL) total += 3500;
- if (f1 & TR1_SLAY_GIANT) total += 3500;
- if (f1 & TR1_SLAY_DRAGON) total += 3500;
- if (f5 & TR5_KILL_DEMON) total += 5500;
- if (f5 & TR5_KILL_UNDEAD) total += 5500;
- if (f1 & TR1_KILL_DRAGON) total += 5500;
- if (f1 & TR1_VORPAL) total += 5000;
- if (f1 & TR1_IMPACT) total += 5000;
- if (f1 & TR1_BRAND_POIS) total += 7500;
- if (f1 & TR1_BRAND_ACID) total += 7500;
- if (f1 & TR1_BRAND_ELEC) total += 7500;
- if (f1 & TR1_BRAND_FIRE) total += 5000;
- if (f1 & TR1_BRAND_COLD) total += 5000;
- if (f2 & TR2_SUST_STR) total += 850;
- if (f2 & TR2_SUST_INT) total += 850;
- if (f2 & TR2_SUST_WIS) total += 850;
- if (f2 & TR2_SUST_DEX) total += 850;
- if (f2 & TR2_SUST_CON) total += 850;
- if (f2 & TR2_SUST_CHR) total += 250;
- if (f2 & TR2_INVIS) total += 3000;
- if (f2 & TR2_LIFE) total += (5000 * plusses);
- if (f2 & TR2_IM_ACID) total += 10000;
- if (f2 & TR2_IM_ELEC) total += 10000;
- if (f2 & TR2_IM_FIRE) total += 10000;
- if (f2 & TR2_IM_COLD) total += 10000;
- if (f2 & TR2_SENS_FIRE) total -= 100;
- if (f2 & TR2_REFLECT) total += 10000;
- if (f2 & TR2_FREE_ACT) total += 4500;
- if (f2 & TR2_HOLD_LIFE) total += 8500;
- if (f2 & TR2_RES_ACID) total += 1250;
- if (f2 & TR2_RES_ELEC) total += 1250;
- if (f2 & TR2_RES_FIRE) total += 1250;
- if (f2 & TR2_RES_COLD) total += 1250;
- if (f2 & TR2_RES_POIS) total += 2500;
- if (f2 & TR2_RES_FEAR) total += 2500;
- if (f2 & TR2_RES_LITE) total += 1750;
- if (f2 & TR2_RES_DARK) total += 1750;
- if (f2 & TR2_RES_BLIND) total += 2000;
- if (f2 & TR2_RES_CONF) total += 2000;
- if (f2 & TR2_RES_SOUND) total += 2000;
- if (f2 & TR2_RES_SHARDS) total += 2000;
- if (f2 & TR2_RES_NETHER) total += 2000;
- if (f2 & TR2_RES_NEXUS) total += 2000;
- if (f2 & TR2_RES_CHAOS) total += 2000;
- if (f2 & TR2_RES_DISEN) total += 10000;
- if (f3 & TR3_SH_FIRE) total += 5000;
- if (f3 & TR3_SH_ELEC) total += 5000;
- if (f3 & TR3_DECAY) total += 0;
- if (f3 & TR3_NO_TELE) total += 2500;
- if (f3 & TR3_NO_MAGIC) total += 2500;
- if (f3 & TR3_WRAITH) total += 250000;
- if (f3 & TR3_TY_CURSE) total -= 15000;
- if (f3 & TR3_EASY_KNOW) total += 0;
- if (f3 & TR3_HIDE_TYPE) total += 0;
- if (f3 & TR3_SHOW_MODS) total += 0;
- if (f3 & TR3_INSTA_ART) total += 0;
- if (f3 & TR3_LITE1) total += 750;
- if (f4 & TR4_LITE2) total += 1250;
- if (f4 & TR4_LITE3) total += 2750;
- if (f3 & TR3_SEE_INVIS) total += 2000;
- if (esp) total += (12500 * count_bits(esp));
- if (f3 & TR3_SLOW_DIGEST) total += 750;
- if (f3 & TR3_REGEN) total += 2500;
- if (f3 & TR3_XTRA_MIGHT) total += 2250;
- if (f3 & TR3_XTRA_SHOTS) total += 10000;
- if (f3 & TR3_IGNORE_ACID) total += 100;
- if (f3 & TR3_IGNORE_ELEC) total += 100;
- if (f3 & TR3_IGNORE_FIRE) total += 100;
- if (f3 & TR3_IGNORE_COLD) total += 100;
- if (f3 & TR3_ACTIVATE) total += 100;
- if (f3 & TR3_DRAIN_EXP) total -= 12500;
- if (f3 & TR3_TELEPORT)
+ if (flags & TR_MANA) total += (1000 * plusses);
+ if (flags & TR_SPELL) total += (2000 * plusses);
+ if (flags & TR_SLAY_ANIMAL) total += 3500;
+ if (flags & TR_SLAY_EVIL) total += 4500;
+ if (flags & TR_SLAY_UNDEAD) total += 3500;
+ if (flags & TR_SLAY_DEMON) total += 3500;
+ if (flags & TR_SLAY_ORC) total += 3000;
+ if (flags & TR_SLAY_TROLL) total += 3500;
+ if (flags & TR_SLAY_GIANT) total += 3500;
+ if (flags & TR_SLAY_DRAGON) total += 3500;
+ if (flags & TR_KILL_DEMON) total += 5500;
+ if (flags & TR_KILL_UNDEAD) total += 5500;
+ if (flags & TR_KILL_DRAGON) total += 5500;
+ if (flags & TR_VORPAL) total += 5000;
+ if (flags & TR_IMPACT) total += 5000;
+ if (flags & TR_BRAND_POIS) total += 7500;
+ if (flags & TR_BRAND_ACID) total += 7500;
+ if (flags & TR_BRAND_ELEC) total += 7500;
+ if (flags & TR_BRAND_FIRE) total += 5000;
+ if (flags & TR_BRAND_COLD) total += 5000;
+ if (flags & TR_SUST_STR) total += 850;
+ if (flags & TR_SUST_INT) total += 850;
+ if (flags & TR_SUST_WIS) total += 850;
+ if (flags & TR_SUST_DEX) total += 850;
+ if (flags & TR_SUST_CON) total += 850;
+ if (flags & TR_SUST_CHR) total += 250;
+ if (flags & TR_INVIS) total += 3000;
+ if (flags & TR_LIFE) total += (5000 * plusses);
+ if (flags & TR_IM_ACID) total += 10000;
+ if (flags & TR_IM_ELEC) total += 10000;
+ if (flags & TR_IM_FIRE) total += 10000;
+ if (flags & TR_IM_COLD) total += 10000;
+ if (flags & TR_SENS_FIRE) total -= 100;
+ if (flags & TR_REFLECT) total += 10000;
+ if (flags & TR_FREE_ACT) total += 4500;
+ if (flags & TR_HOLD_LIFE) total += 8500;
+ if (flags & TR_RES_ACID) total += 1250;
+ if (flags & TR_RES_ELEC) total += 1250;
+ if (flags & TR_RES_FIRE) total += 1250;
+ if (flags & TR_RES_COLD) total += 1250;
+ if (flags & TR_RES_POIS) total += 2500;
+ if (flags & TR_RES_FEAR) total += 2500;
+ if (flags & TR_RES_LITE) total += 1750;
+ if (flags & TR_RES_DARK) total += 1750;
+ if (flags & TR_RES_BLIND) total += 2000;
+ if (flags & TR_RES_CONF) total += 2000;
+ if (flags & TR_RES_SOUND) total += 2000;
+ if (flags & TR_RES_SHARDS) total += 2000;
+ if (flags & TR_RES_NETHER) total += 2000;
+ if (flags & TR_RES_NEXUS) total += 2000;
+ if (flags & TR_RES_CHAOS) total += 2000;
+ if (flags & TR_RES_DISEN) total += 10000;
+ if (flags & TR_SH_FIRE) total += 5000;
+ if (flags & TR_SH_ELEC) total += 5000;
+ if (flags & TR_DECAY) total += 0;
+ if (flags & TR_NO_TELE) total += 2500;
+ if (flags & TR_NO_MAGIC) total += 2500;
+ if (flags & TR_WRAITH) total += 250000;
+ if (flags & TR_TY_CURSE) total -= 15000;
+ if (flags & TR_EASY_KNOW) total += 0;
+ if (flags & TR_HIDE_TYPE) total += 0;
+ if (flags & TR_SHOW_MODS) total += 0;
+ if (flags & TR_INSTA_ART) total += 0;
+ if (flags & TR_LITE1) total += 750;
+ if (flags & TR_LITE2) total += 1250;
+ if (flags & TR_LITE3) total += 2750;
+ if (flags & TR_SEE_INVIS) total += 2000;
+ total += 12500 * ((flags & object_flags_esp()).count());
+ if (flags & TR_SLOW_DIGEST) total += 750;
+ if (flags & TR_REGEN) total += 2500;
+ if (flags & TR_XTRA_MIGHT) total += 2250;
+ if (flags & TR_XTRA_SHOTS) total += 10000;
+ if (flags & TR_IGNORE_ACID) total += 100;
+ if (flags & TR_IGNORE_ELEC) total += 100;
+ if (flags & TR_IGNORE_FIRE) total += 100;
+ if (flags & TR_IGNORE_COLD) total += 100;
+ if (flags & TR_ACTIVATE) total += 100;
+ if (flags & TR_DRAIN_EXP) total -= 12500;
+ if (flags & TR_TELEPORT)
{
if (o_ptr->ident & IDENT_CURSED)
total -= 7500;
else
total += 250;
}
- if (f3 & TR3_AGGRAVATE) total -= 10000;
- if (f3 & TR3_BLESSED) total += 750;
- if ((f3 & TR3_CURSED) && (o_ptr->ident & IDENT_CURSED)) total -= 5000;
- if ((f3 & TR3_HEAVY_CURSE) && (o_ptr->ident & IDENT_CURSED)) total -= 12500;
- if (f3 & TR3_PERMA_CURSE) total -= 15000;
- if (f3 & TR3_FEATHER) total += 1250;
- if (f4 & TR4_FLY) total += 10000;
- if (f4 & TR4_NEVER_BLOW) total -= 15000;
- if (f4 & TR4_PRECOGNITION) total += 250000;
- if (f4 & TR4_BLACK_BREATH) total -= 12500;
- if (f4 & TR4_DG_CURSE) total -= 25000;
- if (f4 & TR4_CLONE) total -= 10000;
- if (f4 & TR4_LEVELS) total += o_ptr->elevel * 2000;
+ if (flags & TR_AGGRAVATE) total -= 10000;
+ if (flags & TR_BLESSED) total += 750;
+ if ((flags & TR_CURSED) && (o_ptr->ident & IDENT_CURSED)) total -= 5000;
+ if ((flags & TR_HEAVY_CURSE) && (o_ptr->ident & IDENT_CURSED)) total -= 12500;
+ if (flags & TR_PERMA_CURSE) total -= 15000;
+ if (flags & TR_FEATHER) total += 1250;
+ if (flags & TR_FLY) total += 10000;
+ if (flags & TR_NEVER_BLOW) total -= 15000;
+ if (flags & TR_PRECOGNITION) total += 250000;
+ if (flags & TR_BLACK_BREATH) total -= 12500;
+ if (flags & TR_DG_CURSE) total -= 25000;
+ if (flags & TR_CLONE) total -= 10000;
+ if (flags & TR_LEVELS) total += o_ptr->elevel * 2000;
/* Also, give some extra for activatable powers... */
- if ((o_ptr->art_name) && (o_ptr->art_flags3 & (TR3_ACTIVATE)))
+ if ((!o_ptr->artifact_name.empty()) && (o_ptr->art_flags & TR_ACTIVATE))
{
int type = o_ptr->xtra2;
@@ -1063,15 +1091,18 @@ s32b flag_cost(object_type const * o_ptr, int plusses)
*/
s32b object_value_real(object_type const *o_ptr)
{
- s32b value;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
+ auto const &e_info = game->edit_data.e_info;
- u32b f1, f2, f3, f4, f5, esp;
+ s32b value;
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto k_ptr = &k_info[o_ptr->k_idx];
if (o_ptr->tval == TV_RANDART)
{
- return random_artifacts[o_ptr->sval].cost;
+ return game->random_artifacts[o_ptr->sval].cost;
}
/* Hack -- "worthless" items */
@@ -1081,18 +1112,18 @@ s32b object_value_real(object_type const *o_ptr)
value = k_ptr->cost;
/* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
- if (f5 & TR5_TEMPORARY) return (0L);
+ if (flags & TR_TEMPORARY) return (0L);
- if (o_ptr->art_flags1 || o_ptr->art_flags2 || o_ptr->art_flags3)
+ if (o_ptr->art_flags)
{
value += flag_cost (o_ptr, o_ptr->pval);
}
/* Artifact */
else if (o_ptr->name1)
{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
/* Hack -- "worthless" artifacts */
if (!a_ptr->cost) return (0L);
@@ -1104,7 +1135,7 @@ s32b object_value_real(object_type const *o_ptr)
/* Ego-Item */
else if (o_ptr->name2)
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
+ auto e_ptr = &e_info[o_ptr->name2];
/* Hack -- "worthless" ego-items */
if (!e_ptr->cost) return (0L);
@@ -1114,7 +1145,7 @@ s32b object_value_real(object_type const *o_ptr)
if (o_ptr->name2b)
{
- ego_item_type *e_ptr = &e_info[o_ptr->name2b];
+ auto e_ptr = &e_info[o_ptr->name2b];
/* Hack -- "worthless" ego-items */
if (!e_ptr->cost) return (0L);
@@ -1125,7 +1156,7 @@ s32b object_value_real(object_type const *o_ptr)
}
/* Pay the spell */
- if (f5 & TR5_SPELL_CONTAIN)
+ if (flags & TR_SPELL_CONTAIN)
{
if (o_ptr->pval2 != -1)
value += 5000 + 500 * spell_type_skill_level(spell_at(o_ptr->pval2));
@@ -1156,35 +1187,33 @@ s32b object_value_real(object_type const *o_ptr)
case TV_AMULET:
case TV_RING:
case TV_MSTAFF:
- case TV_TRAPKIT:
case TV_INSTRUMENT:
{
/* No pval */
if (!o_ptr->pval) break;
/* Give credit for stat bonuses */
- if (f1 & (TR1_STR)) value += (o_ptr->pval * 200L);
- if (f1 & (TR1_INT)) value += (o_ptr->pval * 200L);
- if (f1 & (TR1_WIS)) value += (o_ptr->pval * 200L);
- if (f1 & (TR1_DEX)) value += (o_ptr->pval * 200L);
- if (f1 & (TR1_CON)) value += (o_ptr->pval * 200L);
- if (f1 & (TR1_CHR)) value += (o_ptr->pval * 200L);
+ if (flags & TR_STR) value += (o_ptr->pval * 200L);
+ if (flags & TR_INT) value += (o_ptr->pval * 200L);
+ if (flags & TR_WIS) value += (o_ptr->pval * 200L);
+ if (flags & TR_DEX) value += (o_ptr->pval * 200L);
+ if (flags & TR_CON) value += (o_ptr->pval * 200L);
+ if (flags & TR_CHR) value += (o_ptr->pval * 200L);
- if (f5 & (TR5_CRIT)) value += (o_ptr->pval * 500L);
+ if (flags & TR_CRIT) value += (o_ptr->pval * 500L);
/* Give credit for stealth and searching */
- if (f1 & (TR1_STEALTH)) value += (o_ptr->pval * 100L);
- if (f1 & (TR1_SEARCH)) value += (o_ptr->pval * 100L);
+ if (flags & TR_STEALTH) value += (o_ptr->pval * 100L);
/* Give credit for infra-vision and tunneling */
- if (f1 & (TR1_INFRA)) value += (o_ptr->pval * 50L);
- if (f1 & (TR1_TUNNEL)) value += (o_ptr->pval * 50L);
+ if (flags & TR_INFRA) value += (o_ptr->pval * 50L);
+ if (flags & TR_TUNNEL) value += (o_ptr->pval * 50L);
/* Give credit for extra attacks */
- if (f1 & (TR1_BLOWS)) value += (o_ptr->pval * 2000L);
+ if (flags & TR_BLOWS) value += (o_ptr->pval * 2000L);
/* Give credit for speed bonus */
- if (f1 & (TR1_SPEED)) value += (o_ptr->pval * 30000L);
+ if (flags & TR_SPEED) value += (o_ptr->pval * 30000L);
break;
}
@@ -1197,7 +1226,7 @@ s32b object_value_real(object_type const *o_ptr)
/* Eggs */
case TV_EGG:
{
- monster_race *r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
/* Pay the monster level */
value += r_ptr->level * 100;
@@ -1316,7 +1345,6 @@ s32b object_value_real(object_type const *o_ptr)
case TV_DAEMON_BOOK:
case TV_AXE:
case TV_POLEARM:
- case TV_TRAPKIT:
{
/* Hack -- negative hit/damage bonuses */
if (o_ptr->to_h + o_ptr->to_d < 0 && !value) return (0L);
@@ -1434,17 +1462,15 @@ s32b object_value(object_type const *o_ptr)
bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr)
{
int total = o_ptr->number + j_ptr->number;
- u32b f1, f2, f3, f4, f5, esp, f11, f12, f13, f14, esp1, f15;
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- object_flags(j_ptr, &f11, &f12, &f13, &f14, &f15, &esp1);
-
+ auto const o_flags = object_flags(o_ptr);
+ auto const j_flags = object_flags(j_ptr);
/* Require identical object types */
if (o_ptr->k_idx != j_ptr->k_idx) return (0);
- if ((f5 & TR5_SPELL_CONTAIN) || (f15 & TR5_SPELL_CONTAIN))
+ if ((o_flags & TR_SPELL_CONTAIN) || (j_flags & TR_SPELL_CONTAIN))
return FALSE;
/* Analyze the items */
@@ -1483,17 +1509,6 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr)
return FALSE;
}
- case TV_RUNE1:
- {
- return TRUE;
- }
-
- case TV_RUNE2:
- {
- if ((o_ptr->sval == RUNE_STONE) || (j_ptr->sval == RUNE_STONE)) return FALSE;
- else return TRUE;
- }
-
case TV_INSTRUMENT:
{
return FALSE;
@@ -1548,7 +1563,7 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr)
if (o_ptr->pval != j_ptr->pval) return (0);
/* Do not combine recharged ones with non recharged ones. */
- if ((f4 & TR4_RECHARGED) != (f14 & TR4_RECHARGED)) return (0);
+ if ((o_flags & TR_RECHARGED) != (j_flags & TR_RECHARGED)) return (0);
/* Do not combine different spells */
if (o_ptr->pval2 != j_ptr->pval2) return (0);
@@ -1583,7 +1598,7 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr)
if (o_ptr->name1 != j_ptr->name1) return (0);
/* Do not combine recharged ones with non recharged ones. */
- if ((f4 & TR4_RECHARGED) != (f14 & TR4_RECHARGED)) return (0);
+ if ((o_flags & TR_RECHARGED) != (j_flags & TR_RECHARGED)) return (0);
/* Do not combine different spells */
if (o_ptr->pval2 != j_ptr->pval2) return (0);
@@ -1633,7 +1648,6 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr)
case TV_SOFT_ARMOR:
case TV_HARD_ARMOR:
case TV_DRAG_ARMOR:
- case TV_TRAPKIT:
case TV_DAEMON_BOOK:
{
/* Fall through */
@@ -1723,16 +1737,19 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr)
/* Hack -- Identical art_flags! */
- if ((o_ptr->art_flags1 != j_ptr->art_flags1) ||
- (o_ptr->art_flags2 != j_ptr->art_flags2) ||
- (o_ptr->art_flags3 != j_ptr->art_flags3))
+ if (o_ptr->art_flags != j_ptr->art_flags)
+ {
return (0);
+ }
/* Hack -- Require identical "cursed" status */
if ((o_ptr->ident & (IDENT_CURSED)) != (j_ptr->ident & (IDENT_CURSED))) return (0);
/* Hack -- require semi-matching "inscriptions" */
- if (o_ptr->note && j_ptr->note && (o_ptr->note != j_ptr->note)) return (0);
+ if ((!o_ptr->inscription.empty()) && (!j_ptr->inscription.empty()) && (o_ptr->inscription != j_ptr->inscription))
+ {
+ return (0);
+ }
/* Maximal "stacking" limit */
if (total >= MAX_STACK_SIZE) return (0);
@@ -1768,7 +1785,10 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr)
if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
/* Hack -- blend "inscriptions" */
- if (j_ptr->note) o_ptr->note = j_ptr->note;
+ if (!j_ptr->inscription.empty())
+ {
+ o_ptr->inscription = j_ptr->inscription;
+ }
/* Hack -- could average discounts XXX XXX XXX */
/* Hack -- save largest discount XXX XXX XXX */
@@ -1788,22 +1808,22 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr)
*/
s16b lookup_kind(int tval, int sval)
{
- int k;
+ auto const &k_info = game->edit_data.k_info;
- /* Look for it */
- for (k = 1; k < max_k_idx; k++)
+ for (std::size_t k = 1; k < k_info.size(); k++)
{
- object_kind *k_ptr = &k_info[k];
-
- /* Found a match */
- if ((k_ptr->tval == tval) && (k_ptr->sval == sval)) return (k);
+ auto k_ptr = &k_info[k];
+ if ((k_ptr->tval == tval) && (k_ptr->sval == sval))
+ {
+ return k;
+ }
}
/* Oops */
if (wizard) msg_format("No object (%d,%d)", tval, sval);
/* Oops */
- return (0);
+ return 0;
}
@@ -1813,8 +1833,7 @@ s16b lookup_kind(int tval, int sval)
void object_wipe(object_type *o_ptr)
{
/* Wipe the structure */
- static_assert(std::is_pod<object_type>::value, "object_type must be POD type for memset to work");
- memset(o_ptr, 0, sizeof(object_type));
+ *o_ptr = object_type();
}
@@ -1829,11 +1848,24 @@ void object_copy(object_type *o_ptr, object_type *j_ptr)
/*
+ * Initialize the experience of an object which is a
+ * "sentient" object.
+ */
+static void init_obj_exp(object_type *o_ptr, object_kind const *k_ptr)
+{
+ o_ptr->elevel = (k_ptr->level / 10) + 1;
+ o_ptr->exp = player_exp[o_ptr->elevel - 1];
+}
+
+
+/*
* Prepare an object based on an object kind.
*/
void object_prep(object_type *o_ptr, int k_idx)
{
- object_kind *k_ptr = &k_info[k_idx];
+ auto const &k_info = game->edit_data.k_info;
+
+ auto k_ptr = &k_info[k_idx];
/* Clear the record */
object_wipe(o_ptr);
@@ -1866,13 +1898,15 @@ void object_prep(object_type *o_ptr, int k_idx)
o_ptr->ds = k_ptr->ds;
/* Hack -- cursed items are always "cursed" */
- if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
+ if (k_ptr->flags & TR_CURSED)
+ {
+ o_ptr->ident |= (IDENT_CURSED);
+ }
/* Hack give a basic exp/exp level to an object that needs it */
- if (k_ptr->flags4 & TR4_LEVELS)
+ if (k_ptr->flags & TR_LEVELS)
{
- o_ptr->elevel = (k_ptr->level / 10) + 1;
- o_ptr->exp = player_exp[o_ptr->elevel - 1];
+ init_obj_exp(o_ptr, k_ptr);
o_ptr->pval2 = 1; /* Start with one point */
o_ptr->pval3 = 0; /* No flags groups */
}
@@ -1968,24 +2002,21 @@ s16b m_bonus(int max, int level)
*/
static void finalize_randart(object_type* o_ptr, int lev)
{
- int r;
- int i = 0;
- int foo = lev + randnor(0, 5);
- bool_ flag = TRUE;
+ auto &random_artifacts = game->random_artifacts;
/* Paranoia */
- if (o_ptr->tval != TV_RANDART) return;
-
- if (foo < 1) foo = 1;
- if (foo > 100) foo = 100;
+ if (o_ptr->tval != TV_RANDART)
+ {
+ return;
+ }
- while (flag)
+ for (int i = 0; ; i++)
{
- r = rand_int(MAX_RANDARTS);
+ auto const r = rand_int(MAX_RANDARTS);
if (!(random_artifacts[r].generated) || i > 2000)
{
- random_artifact* ra_ptr = &random_artifacts[r];
+ auto ra_ptr = &random_artifacts[r];
o_ptr->sval = r;
o_ptr->pval2 = ra_ptr->activation;
@@ -1993,10 +2024,8 @@ static void finalize_randart(object_type* o_ptr, int lev)
ra_ptr->level = lev;
ra_ptr->generated = TRUE;
- flag = FALSE;
+ return;
}
-
- i++;
}
}
@@ -2020,7 +2049,7 @@ static void object_mention(object_type *o_ptr)
}
/* Random Artifact */
- else if (o_ptr->art_name)
+ else if (!o_ptr->artifact_name.empty())
{
msg_print("Random artifact");
}
@@ -2040,86 +2069,106 @@ static void object_mention(object_type *o_ptr)
}
}
-
-void random_artifact_resistance(object_type * o_ptr)
+static void random_artifact_power(object_type *o_ptr)
{
- bool_ give_resistance = FALSE, give_power = FALSE;
-
- switch (o_ptr->name1)
- {
- case ART_CELEBORN:
- case ART_ARVEDUI:
- case ART_CASPANION:
- case ART_TRON:
- case ART_ROHIRRIM:
- case ART_CELEGORM:
- case ART_ANARION:
- case ART_THRANDUIL:
- case ART_LUTHIEN:
- case ART_THROR:
- case ART_THORIN:
- case ART_NIMTHANC:
- case ART_DETHANC:
- case ART_NARTHANC:
- case ART_STING:
- case ART_TURMIL:
- case ART_THALKETTOTH:
- {
- /* Give a resistance */
- give_resistance = TRUE;
+ // Shorthand
+ auto flags = &o_ptr->art_flags;
+
+ // Choose ability
+ auto try_choose = [&o_ptr, &flags](int choice) {
+ switch (choice)
+ {
+ case 0:
+ (*flags) |= (TR_FEATHER);
+ break;
+ case 1:
+ (*flags) |= (TR_LITE1);
+ break;
+ case 2:
+ (*flags) |= (TR_SEE_INVIS);
+ break;
+ case 3:
+ (*flags) |= (ESP_ALL);
+ break;
+ case 4:
+ (*flags) |= (TR_SLOW_DIGEST);
+ break;
+ case 5:
+ (*flags) |= (TR_REGEN);
+ break;
+ case 6:
+ (*flags) |= (TR_FREE_ACT);
+ break;
+ case 7:
+ (*flags) |= (TR_HOLD_LIFE);
+ break;
}
- break;
- case ART_MAEDHROS:
- case ART_GLAMDRING:
- case ART_ORCRIST:
- case ART_ANDURIL:
- case ART_ZARCUTHRA:
- case ART_GURTHANG:
- case ART_HARADEKKET:
- case ART_CUBRAGOL:
- case ART_DAWN:
- {
- /* Give a resistance OR a power */
- if (randint(2) == 1) give_resistance = TRUE;
- else give_power = TRUE;
+ };
+
+ // Save old values for comparison
+ auto const old_flags = *flags;
+
+ // Choose an ability; make sure we choose one that isn't already chosen
+ for (int tries = 0; tries < 1000; tries++)
+ {
+ // Tentative choice
+ int choice = rand_int(8);
+ try_choose(choice);
+
+ // If there's any difference, then we've chosen a non-overlapping power.
+ if (*flags != old_flags)
+ {
+ break;
}
- break;
- case ART_NENYA:
- case ART_VILYA:
- case ART_BERUTHIEL:
- case ART_FINGOLFIN:
- case ART_THINGOL:
- case ART_ULMO:
- case ART_OLORIN:
+ }
+}
+
+void random_artifact_resistance(object_type * o_ptr)
+{
+ auto const &a_info = game->edit_data.a_info;
+
+ auto const art_flags = a_info[o_ptr->name1].flags;
+
+ // Check flags of the 'protype' artifact
+ auto give_resistance = bool(art_flags & TR_RANDOM_RESIST);
+ auto give_power = bool(art_flags & TR_RANDOM_POWER);
+ if (art_flags & TR_RANDOM_RES_OR_POWER)
+ {
+ if (randint(2) == 1)
{
- /* Give a power */
- give_power = TRUE;
+ give_resistance = true;
}
- break;
- case ART_POWER:
- case ART_GONDOR:
- case ART_AULE:
+ else
{
- /* Give both */
- give_power = TRUE;
- give_resistance = TRUE;
+ give_power = true;
}
- break;
}
+ // Grant a power?
if (give_power)
{
- o_ptr->xtra1 = EGO_XTRA_ABILITY;
-
- /* Randomize the "xtra" power */
- if (o_ptr->xtra1) o_ptr->xtra2 = randint(256);
+ random_artifact_power(o_ptr);
}
artifact_bias = 0;
if (give_resistance)
{
- random_resistance(o_ptr, FALSE, ((randint(22)) + 16));
+ // Save the *combined* pre-existing flags on the object;
+ // including any power we may have granted above.
+ auto const flags_before = art_flags | o_ptr->art_flags;
+
+ // We'll be a little generous here and make sure that the object
+ // gets a resistance that it doesn't actually already have.
+ for (int tries = 0; tries < 1000; tries++)
+ {
+ random_resistance(o_ptr, randint(22) + 16);
+ // Picked up new resistance?
+ if (flags_before != (art_flags | o_ptr->art_flags))
+ {
+ break;
+ }
+ }
}
}
@@ -2134,17 +2183,16 @@ void random_artifact_resistance(object_type * o_ptr)
*/
static bool_ make_artifact_special(object_type *o_ptr)
{
- int i;
- int k_idx = 0;
- u32b f1, f2, f3, f4, f5, esp;
+ auto const &k_info = game->edit_data.k_info;
+ auto const &a_info = game->edit_data.a_info;
/* No artifacts in the town */
if (!dun_level) return (FALSE);
/* Check the artifact list (just the "specials") */
- for (i = 0; i < max_a_idx; i++)
+ for (std::size_t i = 0; i < a_info.size(); i++)
{
- artifact_type *a_ptr = &a_info[i];
+ auto a_ptr = &a_info[i];
/* Skip "empty" artifacts */
if (!a_ptr->name) continue;
@@ -2153,10 +2201,10 @@ static bool_ make_artifact_special(object_type *o_ptr)
if (a_ptr->cur_num) continue;
/* Cannot generate non special ones */
- if (!(a_ptr->flags3 & TR3_INSTA_ART)) continue;
+ if (!(a_ptr->flags & TR_INSTA_ART)) continue;
/* Cannot generate some artifacts because they can only exists in special dungeons/quests/... */
- if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i])) continue;
+ if ((a_ptr->flags & TR_SPECIAL_GENE) && (!a_allow_special[i])) continue;
/* XXX XXX Enforce minimum "depth" (loosely) */
if (a_ptr->level > dun_level)
@@ -2172,7 +2220,7 @@ static bool_ make_artifact_special(object_type *o_ptr)
if (rand_int(a_ptr->rarity - luck( -(a_ptr->rarity / 2), a_ptr->rarity / 2)) != 0) continue;
/* Find the base object */
- k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
+ int k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
/* XXX XXX Enforce minimum "object" level (loosely) */
if (k_info[k_idx].level > object_level)
@@ -2191,13 +2239,12 @@ static bool_ make_artifact_special(object_type *o_ptr)
o_ptr->name1 = i;
/* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack give a basic exp/exp level to an object that needs it */
- if (f4 & TR4_LEVELS)
+ if (flags & TR_LEVELS)
{
- o_ptr->elevel = (k_info[k_idx].level / 10) + 1;
- o_ptr->exp = player_exp[o_ptr->elevel - 1];
+ init_obj_exp(o_ptr, &k_info[k_idx]);
}
/* Success */
@@ -2218,9 +2265,8 @@ static bool_ make_artifact_special(object_type *o_ptr)
*/
static bool_ make_artifact(object_type *o_ptr)
{
- int i;
- u32b f1, f2, f3, f4, f5, esp;
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto const &a_info = game->edit_data.a_info;
+ auto const &k_info = game->edit_data.k_info;
/* No artifacts in the town */
if (!dun_level) return (FALSE);
@@ -2229,9 +2275,9 @@ static bool_ make_artifact(object_type *o_ptr)
if (o_ptr->number != 1) return (FALSE);
/* Check the artifact list (skip the "specials") */
- for (i = 0; i < max_a_idx; i++)
+ for (std::size_t i = 0; i < a_info.size(); i++)
{
- artifact_type *a_ptr = &a_info[i];
+ auto a_ptr = &a_info[i];
/* Skip "empty" items */
if (!a_ptr->name) continue;
@@ -2240,10 +2286,10 @@ static bool_ make_artifact(object_type *o_ptr)
if (a_ptr->cur_num) continue;
/* Cannot generate special ones */
- if (a_ptr->flags3 & TR3_INSTA_ART) continue;
+ if (a_ptr->flags & TR_INSTA_ART) continue;
/* Cannot generate some artifacts because they can only exists in special dungeons/quests/... */
- if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i])) continue;
+ if ((a_ptr->flags & TR_SPECIAL_GENE) && (!a_allow_special[i])) continue;
/* Must have the correct fields */
if (a_ptr->tval != o_ptr->tval) continue;
@@ -2269,13 +2315,12 @@ static bool_ make_artifact(object_type *o_ptr)
random_artifact_resistance(o_ptr);
/* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack give a basic exp/exp level to an object that needs it */
- if (f4 & TR4_LEVELS)
+ if (flags & TR_LEVELS)
{
- o_ptr->elevel = (k_ptr->level / 10) + 1;
- o_ptr->exp = player_exp[o_ptr->elevel - 1];
+ init_obj_exp(o_ptr, &k_info[o_ptr->k_idx]);
}
/* Success */
@@ -2293,17 +2338,20 @@ static bool_ make_artifact(object_type *o_ptr)
*/
static bool_ make_ego_item(object_type *o_ptr, bool_ good)
{
+ auto const &k_info = game->edit_data.k_info;
+ auto const &e_info = game->edit_data.e_info;
+
bool_ ret = FALSE;
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto k_ptr = &k_info[o_ptr->k_idx];
if (artifact_p(o_ptr) || o_ptr->name2) return (FALSE);
std::vector<size_t> ok_ego;
/* Grab the ok ego */
- for (size_t i = 0; i < max_e_idx; i++)
+ for (size_t i = 0; i < e_info.size(); i++)
{
- ego_item_type *e_ptr = &e_info[i];
+ auto e_ptr = &e_info[i];
bool_ ok = FALSE;
/* Skip "empty" items */
@@ -2330,19 +2378,9 @@ static bool_ make_ego_item(object_type *o_ptr, bool_ good)
if ((!good) && e_ptr->cost) continue;
/* Must posses the good flags */
- if (((k_ptr->flags1 & e_ptr->need_flags1) != e_ptr->need_flags1) ||
- ((k_ptr->flags2 & e_ptr->need_flags2) != e_ptr->need_flags2) ||
- ((k_ptr->flags3 & e_ptr->need_flags3) != e_ptr->need_flags3) ||
- ((k_ptr->flags4 & e_ptr->need_flags4) != e_ptr->need_flags4) ||
- ((k_ptr->flags5 & e_ptr->need_flags5) != e_ptr->need_flags5) ||
- ((k_ptr->esp & e_ptr->need_esp) != e_ptr->need_esp))
+ if ((k_ptr->flags & e_ptr->need_flags) != e_ptr->need_flags)
continue;
- if ((k_ptr->flags1 & e_ptr->forbid_flags1) ||
- (k_ptr->flags2 & e_ptr->forbid_flags2) ||
- (k_ptr->flags3 & e_ptr->forbid_flags3) ||
- (k_ptr->flags4 & e_ptr->forbid_flags4) ||
- (k_ptr->flags5 & e_ptr->forbid_flags5) ||
- (k_ptr->esp & e_ptr->forbid_esp))
+ if (k_ptr->flags & e_ptr->forbid_flags)
continue;
/* ok */
@@ -2353,7 +2391,7 @@ static bool_ make_ego_item(object_type *o_ptr, bool_ good)
for (size_t i = 0; i < ok_ego.size() * 10; i++)
{
size_t j = ok_ego[rand_int(ok_ego.size())];
- ego_item_type *e_ptr = &e_info[j];
+ auto e_ptr = &e_info[j];
/* XXX XXX Enforce minimum "depth" (loosely) */
if (e_ptr->level > dun_level)
@@ -2392,7 +2430,7 @@ static bool_ make_ego_item(object_type *o_ptr, bool_ good)
for (size_t i = 0; i < ok_ego.size() * 10; i++)
{
int j = ok_ego[rand_int(ok_ego.size())]; // Explicit int conversion to avoid warning
- ego_item_type *e_ptr = &e_info[j];
+ auto e_ptr = &e_info[j];
/* Cannot be a double ego of the same ego type */
if (j == o_ptr->name2) continue;
@@ -2464,7 +2502,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power)
if (power > 1)
{
/* Make ego item */
- if ((rand_int(RANDART_WEAPON) == 1) && (o_ptr->tval != TV_TRAPKIT)) create_artifact(o_ptr, FALSE, TRUE);
+ if (rand_int(RANDART_WEAPON) == 1) create_artifact(o_ptr, FALSE, TRUE);
else make_ego_item(o_ptr, TRUE);
}
else if (power < -1)
@@ -2511,45 +2549,9 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power)
/* Some special cases */
switch (o_ptr->tval)
{
- case TV_TRAPKIT:
- {
- /* Good */
- if (power > 0) o_ptr->to_a += randint(5);
-
- /* Very good */
- if (power > 1) o_ptr->to_a += randint(5);
-
- /* Bad */
- if (power < 0) o_ptr->to_a -= randint(5);
-
- /* Very bad */
- if (power < -1) o_ptr->to_a -= randint(5);
-
- break;
- }
case TV_MSTAFF:
{
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))
- {
- int gf[2], i;
-
- for (i = 0; i < 2; i++)
- {
- int k = 0;
-
- gf[i] = 0;
- while (!k)
- {
- k = lookup_kind(TV_RUNE1, (gf[i] = rand_int(MAX_GF)));
- }
- }
-
- o_ptr->pval = gf[0] + (gf[1] << 16);
- o_ptr->pval3 = rand_int(RUNE_MOD_MAX) + (rand_int(RUNE_MOD_MAX) << 16);
- o_ptr->pval2 = randint(70) + (randint(70) << 8);
- }
- else
- o_ptr->art_flags5 |= (TR5_SPELL_CONTAIN | TR5_WIELD_CAST);
+ o_ptr->art_flags |= (TR_SPELL_CONTAIN | TR_WIELD_CAST);
break;
}
case TV_BOLT:
@@ -2587,9 +2589,9 @@ static void dragon_resist(object_type * o_ptr)
artifact_bias = 0;
if (randint(4) == 1)
- random_resistance(o_ptr, FALSE, ((randint(14)) + 4));
+ random_resistance(o_ptr, randint(14) + 4);
else
- random_resistance(o_ptr, FALSE, ((randint(22)) + 16));
+ random_resistance(o_ptr, randint(22) + 16);
}
while (randint(2) == 1);
}
@@ -2659,7 +2661,9 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
case TV_CLOAK:
{
if (o_ptr->sval == SV_ELVEN_CLOAK)
+ {
o_ptr->pval = randint(4); /* No cursed elven cloaks...? */
+ }
else if (o_ptr->sval == SV_MIMIC_CLOAK)
{
s32b mimic = find_random_mimic_shape(level, TRUE);
@@ -2673,7 +2677,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
rating += 30;
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
break;
}
@@ -2685,7 +2692,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
rating += 5;
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
dragon_resist(o_ptr);
}
break;
@@ -2698,7 +2708,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
rating += 5;
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
dragon_resist(o_ptr);
}
break;
@@ -2829,7 +2842,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
rating += 25;
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
break;
}
@@ -2838,7 +2854,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
{
do
{
- random_resistance(o_ptr, FALSE, ((randint(20)) + 18));
+ random_resistance(o_ptr, randint(20) + 18);
}
while (randint(4) == 1);
@@ -2848,25 +2864,6 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
}
break;
- /* Searching */
- case SV_RING_SEARCHING:
- {
- /* Bonus to searching */
- o_ptr->pval = 1 + m_bonus(5, level);
-
- /* Cursed */
- if (power < 0)
- {
- /* Cursed */
- o_ptr->ident |= (IDENT_CURSED);
-
- /* Reverse pval */
- o_ptr->pval = 0 - (o_ptr->pval);
- }
-
- break;
- }
-
/* Flames, Acid, Ice */
case SV_RING_FLAMES:
case SV_RING_ACID:
@@ -2997,7 +2994,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
o_ptr->pval = 1 + m_bonus(3, level);
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
break;
}
@@ -3009,7 +3009,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
o_ptr->to_d = 1 + m_bonus(5, level);
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
break;
}
@@ -3065,41 +3068,26 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
case SV_AMULET_RESISTANCE:
{
- if (randint(3) == 1) random_resistance(o_ptr, FALSE, ((randint(34)) + 4));
- if (randint(5) == 1) o_ptr->art_flags2 |= TR2_RES_POIS;
+ if (randint(3) == 1) random_resistance(o_ptr, randint(34) + 4);
+ if (randint(5) == 1) o_ptr->art_flags |= TR_RES_POIS;
}
break;
- /* Amulet of searching */
- case SV_AMULET_SEARCHING:
- {
- o_ptr->pval = randint(5) + m_bonus(5, level);
-
- /* Cursed */
- if (power < 0)
- {
- /* Cursed */
- o_ptr->ident |= (IDENT_CURSED);
-
- /* Reverse bonuses */
- o_ptr->pval = 0 - (o_ptr->pval);
- }
-
- break;
- }
-
/* Amulet of the Magi -- never cursed */
case SV_AMULET_THE_MAGI:
{
o_ptr->pval = 1 + m_bonus(3, level);
- if (randint(3) == 1) o_ptr->art_flags3 |= TR3_SLOW_DIGEST;
+ if (randint(3) == 1) o_ptr->art_flags |= TR_SLOW_DIGEST;
/* Boost the rating */
rating += 25;
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
break;
}
@@ -3174,9 +3162,11 @@ static int get_stick_max_level(byte tval, int level, int spl)
*/
static void a_m_aux_4(object_type *o_ptr, int level, int power)
{
- u32b f1, f2, f3, f4, f5, esp;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+
s32b bonus_lvl, max_lvl;
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Very good */
if (power > 1)
@@ -3223,12 +3213,15 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
case TV_LITE:
{
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack -- random fuel */
- if (f4 & TR4_FUEL_LITE)
+ if (flags & TR_FUEL_LITE)
{
- if (k_info[o_ptr->k_idx].pval2 > 0) o_ptr->timeout = randint(k_info[o_ptr->k_idx].pval2);
+ if (k_info[o_ptr->k_idx].pval2 > 0)
+ {
+ o_ptr->timeout = randint(k_info[o_ptr->k_idx].pval2);
+ }
}
break;
@@ -3237,14 +3230,18 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
case TV_CORPSE:
{
/* Hack -- choose a monster */
- monster_race* r_ptr;
int r_idx = get_mon_num(dun_level);
- r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
- if (!(r_ptr->flags1 & RF1_UNIQUE))
+ if (!(r_ptr->flags & RF_UNIQUE))
+ {
o_ptr->pval2 = r_idx;
+ }
else
+ {
o_ptr->pval2 = 2;
+ }
+
o_ptr->pval3 = 0;
break;
}
@@ -3252,25 +3249,28 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
case TV_EGG:
{
/* Hack -- choose a monster */
- monster_race* r_ptr;
int r_idx, count = 0;
bool_ OK = FALSE;
while ((!OK) && (count < 1000))
{
r_idx = get_mon_num(dun_level);
- r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
- if (r_ptr->flags9 & RF9_HAS_EGG)
+ if (r_ptr->flags & RF_HAS_EGG)
{
o_ptr->pval2 = r_idx;
OK = TRUE;
}
count++;
}
- if (count == 1000) o_ptr->pval2 = 940; /* Blue fire-lizard */
- r_ptr = &r_info[o_ptr->pval2];
+ if (count == 1000)
+ {
+ o_ptr->pval2 = 940; /* Blue fire-lizard */
+ }
+
+ auto r_ptr = &r_info[o_ptr->pval2];
o_ptr->weight = (r_ptr->weight + rand_int(r_ptr->weight) / 100) + 1;
o_ptr->pval = r_ptr->weight * 3 + rand_int(r_ptr->weight) + 1;
break;
@@ -3279,11 +3279,10 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
case TV_HYPNOS:
{
/* Hack -- choose a monster */
- monster_race* r_ptr;
int r_idx = get_mon_num(dun_level);
- r_ptr = &r_info[r_idx];
+ auto r_ptr = &r_info[r_idx];
- if (!(r_ptr->flags1 & RF1_NEVER_MOVE))
+ if (!(r_ptr->flags & RF_NEVER_MOVE))
o_ptr->pval = r_idx;
else
o_ptr->pval = 20;
@@ -3364,9 +3363,6 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
/* Hack -- skip ruined chests */
if (k_info[o_ptr->k_idx].level <= 0) break;
- /* Pick a trap */
- place_trap_object(o_ptr);
-
/* Hack - set pval2 to the number of objects in it */
if (o_ptr->pval)
o_ptr->pval2 = (o_ptr->sval % SV_CHEST_MIN_LARGE) * 2;
@@ -3378,7 +3374,10 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
/* Rating boost */
rating += 25;
/* Mention the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
}
break;
case TV_POTION2:
@@ -3426,153 +3425,137 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
}
}
-void trap_hack(object_type *o_ptr)
-{
- if (o_ptr->tval != TV_TRAPKIT) return;
-
- switch (o_ptr->sval)
- {
- case SV_TRAPKIT_POTION:
- case SV_TRAPKIT_SCROLL:
- case SV_TRAPKIT_DEVICE:
- o_ptr->to_h = 0;
- o_ptr->to_d = 0;
- default:
- return;
- }
-}
-
/* Add a random glag to the ego item */
-void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows)
+void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows)
{
- if (fego & ETR4_SUSTAIN)
+ if (fego & ETR_SUSTAIN)
{
/* Make a random sustain */
switch (randint(6))
{
case 1:
- o_ptr->art_flags2 |= TR2_SUST_STR;
+ o_ptr->art_flags |= TR_SUST_STR;
break;
case 2:
- o_ptr->art_flags2 |= TR2_SUST_INT;
+ o_ptr->art_flags |= TR_SUST_INT;
break;
case 3:
- o_ptr->art_flags2 |= TR2_SUST_WIS;
+ o_ptr->art_flags |= TR_SUST_WIS;
break;
case 4:
- o_ptr->art_flags2 |= TR2_SUST_DEX;
+ o_ptr->art_flags |= TR_SUST_DEX;
break;
case 5:
- o_ptr->art_flags2 |= TR2_SUST_CON;
+ o_ptr->art_flags |= TR_SUST_CON;
break;
case 6:
- o_ptr->art_flags2 |= TR2_SUST_CHR;
+ o_ptr->art_flags |= TR_SUST_CHR;
break;
}
}
- if (fego & ETR4_OLD_RESIST)
+ if (fego & ETR_OLD_RESIST)
{
/* Make a random resist, equal probabilities */
switch (randint(11))
{
case 1:
- o_ptr->art_flags2 |= (TR2_RES_BLIND);
+ o_ptr->art_flags |= TR_RES_BLIND;
break;
case 2:
- o_ptr->art_flags2 |= (TR2_RES_CONF);
+ o_ptr->art_flags |= TR_RES_CONF;
break;
case 3:
- o_ptr->art_flags2 |= (TR2_RES_SOUND);
+ o_ptr->art_flags |= TR_RES_SOUND;
break;
case 4:
- o_ptr->art_flags2 |= (TR2_RES_SHARDS);
+ o_ptr->art_flags |= TR_RES_SHARDS;
break;
case 5:
- o_ptr->art_flags2 |= (TR2_RES_NETHER);
+ o_ptr->art_flags |= TR_RES_NETHER;
break;
case 6:
- o_ptr->art_flags2 |= (TR2_RES_NEXUS);
+ o_ptr->art_flags |= TR_RES_NEXUS;
break;
case 7:
- o_ptr->art_flags2 |= (TR2_RES_CHAOS);
+ o_ptr->art_flags |= TR_RES_CHAOS;
break;
case 8:
- o_ptr->art_flags2 |= (TR2_RES_DISEN);
+ o_ptr->art_flags |= TR_RES_DISEN;
break;
case 9:
- o_ptr->art_flags2 |= (TR2_RES_POIS);
+ o_ptr->art_flags |= TR_RES_POIS;
break;
case 10:
- o_ptr->art_flags2 |= (TR2_RES_DARK);
+ o_ptr->art_flags |= TR_RES_DARK;
break;
case 11:
- o_ptr->art_flags2 |= (TR2_RES_LITE);
+ o_ptr->art_flags |= TR_RES_LITE;
break;
}
}
- if (fego & ETR4_ABILITY)
+ if (fego & ETR_ABILITY)
{
/* Choose an ability */
switch (randint(8))
{
case 1:
- o_ptr->art_flags3 |= (TR3_FEATHER);
+ o_ptr->art_flags |= TR_FEATHER;
break;
case 2:
- o_ptr->art_flags3 |= (TR3_LITE1);
+ o_ptr->art_flags |= TR_LITE1;
break;
case 3:
- o_ptr->art_flags3 |= (TR3_SEE_INVIS);
+ o_ptr->art_flags |= TR_SEE_INVIS;
break;
case 4:
- o_ptr->art_esp |= (ESP_ALL);
+ o_ptr->art_flags |= ESP_ALL;
break;
case 5:
- o_ptr->art_flags3 |= (TR3_SLOW_DIGEST);
+ o_ptr->art_flags |= TR_SLOW_DIGEST;
break;
case 6:
- o_ptr->art_flags3 |= (TR3_REGEN);
+ o_ptr->art_flags |= TR_REGEN;
break;
case 7:
- o_ptr->art_flags2 |= (TR2_FREE_ACT);
+ o_ptr->art_flags |= TR_FREE_ACT;
break;
case 8:
- o_ptr->art_flags2 |= (TR2_HOLD_LIFE);
+ o_ptr->art_flags |= TR_HOLD_LIFE;
break;
}
}
- if (fego & ETR4_R_ELEM)
+ if (fego & ETR_R_ELEM)
{
/* Make an acid/elec/fire/cold/poison resist */
- random_resistance(o_ptr, FALSE, randint(14) + 4);
+ random_resistance(o_ptr, randint(14) + 4);
}
- if (fego & ETR4_R_LOW)
+ if (fego & ETR_R_LOW)
{
/* Make an acid/elec/fire/cold resist */
- random_resistance(o_ptr, FALSE, randint(12) + 4);
+ random_resistance(o_ptr, randint(12) + 4);
}
- if (fego & ETR4_R_HIGH)
+ if (fego & ETR_R_HIGH)
{
/* Make a high resist */
- random_resistance(o_ptr, FALSE, randint(22) + 16);
+ random_resistance(o_ptr, randint(22) + 16);
}
- if (fego & ETR4_R_ANY)
+ if (fego & ETR_R_ANY)
{
/* Make any resist */
- random_resistance(o_ptr, FALSE, randint(34) + 4);
+ random_resistance(o_ptr, randint(34) + 4);
}
- if (fego & ETR4_R_DRAGON)
+ if (fego & ETR_R_DRAGON)
{
/* Make "dragon resist" */
dragon_resist(o_ptr);
}
- if (fego & ETR4_SLAY_WEAP)
+ if (fego & ETR_SLAY_WEAP)
{
/* Make a Weapon of Slaying */
@@ -3593,254 +3576,251 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows)
}
if (randint(5) == 1)
{
- o_ptr->art_flags1 |= TR1_BRAND_POIS;
+ o_ptr->art_flags |= TR_BRAND_POIS;
}
if (o_ptr->tval == TV_SWORD && (randint(3) == 1))
{
- o_ptr->art_flags1 |= TR1_VORPAL;
+ o_ptr->art_flags |= TR_VORPAL;
}
}
- if (fego & ETR4_DAM_DIE)
+ if (fego & ETR_DAM_DIE)
{
/* Increase damage dice */
o_ptr->dd++;
}
- if (fego & ETR4_DAM_SIZE)
+ if (fego & ETR_DAM_SIZE)
{
/* Increase damage dice size */
o_ptr->ds++;
}
- if (fego & ETR4_LIMIT_BLOWS)
+ if (fego & ETR_LIMIT_BLOWS)
{
/* Swap this flag */
*limit_blows = !(*limit_blows);
}
- if (fego & ETR4_PVAL_M1)
+ if (fego & ETR_PVAL_M1)
{
/* Increase pval */
o_ptr->pval++;
}
- if (fego & ETR4_PVAL_M2)
+ if (fego & ETR_PVAL_M2)
{
/* Increase pval */
o_ptr->pval += m_bonus(2, dun_level);
}
- if (fego & ETR4_PVAL_M3)
+ if (fego & ETR_PVAL_M3)
{
/* Increase pval */
o_ptr->pval += m_bonus(3, dun_level);
}
- if (fego & ETR4_PVAL_M5)
+ if (fego & ETR_PVAL_M5)
{
/* Increase pval */
o_ptr->pval += m_bonus(5, dun_level);
}
- if (fego & ETR4_AC_M1)
+ if (fego & ETR_AC_M1)
{
/* Increase ac */
o_ptr->to_a++;
}
- if (fego & ETR4_AC_M2)
+ if (fego & ETR_AC_M2)
{
/* Increase ac */
o_ptr->to_a += m_bonus(2, dun_level);
}
- if (fego & ETR4_AC_M3)
+ if (fego & ETR_AC_M3)
{
/* Increase ac */
o_ptr->to_a += m_bonus(3, dun_level);
}
- if (fego & ETR4_AC_M5)
+ if (fego & ETR_AC_M5)
{
/* Increase ac */
o_ptr->to_a += m_bonus(5, dun_level);
}
- if (fego & ETR4_TH_M1)
+ if (fego & ETR_TH_M1)
{
/* Increase to hit */
o_ptr->to_h++;
}
- if (fego & ETR4_TH_M2)
+ if (fego & ETR_TH_M2)
{
/* Increase to hit */
o_ptr->to_h += m_bonus(2, dun_level);
}
- if (fego & ETR4_TH_M3)
+ if (fego & ETR_TH_M3)
{
/* Increase to hit */
o_ptr->to_h += m_bonus(3, dun_level);
}
- if (fego & ETR4_TH_M5)
+ if (fego & ETR_TH_M5)
{
/* Increase to hit */
o_ptr->to_h += m_bonus(5, dun_level);
}
- if (fego & ETR4_TD_M1)
+ if (fego & ETR_TD_M1)
{
/* Increase to dam */
o_ptr->to_d++;
}
- if (fego & ETR4_TD_M2)
+ if (fego & ETR_TD_M2)
{
/* Increase to dam */
o_ptr->to_d += m_bonus(2, dun_level);
}
- if (fego & ETR4_TD_M3)
+ if (fego & ETR_TD_M3)
{
/* Increase to dam */
o_ptr->to_d += m_bonus(3, dun_level);
}
- if (fego & ETR4_TD_M5)
+ if (fego & ETR_TD_M5)
{
/* Increase to dam */
o_ptr->to_d += m_bonus(5, dun_level);
}
- if (fego & ETR4_R_P_ABILITY)
+ if (fego & ETR_R_P_ABILITY)
{
/* Add a random pval-affected ability */
/* This might cause boots with + to blows */
- switch (randint(6))
+ switch (randint(5))
{
case 1:
- o_ptr->art_flags1 |= TR1_STEALTH;
+ o_ptr->art_flags |= TR_STEALTH;
break;
case 2:
- o_ptr->art_flags1 |= TR1_SEARCH;
+ o_ptr->art_flags |= TR_INFRA;
break;
case 3:
- o_ptr->art_flags1 |= TR1_INFRA;
+ o_ptr->art_flags |= TR_TUNNEL;
break;
case 4:
- o_ptr->art_flags1 |= TR1_TUNNEL;
+ o_ptr->art_flags |= TR_SPEED;
break;
case 5:
- o_ptr->art_flags1 |= TR1_SPEED;
- break;
- case 6:
- o_ptr->art_flags1 |= TR1_BLOWS;
+ o_ptr->art_flags |= TR_BLOWS;
break;
}
}
- if (fego & ETR4_R_STAT)
+ if (fego & ETR_R_STAT)
{
/* Add a random stat */
switch (randint(6))
{
case 1:
- o_ptr->art_flags1 |= TR1_STR;
+ o_ptr->art_flags |= TR_STR;
break;
case 2:
- o_ptr->art_flags1 |= TR1_INT;
+ o_ptr->art_flags |= TR_INT;
break;
case 3:
- o_ptr->art_flags1 |= TR1_WIS;
+ o_ptr->art_flags |= TR_WIS;
break;
case 4:
- o_ptr->art_flags1 |= TR1_DEX;
+ o_ptr->art_flags |= TR_DEX;
break;
case 5:
- o_ptr->art_flags1 |= TR1_CON;
+ o_ptr->art_flags |= TR_CON;
break;
case 6:
- o_ptr->art_flags1 |= TR1_CHR;
+ o_ptr->art_flags |= TR_CHR;
break;
}
}
- if (fego & ETR4_R_STAT_SUST)
+ if (fego & ETR_R_STAT_SUST)
{
/* Add a random stat and sustain it */
switch (randint(6))
{
case 1:
{
- o_ptr->art_flags1 |= TR1_STR;
- o_ptr->art_flags2 |= TR2_SUST_STR;
+ o_ptr->art_flags |= TR_STR;
+ o_ptr->art_flags |= TR_SUST_STR;
break;
}
case 2:
{
- o_ptr->art_flags1 |= TR1_INT;
- o_ptr->art_flags2 |= TR2_SUST_INT;
+ o_ptr->art_flags |= TR_INT;
+ o_ptr->art_flags |= TR_SUST_INT;
break;
}
case 3:
{
- o_ptr->art_flags1 |= TR1_WIS;
- o_ptr->art_flags2 |= TR2_SUST_WIS;
+ o_ptr->art_flags |= TR_WIS;
+ o_ptr->art_flags |= TR_SUST_WIS;
break;
}
case 4:
{
- o_ptr->art_flags1 |= TR1_DEX;
- o_ptr->art_flags2 |= TR2_SUST_DEX;
+ o_ptr->art_flags |= TR_DEX;
+ o_ptr->art_flags |= TR_SUST_DEX;
break;
}
case 5:
{
- o_ptr->art_flags1 |= TR1_CON;
- o_ptr->art_flags2 |= TR2_SUST_CON;
+ o_ptr->art_flags |= TR_CON;
+ o_ptr->art_flags |= TR_SUST_CON;
break;
}
case 6:
{
- o_ptr->art_flags1 |= TR1_CHR;
- o_ptr->art_flags2 |= TR2_SUST_CHR;
+ o_ptr->art_flags |= TR_CHR;
+ o_ptr->art_flags |= TR_SUST_CHR;
break;
}
}
}
- if (fego & ETR4_R_IMMUNITY)
+ if (fego & ETR_R_IMMUNITY)
{
/* Give a random immunity */
switch (randint(4))
{
case 1:
{
- o_ptr->art_flags2 |= TR2_IM_FIRE;
- o_ptr->art_flags3 |= TR3_IGNORE_FIRE;
+ o_ptr->art_flags |= TR_IM_FIRE;
+ o_ptr->art_flags |= TR_IGNORE_FIRE;
break;
}
case 2:
{
- o_ptr->art_flags2 |= TR2_IM_ACID;
- o_ptr->art_flags3 |= TR3_IGNORE_ACID;
+ o_ptr->art_flags |= TR_IM_ACID;
+ o_ptr->art_flags |= TR_IGNORE_ACID;
break;
}
case 3:
{
- o_ptr->art_flags2 |= TR2_IM_ELEC;
- o_ptr->art_flags3 |= TR3_IGNORE_ELEC;
+ o_ptr->art_flags |= TR_IM_ELEC;
+ o_ptr->art_flags |= TR_IGNORE_ELEC;
break;
}
case 4:
{
- o_ptr->art_flags2 |= TR2_IM_COLD;
- o_ptr->art_flags3 |= TR3_IGNORE_COLD;
+ o_ptr->art_flags |= TR_IM_COLD;
+ o_ptr->art_flags |= TR_IGNORE_COLD;
break;
}
}
@@ -3880,30 +3860,29 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows)
*/
void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional<int> force_power)
{
- int i, rolls, f1, f2, power;
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+ auto const &e_info = game->edit_data.e_info;
+
+ int i, rolls;
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Aply luck */
lev += luck( -7, 7);
- /* Spell in it ? no ! */
- if (k_ptr->flags5 & TR5_SPELL_CONTAIN)
+ /* Spell in it? No! */
+ if (k_ptr->flags & TR_SPELL_CONTAIN)
o_ptr->pval2 = -1;
/* Important to do before all else, be sure to have the basic obvious flags set */
- o_ptr->art_oflags1 = k_ptr->oflags1;
- o_ptr->art_oflags2 = k_ptr->oflags2;
- o_ptr->art_oflags3 = k_ptr->oflags3;
- o_ptr->art_oflags4 = k_ptr->oflags4;
- o_ptr->art_oflags5 = k_ptr->oflags5;
- o_ptr->art_oesp = k_ptr->oesp;
+ o_ptr->art_oflags = k_ptr->oflags;
/* No need to touch normal artifacts */
- if (k_ptr->flags3 & TR3_NORM_ART)
+ if (k_ptr->flags & TR_NORM_ART)
{
/* Ahah! we tried to trick us !! */
if (k_ptr->artifact ||
- ((k_ptr->flags4 & TR4_SPECIAL_GENE) &&
+ ((k_ptr->flags & TR_SPECIAL_GENE) &&
(!k_allow_special[o_ptr->k_idx])))
{
object_prep(o_ptr, lookup_kind(k_ptr->btval, k_ptr->bsval));
@@ -3933,7 +3912,10 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea
k_ptr->artifact = TRUE;
- if (cheat_peek || p_ptr->precognition) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
}
return;
@@ -3942,47 +3924,49 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea
/* Maximum "level" for various things */
if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
+ /* Roll for power */
+ int power = 0;
+ {
+ /* Base chance of being "good" */
+ int f1 = lev + 10 + luck( -15, 15);
- /* Base chance of being "good" */
- f1 = lev + 10 + luck( -15, 15);
-
- /* Maximal chance of being "good" */
- if (f1 > 75) f1 = 75;
-
- /* Base chance of being "great" */
- f2 = f1 / 2;
+ /* Maximal chance of being "good" */
+ if (f1 > 75) f1 = 75;
- /* Maximal chance of being "great" */
- if (f2 > 20) f2 = 20;
+ /* Base chance of being "great" */
+ int f2 = f1 / 2;
+ /* Maximal chance of being "great" */
+ if (f2 > 20) f2 = 20;
- /* Assume normal */
- power = 0;
+ /* Assume normal */
+ power = 0;
- /* Roll for "good" */
- if (good || magik(f1))
- {
- /* Assume "good" */
- power = 1;
+ /* Roll for "good" */
+ if (good || magik(f1))
+ {
+ /* Assume "good" */
+ power = 1;
- /* Roll for "great" */
- if (great || magik(f2)) power = 2;
- }
+ /* Roll for "great" */
+ if (great || magik(f2)) power = 2;
+ }
- /* Roll for "cursed" */
- else if (magik(f1))
- {
- /* Assume "cursed" */
- power = -1;
+ /* Roll for "cursed" */
+ else if (magik(f1))
+ {
+ /* Assume "cursed" */
+ power = -1;
- /* Roll for "broken" */
- if (magik(f2)) power = -2;
- }
+ /* Roll for "broken" */
+ if (magik(f2)) power = -2;
+ }
- /* Override power with parameter? */
- if (auto power_override = force_power)
- {
- power = *power_override;
+ /* Override power with parameter? */
+ if (auto power_override = force_power)
+ {
+ power = *power_override;
+ }
}
/* Assume no rolls */
@@ -4017,7 +4001,7 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea
/* Hack -- analyze artifacts */
if (o_ptr->name1)
{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
+ auto a_ptr = &a_info[o_ptr->name1];
/* Hack -- Mark the artifact as "created" */
a_ptr->cur_num = 1;
@@ -4034,7 +4018,7 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea
o_ptr->number = 1;
/* Hack -- extract the "cursed" flag */
- if (a_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
+ if (a_ptr->flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED);
/* Mega-Hack -- increase the rating */
rating += 10;
@@ -4046,17 +4030,19 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea
good_item_flag = TRUE;
/* Cheat -- peek at the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
- /* Spell in it ? no ! */
- if (a_ptr->flags5 & TR5_SPELL_CONTAIN)
+ /* Spell in it? No! */
+ if (a_ptr->flags & TR_SPELL_CONTAIN)
o_ptr->pval2 = -1;
/* Give a basic exp/exp level to an artifact that needs it */
- if (a_ptr->flags4 & TR4_LEVELS)
+ if (a_ptr->flags & TR_LEVELS)
{
- o_ptr->elevel = (k_ptr->level / 10) + 1;
- o_ptr->exp = player_exp[o_ptr->elevel - 1];
+ init_obj_exp(o_ptr, k_ptr);
}
/* Done */
@@ -4082,7 +4068,6 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea
case TV_SHOT:
case TV_ARROW:
case TV_BOLT:
- case TV_TRAPKIT:
{
if (power) a_m_aux_1(o_ptr, lev, power);
break;
@@ -4131,22 +4116,23 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea
}
}
- if (o_ptr->art_name) rating += 40;
+ if (!o_ptr->artifact_name.empty())
+ {
+ rating += 40;
+ }
/* Hack -- analyze ego-items */
else if (o_ptr->name2)
{
- ego_item_type *e_ptr;
int j;
bool_ limit_blows = FALSE;
- u32b f1, f2, f3, f4, f5, esp;
s16b e_idx;
e_idx = o_ptr->name2;
/* Ok now, THAT is truly ugly */
try_an_other_ego:
- e_ptr = &e_info[e_idx];
+ auto e_ptr = &e_info[e_idx];
/* Hack -- extra powers */
for (j = 0; j < FLAG_RARITY_MAX; j++)
@@ -4154,35 +4140,23 @@ try_an_other_ego:
/* Rarity check */
if (magik(e_ptr->rar[j]))
{
- o_ptr->art_flags1 |= e_ptr->flags1[j];
- o_ptr->art_flags2 |= e_ptr->flags2[j];
- o_ptr->art_flags3 |= e_ptr->flags3[j];
- o_ptr->art_flags4 |= e_ptr->flags4[j];
- o_ptr->art_flags5 |= e_ptr->flags5[j];
- o_ptr->art_esp |= e_ptr->esp[j];
-
- o_ptr->art_oflags1 |= e_ptr->oflags1[j];
- o_ptr->art_oflags2 |= e_ptr->oflags2[j];
- o_ptr->art_oflags3 |= e_ptr->oflags3[j];
- o_ptr->art_oflags4 |= e_ptr->oflags4[j];
- o_ptr->art_oflags5 |= e_ptr->oflags5[j];
- o_ptr->art_oesp |= e_ptr->oesp[j];
-
+ o_ptr->art_flags |= e_ptr->flags[j];
+ o_ptr->art_oflags |= e_ptr->oflags[j];
add_random_ego_flag(o_ptr, e_ptr->fego[j], &limit_blows);
}
}
/* No insane number of blows */
- if (limit_blows && (o_ptr->art_flags1 & TR1_BLOWS))
+ if (limit_blows && (o_ptr->art_flags & TR_BLOWS))
{
if (o_ptr->pval > 2) o_ptr->pval = randint(2);
}
/* get flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack -- acquire "cursed" flag */
- if (f3 & TR3_CURSED) o_ptr->ident |= (IDENT_CURSED);
+ if (flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED);
/* Hack -- obtain bonuses */
if (e_ptr->max_to_h > 0) o_ptr->to_h += randint(e_ptr->max_to_h);
@@ -4205,53 +4179,41 @@ try_an_other_ego:
goto try_an_other_ego;
}
- /* Spell in it ? no ! */
- if (f5 & TR5_SPELL_CONTAIN)
+ /* Spell in it ? No! */
+ if (flags & TR_SPELL_CONTAIN)
{
- /* Mega hack, mage staves of spell cannot SPELL_CONTAIN */
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))
- {
- o_ptr->art_flags5 &= ~TR5_SPELL_CONTAIN;
- }
- else
- o_ptr->pval2 = -1;
+ o_ptr->pval2 = -1;
}
/* Cheat -- describe the item */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(o_ptr);
+ }
}
/* Examine real objects */
if (o_ptr->k_idx)
{
- u32b f1, f2, f3, f4, f5, esp;
-
object_kind *k_ptr = &k_info[o_ptr->k_idx];
/* Hack -- acquire "cursed" flag */
- if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
+ if (k_ptr->flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED);
/* Extract some flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack give a basic exp/exp level to an object that needs it */
- if (f4 & TR4_LEVELS)
+ if (flags & TR_LEVELS)
{
- o_ptr->elevel = (k_ptr->level / 10) + 1;
- o_ptr->exp = player_exp[o_ptr->elevel - 1];
+ init_obj_exp(o_ptr, k_ptr);
}
- /* Spell in it ? no ! */
- if (f5 & TR5_SPELL_CONTAIN)
+ /* Spell in it ? No! */
+ if (flags & TR_SPELL_CONTAIN)
{
- /* Mega hack, mage staves of spell cannot SPELL_CONTAIN */
- if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))
- {
- o_ptr->art_flags5 &= ~TR5_SPELL_CONTAIN;
- }
- else
- o_ptr->pval2 = -1;
+ o_ptr->pval2 = -1;
}
/* Hacccccccckkkkk attack ! :) -- To prevent som ugly crashs */
@@ -4264,64 +4226,62 @@ try_an_other_ego:
if (o_ptr->tval == TV_ROD_MAIN)
{
/* Set the max mana and the current mana */
- o_ptr->pval2 = (f4 & TR4_CAPACITY) ? o_ptr->sval * 2 : o_ptr->sval;
+ o_ptr->pval2 = (flags & TR_CAPACITY) ? o_ptr->sval * 2 : o_ptr->sval;
o_ptr->timeout = o_ptr->pval2;
}
-
- /* Remove some unnecessary stuff hack */
- if (o_ptr->tval == TV_TRAPKIT) trap_hack(o_ptr);
}
}
/* The themed objects to use */
-static obj_theme match_theme;
+static obj_theme *match_theme = nullptr;
/*
* XXX XXX XXX It relies on the fact that obj_theme is a four byte structure
* for its efficient operation. A horrendous hack, I'd say.
*/
-void init_match_theme(obj_theme const &theme)
+bool init_match_theme(obj_theme const &theme)
{
- /* Save the theme */
- match_theme = theme;
+ if (match_theme == nullptr)
+ {
+ match_theme = new obj_theme(theme);
+ return true;
+ }
+ else if (*match_theme != theme)
+ {
+ *match_theme = theme;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
}
/*
- * Ditto XXX XXX XXX
+ * Maga-Hack -- match certain types of object only.
*/
-static bool_ theme_changed(obj_theme theme)
+static bool kind_is_theme(obj_theme const *theme, int k_idx)
{
- /* Any of the themes has been changed */
- if (theme.treasure != match_theme.treasure) return (TRUE);
- if (theme.combat != match_theme.combat) return (TRUE);
- if (theme.magic != match_theme.magic) return (TRUE);
- if (theme.tools != match_theme.tools) return (TRUE);
+ auto const &k_info = game->edit_data.k_info;
- /* No changes */
- return (FALSE);
-}
+ assert(theme != nullptr);
-
-/*
- * Maga-Hack -- match certain types of object only.
- */
-static bool kind_is_theme(int k_idx)
-{
- object_kind *k_ptr = &k_info[k_idx];
+ auto k_ptr = &k_info[k_idx];
s32b prob = 0;
-
/*
* Paranoia -- Prevent accidental "(Nothing)"
* that are results of uninitialised theme structs.
*
* Caution: Junks go into the allocation table.
*/
- if (match_theme.treasure + match_theme.combat +
- match_theme.magic + match_theme.tools == 0) return (TRUE);
+ if (theme->treasure + theme->combat + theme->magic + theme->tools == 0)
+ {
+ return TRUE;
+ }
/* Pick probability to use */
@@ -4340,151 +4300,141 @@ static bool kind_is_theme(int k_idx)
* larger than theme components, or we would see
* unexpected, well, junks.
*/
- prob = 100 - (match_theme.treasure + match_theme.combat +
- match_theme.magic + match_theme.tools);
+ prob = 100 - (theme->treasure + theme->combat +
+ theme->magic + theme->tools);
break;
}
case TV_CHEST:
- prob = match_theme.treasure;
+ prob = theme->treasure;
break;
case TV_CROWN:
- prob = match_theme.treasure;
+ prob = theme->treasure;
break;
case TV_DRAG_ARMOR:
- prob = match_theme.treasure;
+ prob = theme->treasure;
break;
case TV_AMULET:
- prob = match_theme.treasure;
+ prob = theme->treasure;
break;
case TV_RING:
- prob = match_theme.treasure;
+ prob = theme->treasure;
break;
case TV_SHOT:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_ARROW:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_BOLT:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_BOOMERANG:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_BOW:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_HAFTED:
- // FIXME: These cases can be shortened drastically
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_POLEARM:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_SWORD:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_AXE:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_GLOVES:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_HELM:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_SHIELD:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_SOFT_ARMOR:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_HARD_ARMOR:
- prob = match_theme.combat;
+ prob = theme->combat;
break;
case TV_MSTAFF:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_STAFF:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_WAND:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_ROD:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_ROD_MAIN:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_SCROLL:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_PARCHMENT:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_POTION:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_POTION2:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_RANDART:
- prob = match_theme.magic;
- break;
- case TV_RUNE1:
- prob = match_theme.magic;
- break;
- case TV_RUNE2:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_BOOK:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_SYMBIOTIC_BOOK:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_MUSIC_BOOK:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_DRUID_BOOK:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_DAEMON_BOOK:
- prob = match_theme.magic;
+ prob = theme->magic;
break;
case TV_LITE:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_CLOAK:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_BOOTS:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_SPIKE:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_DIGGING:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_FLASK:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_FOOD:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_TOOL:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
case TV_INSTRUMENT:
- prob = match_theme.tools;
- break;
- case TV_TRAPKIT:
- prob = match_theme.tools;
+ prob = theme->tools;
break;
}
@@ -4500,18 +4450,20 @@ static bool kind_is_theme(int k_idx)
*/
bool_ kind_is_legal(int k_idx)
{
- object_kind *k_ptr = &k_info[k_idx];
+ auto const &k_info = game->edit_data.k_info;
+
+ auto k_ptr = &k_info[k_idx];
- if (!kind_is_theme(k_idx)) return FALSE;
+ if (!kind_is_theme(match_theme, k_idx)) return FALSE;
- if (k_ptr->flags4 & TR4_SPECIAL_GENE)
+ if (k_ptr->flags & TR_SPECIAL_GENE)
{
if (k_allow_special[k_idx]) return TRUE;
else return FALSE;
}
/* No 2 times the same normal artifact */
- if ((k_ptr->flags3 & TR3_NORM_ART) && (k_ptr->artifact))
+ if ((k_ptr->flags & TR_NORM_ART) && (k_ptr->artifact))
{
return FALSE;
}
@@ -4544,7 +4496,9 @@ bool_ kind_is_legal(int k_idx)
*/
static bool_ kind_is_good(int k_idx)
{
- object_kind *k_ptr = &k_info[k_idx];
+ auto const &k_info = game->edit_data.k_info;
+
+ auto k_ptr = &k_info[k_idx];
if (!kind_is_legal(k_idx)) return FALSE;
@@ -4573,7 +4527,6 @@ static bool_ kind_is_good(int k_idx)
case TV_HAFTED:
case TV_POLEARM:
case TV_DIGGING:
- case TV_TRAPKIT:
case TV_MSTAFF:
case TV_BOOMERANG:
{
@@ -4599,7 +4552,6 @@ static bool_ kind_is_good(int k_idx)
/* Expensive rod tips are good */
case TV_ROD:
{
- /* Probing is not good, but Recall is*/
if (k_ptr->cost >= 4500) return TRUE;
return FALSE;
}
@@ -4641,23 +4593,21 @@ static bool_ kind_is_good(int k_idx)
*/
bool_ kind_is_artifactable(int k_idx)
{
- int i, j;
- object_kind *k_ptr = &k_info[k_idx];
+ auto const &ra_info = game->edit_data.ra_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto k_ptr = &k_info[k_idx];
if (kind_is_good(k_idx))
{
- /* We consider the item artifactable if there is at least one
- * randart power in ra_info that could be added to this item. */
- for (i = 0; i < max_ra_idx; i++)
+ // Consider the item artifactable if there is at least one
+ // randart power which could be added to the item.
+ for (auto const &ra_ref: ra_info)
{
- randart_part_type *ra_ptr = &ra_info[i];
-
- for (j = 0; j < 20; j++)
+ for (auto const &filter: ra_ref.kind_filter)
{
- if (ra_ptr->tval[j] != k_ptr->tval) continue;
- if (ra_ptr->min_sval[j] > k_ptr->sval) continue;
- if (ra_ptr->max_sval[j] < k_ptr->sval) continue;
- /* Winner */
+ if (filter.tval != k_ptr->tval) continue;
+ if (filter.min_sval > k_ptr->sval) continue;
+ if (filter.max_sval < k_ptr->sval) continue;
return TRUE;
}
}
@@ -4684,6 +4634,9 @@ bool_ kind_is_artifactable(int k_idx)
*/
bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &theme)
{
+ auto const &k_info = game->edit_data.k_info;
+ auto &alloc = game->alloc;
+
int invprob, base;
@@ -4697,16 +4650,11 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &
/* Generate a special object, or a normal object */
if ((rand_int(invprob) != 0) || !make_artifact_special(j_ptr))
{
- int k_idx;
-
- /* See if the theme has been changed XXX XXX XXX */
- if (theme_changed(theme))
+ /* See if the theme has been changed */
+ if (init_match_theme(theme))
{
- /* Select items based on "theme" */
- init_match_theme(theme);
-
/* Invalidate the cached allocation table */
- alloc_kind_table_valid = FALSE;
+ alloc.kind_table_valid = false;
}
/* Good objects */
@@ -4720,7 +4668,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &
}
/* Normal objects -- only when the cache is invalidated */
- else if (!alloc_kind_table_valid)
+ else if (!alloc.kind_table_valid)
{
/* Activate normal restriction */
get_obj_num_hook = kind_is_legal;
@@ -4729,11 +4677,11 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &
get_obj_num_prep();
/* The table is synchronised */
- alloc_kind_table_valid = TRUE;
+ alloc.kind_table_valid = true;
}
/* Pick a random object */
- k_idx = get_obj_num(base);
+ int k_idx = get_obj_num(base);
/* Good objects */
if (good)
@@ -4745,7 +4693,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &
get_obj_num_prep();
/* The table is synchronised */
- alloc_kind_table_valid = TRUE;
+ alloc.kind_table_valid = true;
}
/* Handle failure */
@@ -4781,7 +4729,10 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &
rating += (k_info[j_ptr->k_idx].level - dun_level);
/* Cheat -- peek at items */
- if ((cheat_peek) || (p_ptr->precognition)) object_mention(j_ptr);
+ if (options->cheat_peek || p_ptr->precognition)
+ {
+ object_mention(j_ptr);
+ }
}
/* Success */
@@ -4801,6 +4752,11 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &
*/
void place_object(int y, int x, bool_ good, bool_ great, int where)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+ auto &random_artifacts = game->random_artifacts;
+
s16b o_idx;
cave_type *c_ptr;
@@ -4883,7 +4839,7 @@ void place_object(int y, int x, bool_ good, bool_ great, int where)
{
a_info[q_ptr->name1].cur_num = 0;
}
- else if (k_info[q_ptr->k_idx].flags3 & TR3_NORM_ART)
+ else if (k_info[q_ptr->k_idx].flags & TR_NORM_ART)
{
k_info[q_ptr->k_idx].artifact = 0;
}
@@ -4908,6 +4864,8 @@ void place_object(int y, int x, bool_ good, bool_ great, int where)
*/
bool_ make_gold(object_type *j_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
int i;
s32b base;
@@ -4938,8 +4896,10 @@ bool_ make_gold(object_type *j_ptr)
j_ptr->pval = (base + (8L * randint(base)) + randint(8));
/* Multiply value by 5 if selling is disabled */
- if (no_selling)
+ if (options->no_selling)
+ {
j_ptr->pval *= 5;
+ }
/* Success */
return (TRUE);
@@ -5029,6 +4989,11 @@ void place_gold(int y, int x)
*/
s16b drop_near(object_type *j_ptr, int chance, int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+ auto &random_artifacts = game->random_artifacts;
+
int i, k, d, s;
int bs, bn;
@@ -5054,7 +5019,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
/* Handle normal "breakage" */
- if (!(j_ptr->art_name || artifact_p(j_ptr)) && (rand_int(100) < chance))
+ if ((!artifact_p(j_ptr)) && (rand_int(100) < chance))
{
/* Message */
msg_format("The %s disappear%s.",
@@ -5106,10 +5071,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
c_ptr = &cave[ty][tx];
/* Require floor space (or shallow terrain) -KMW- */
- if (!(f_info[c_ptr->feat].flags1 & FF1_FLOOR)) continue;
-
- /* No traps */
- if (c_ptr->t_idx) continue;
+ if (!(f_info[c_ptr->feat].flags & FF_FLOOR)) continue;
/* No objects */
k = 0;
@@ -5159,7 +5121,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
/* Handle lack of space */
- if (!flag && !(artifact_p(j_ptr) || j_ptr->art_name))
+ if (!flag && (!artifact_p(j_ptr)))
{
/* Message */
msg_format("The %s disappear%s.",
@@ -5254,7 +5216,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
{
a_info[j_ptr->name1].cur_num = 0;
}
- else if (k_info[j_ptr->k_idx].flags3 & TR3_NORM_ART)
+ else if (k_info[j_ptr->k_idx].flags & TR_NORM_ART)
{
k_info[j_ptr->k_idx].artifact = 0;
}
@@ -5301,8 +5263,6 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
if (chance && (by == p_ptr->py) && (bx == p_ptr->px))
{
msg_print("You feel something roll beneath your feet.");
- /* Sound */
- sound(SOUND_DROP);
}
/* XXX XXX XXX */
@@ -5319,6 +5279,8 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
*/
void acquirement(int y1, int x1, int num, bool_ great, bool_ known)
{
+ auto const &d_info = game->edit_data.d_info;
+
object_type *i_ptr;
object_type object_type_body;
@@ -5346,30 +5308,6 @@ void acquirement(int y1, int x1, int num, bool_ great, bool_ known)
}
-
-/*
- * Hack -- instantiate a trap
- *
- * XXX XXX XXX This routine should be redone to reflect trap "level".
- * That is, it does not make sense to have spiked pits at 50 feet.
- * Actually, it is not this routine, but the "trap instantiation"
- * code, which should also check for "trap doors" on quest levels.
- */
-void pick_trap(int y, int x)
-{
- cave_type *c_ptr = &cave[y][x];
-
- /* Paranoia */
- if ((c_ptr->t_idx == 0) || (c_ptr->info & CAVE_TRDT)) return;
-
- /* Activate the trap */
- c_ptr->info |= (CAVE_TRDT);
-
- /* Notice and redraw */
- note_spot(y, x);
- lite_spot(y, x);
-}
-
/*
* Describe the charges on an item in the inventory.
*/
@@ -5458,6 +5396,8 @@ void inven_item_increase(int item, int num)
*/
bool_ inven_item_optimize(int item)
{
+ auto const &a_info = game->edit_data.a_info;
+
object_type *o_ptr = &p_ptr->inventory[item];
/* Only optimize real items */
@@ -6039,7 +5979,7 @@ void inven_drop(int item, int amt, int dy, int dx, bool_ silent)
*
* Note special handling of the "overflow" slot
*/
-void combine_pack(void)
+void combine_pack()
{
int i, j, k;
object_type *o_ptr;
@@ -6106,7 +6046,7 @@ void combine_pack(void)
*
* Note special handling of the "overflow" slot
*/
-void reorder_pack(void)
+void reorder_pack()
{
int i, j, k;
s32b o_value;
@@ -6274,9 +6214,11 @@ s16b floor_carry(int y, int x, object_type *j_ptr)
*/
void pack_decay(int item)
{
+ auto const &r_info = game->edit_data.r_info;
+
object_type *o_ptr = &p_ptr->inventory[item];
- monster_race *r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
object_type *i_ptr;
object_type object_type_body;
@@ -6325,7 +6267,7 @@ void pack_decay(int item)
}
/* Monster must have a skeleton for its corpse to become one */
- if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags3 & RF9_DROP_SKELETON))
+ if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags & RF_DROP_SKELETON))
{
/* Replace the corpse with a skeleton */
object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_SKELETON));
@@ -6359,9 +6301,11 @@ void pack_decay(int item)
*/
void floor_decay(int item)
{
+ auto const &r_info = game->edit_data.r_info;
+
object_type *o_ptr = &o_list[item];
- monster_race *r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
object_type *i_ptr;
object_type object_type_body;
@@ -6420,7 +6364,7 @@ void floor_decay(int item)
}
/* Monster must have a skeleton for its corpse to become one */
- if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags3 & RF9_DROP_SKELETON))
+ if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags & RF_DROP_SKELETON))
{
/* Replace the corpse with a skeleton */
object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_SKELETON));
diff --git a/src/object2.hpp b/src/object2.hpp
index 26d07b25..a91631aa 100644
--- a/src/object2.hpp
+++ b/src/object2.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include "ego_flag_set.hpp"
#include "h-basic.h"
#include "object_type_fwd.hpp"
#include "obj_theme_fwd.hpp"
@@ -9,61 +10,60 @@
typedef enum { OPTIMIZE, NO_OPTIMIZE } optimize_flag;
typedef enum { DESCRIBE, NO_DESCRIBE } describe_flag;
-extern void inc_stack_size(int item, int delta);
-extern void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc);
-extern object_type *get_object(int item);
-extern s32b calc_total_weight(void);
-extern void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows);
-extern void init_match_theme(obj_theme const &theme);
-extern bool_ kind_is_artifactable(int k_idx);
-extern bool_ kind_is_legal(int k_idx);
-extern void inven_item_charges(int item);
-extern void inven_item_describe(int item);
-extern void inven_item_increase(int item, int num);
-extern bool_ inven_item_optimize(int item);
-extern void floor_item_charges(int item);
-extern void floor_item_describe(int item);
-extern void floor_item_increase(int item, int num);
-extern void floor_item_optimize(int item);
-extern bool_ inven_carry_okay(object_type const *o_ptr);
-extern s16b inven_carry(object_type *o_ptr, bool_ final);
-extern s16b inven_takeoff(int item, int amt, bool_ force_drop);
-extern void inven_drop(int item, int amt, int dy, int dx, bool_ silent);
-extern void excise_object_idx(int o_idx);
-extern void delete_object_idx(int o_idx);
-extern void delete_object(int y, int x);
-extern void compact_objects(int size);
-extern void wipe_o_list(void);
-extern s16b o_pop(void);
-extern errr get_obj_num_prep(void);
-extern s16b get_obj_num(int level);
-extern void object_known(object_type *o_ptr);
-extern bool object_known_p(object_type const *o_ptr);
-extern void object_aware(object_type *o_ptr);
-extern bool object_aware_p(object_type const *o_ptr);
-extern void object_tried(object_type *o_ptr);
-extern bool object_tried_p(object_type const *o_ptr);
-extern s32b object_value(object_type const *o_ptr);
-extern s32b object_value_real(object_type const *o_ptr);
-extern bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr);
-extern void object_absorb(object_type *o_ptr, object_type *j_ptr);
-extern s16b lookup_kind(int tval, int sval);
-extern void object_wipe(object_type *o_ptr);
-extern void object_prep(object_type *o_ptr, int k_idx);
-extern void object_copy(object_type *o_ptr, object_type *j_ptr);
-extern void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional<int> force_power = boost::none);
-extern bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &theme);
-extern void place_object(int y, int x, bool_ good, bool_ great, int where);
-extern bool_ make_gold(object_type *j_ptr);
-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 pick_trap(int y, int x);
-extern void combine_pack(void);
-extern void reorder_pack(void);
-extern void random_artifact_resistance (object_type * o_ptr);
-extern s16b floor_carry(int y, int x, object_type *j_ptr);
-extern void pack_decay(int item);
-extern void floor_decay(int item);
-extern s16b m_bonus(int max, int level);
-extern s32b flag_cost(object_type const *o_ptr, int plusses);
+void inc_stack_size(int item, int delta);
+void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc);
+object_type *get_object(int item);
+s32b calc_total_weight();
+void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows);
+bool init_match_theme(obj_theme const &theme);
+bool_ kind_is_artifactable(int k_idx);
+bool_ kind_is_legal(int k_idx);
+void inven_item_charges(int item);
+void inven_item_describe(int item);
+void inven_item_increase(int item, int num);
+bool_ inven_item_optimize(int item);
+void floor_item_charges(int item);
+void floor_item_describe(int item);
+void floor_item_increase(int item, int num);
+void floor_item_optimize(int item);
+bool_ inven_carry_okay(object_type const *o_ptr);
+s16b inven_carry(object_type *o_ptr, bool_ final);
+s16b inven_takeoff(int item, int amt, bool_ force_drop);
+void inven_drop(int item, int amt, int dy, int dx, bool_ silent);
+void excise_object_idx(int o_idx);
+void delete_object_idx(int o_idx);
+void delete_object(int y, int x);
+void compact_objects(int size);
+void wipe_o_list();
+s16b o_pop();
+errr get_obj_num_prep();
+s16b get_obj_num(int level);
+void object_known(object_type *o_ptr);
+bool object_known_p(object_type const *o_ptr);
+void object_aware(object_type *o_ptr);
+bool object_aware_p(object_type const *o_ptr);
+void object_tried(object_type *o_ptr);
+bool object_tried_p(object_type const *o_ptr);
+s32b object_value(object_type const *o_ptr);
+s32b object_value_real(object_type const *o_ptr);
+bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr);
+void object_absorb(object_type *o_ptr, object_type *j_ptr);
+s16b lookup_kind(int tval, int sval);
+void object_wipe(object_type *o_ptr);
+void object_prep(object_type *o_ptr, int k_idx);
+void object_copy(object_type *o_ptr, object_type *j_ptr);
+void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional<int> force_power = boost::none);
+bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &theme);
+void place_object(int y, int x, bool_ good, bool_ great, int where);
+bool_ make_gold(object_type *j_ptr);
+void place_gold(int y, int x);
+s16b drop_near(object_type *o_ptr, int chance, int y, int x);
+void acquirement(int y1, int x1, int num, bool_ great, bool_ known);
+void combine_pack();
+void reorder_pack();
+void random_artifact_resistance(object_type * o_ptr);
+s16b floor_carry(int y, int x, object_type *j_ptr);
+void pack_decay(int item);
+void floor_decay(int item);
+s16b m_bonus(int max, int level);
+s32b flag_cost(object_type const *o_ptr, int plusses);
diff --git a/src/object_filter.cc b/src/object_filter.cc
index 39961146..936eef7d 100644
--- a/src/object_filter.cc
+++ b/src/object_filter.cc
@@ -17,33 +17,10 @@ object_filter_t SVal(byte sval) {
};
}
-object_filter_t HasFlag3(u32b mask) {
+object_filter_t HasFlags(object_flag_set const &mask) {
return [=](object_type const *o_ptr) -> bool {
- // Extract the flags
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- // Does the item have the flag?
- return (f3 & mask);
- };
-}
-
-object_filter_t HasFlag4(u32b mask) {
- return [=](object_type const *o_ptr) -> bool {
- // Extract the flags
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- // Does the item have the flag?
- return (f4 & mask);
- };
-}
-
-object_filter_t HasFlag5(u32b mask) {
- return [=](object_type const *o_ptr) -> bool {
- // Extract the flags
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- // Does the item have the flag?
- return (f5 & mask);
+ auto const flags = object_flags(o_ptr);
+ return bool(flags & mask);
};
}
diff --git a/src/object_filter.hpp b/src/object_filter.hpp
index 9a22090b..d18e13ee 100644
--- a/src/object_filter.hpp
+++ b/src/object_filter.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "h-basic.h"
+#include "object_flag_set.hpp"
#include "object_type_fwd.hpp"
#include <functional>
@@ -21,19 +22,9 @@ object_filter_t TVal(byte tval);
object_filter_t SVal(byte sval);
/**
- * Has given bit mask in flag3 value.
+ * Has given set of flags set.
*/
-object_filter_t HasFlag3(u32b mask);
-
-/**
- * Has given bit mask in flag4 value.
- */
-object_filter_t HasFlag4(u32b mask);
-
-/**
- * Has given bit mask in flag5 value.
- */
-object_filter_t HasFlag5(u32b mask);
+object_filter_t HasFlags(object_flag_set const &);
/**
* Is the object an artifact?
diff --git a/src/object_flag.hpp b/src/object_flag.hpp
new file mode 100644
index 00000000..d5ec2fef
--- /dev/null
+++ b/src/object_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "object_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define TR(tier, index, name, e_name, c_name, c_page, c_col, c_row, c_type, c_prio, is_pval, is_esp) \
+ DECLARE_FLAG(object_flag_set, name, tier, index)
+#include "object_flag_list.hpp"
+#undef TR
diff --git a/src/object_flag_list.hpp b/src/object_flag_list.hpp
new file mode 100644
index 00000000..a7aef7d4
--- /dev/null
+++ b/src/object_flag_list.hpp
@@ -0,0 +1,185 @@
+/**
+ * X-macro list of all the object flags.
+ *
+ * Parameters:
+ *
+ * - e_name: name of the flag in the edit files.
+ * - c_name: name of the flag on the character sheet
+ * (10 characters max). If nullptrptr the
+ * flag doesn't appear and the other c_*
+ * values are ignored.
+ * - c_page: page on the character sheet (0-3).
+ * - c_col: column number on the character sheet (0-1).
+ * - c_row: row number on the character sheet (0-15).
+ * - c_type: type of the character sheet; either
+ * NUMERIC, BINARY or TERNARY(n).
+ * - c_prio: priority if the flag overlaps another flag
+ * on the character sheet. 0 is lowes priority.
+ * - is_pval: true iff the flag _description_ depends on PVAL.
+ * - is_esp: true iff the flag affects ESP.
+ */
+
+/* TR(<tier>, <index>, <name>, <e_name>, <c_name>, <c_page>, <c_col>, <c_row>, <c_type>, <c_prio>, <is_pval>, <is_esp>) */
+
+TR(1, 0, TR_STR , STR , "Add Str" , 0, 0, 0, NUMERIC , 0, true , false)
+TR(1, 1, TR_INT , INT , "Add Int" , 0, 0, 1, NUMERIC , 0, true , false)
+TR(1, 2, TR_WIS , WIS , "Add Wis" , 0, 0, 2, NUMERIC , 0, true , false)
+TR(1, 3, TR_DEX , DEX , "Add Dex" , 0, 0, 3, NUMERIC , 0, true , false)
+TR(1, 4, TR_CON , CON , "Add Con" , 0, 0, 4, NUMERIC , 0, true , false)
+TR(1, 5, TR_CHR , CHR , "Add Chr" , 0, 0, 5, NUMERIC , 0, true , false)
+TR(1, 6, TR_MANA , MANA , "Mul Mana" , 0, 0, 6, BINARY , 0, false, false)
+TR(1, 7, TR_SPELL , SPELL , "Mul SPower", 0, 0, 7, BINARY , 0, true , false)
+TR(1, 8, TR_STEALTH , STEALTH , "Add Stea." , 0, 0, 8, NUMERIC , 0, true , false)
+TR(1, 10, TR_INFRA , INFRA , "Add Infra" , 0, 0, 9, NUMERIC , 0, true , false)
+TR(1, 11, TR_TUNNEL , TUNNEL , "Add Tun.." , 0, 0, 10, NUMERIC , 0, true , false)
+TR(1, 12, TR_SPEED , SPEED , "Add Speed" , 0, 0, 11, NUMERIC , 0, true , false)
+TR(1, 13, TR_BLOWS , BLOWS , "Add Blows" , 0, 0, 12, NUMERIC , 0, true , false)
+TR(1, 14, TR_CHAOTIC , CHAOTIC , "Chaotic" , 0, 0, 13, BINARY , 0, false, false)
+TR(1, 15, TR_VAMPIRIC , VAMPIRIC , "Vampiric" , 0, 0, 14, BINARY , 0, false, false)
+TR(1, 16, TR_SLAY_ANIMAL , SLAY_ANIMAL , "Slay Anim.", 0, 1, 0, BINARY , 0, false, false)
+TR(1, 17, TR_SLAY_EVIL , SLAY_EVIL , "Slay Evil" , 0, 1, 1, BINARY , 0, false, false)
+TR(1, 18, TR_SLAY_UNDEAD , SLAY_UNDEAD , "Slay Und." , 0, 1, 2, BINARY , 0, false, false)
+TR(1, 19, TR_SLAY_DEMON , SLAY_DEMON , "Slay Demon", 0, 1, 3, BINARY , 0, false, false)
+TR(1, 20, TR_SLAY_ORC , SLAY_ORC , "Slay Orc" , 0, 1, 4, BINARY , 0, false, false)
+TR(1, 21, TR_SLAY_TROLL , SLAY_TROLL , "Slay Troll", 0, 1, 5, BINARY , 0, false, false)
+TR(1, 22, TR_SLAY_GIANT , SLAY_GIANT , "Slay Giant", 0, 1, 6, BINARY , 0, false, false)
+TR(1, 23, TR_SLAY_DRAGON , SLAY_DRAGON , "Slay Drag.", 0, 1, 7, BINARY , 0, false, false)
+TR(1, 24, TR_KILL_DRAGON , KILL_DRAGON , "Kill Drag.", 0, 1, 8, BINARY , 0, false, false)
+TR(1, 25, TR_VORPAL , VORPAL , "Sharpness" , 0, 1, 9, BINARY , 0, false, false)
+TR(1, 26, TR_IMPACT , IMPACT , "Impact" , 0, 1, 10, BINARY , 0, false, false)
+TR(1, 27, TR_BRAND_POIS , BRAND_POIS , "Poison Brd", 0, 1, 11, BINARY , 0, false, false)
+TR(1, 28, TR_BRAND_ACID , BRAND_ACID , "Acid Brand", 0, 1, 12, BINARY , 0, false, false)
+TR(1, 29, TR_BRAND_ELEC , BRAND_ELEC , "Elec Brand", 0, 1, 13, BINARY , 0, false, false)
+TR(1, 30, TR_BRAND_FIRE , BRAND_FIRE , "Fire Brand", 0, 1, 14, BINARY , 0, false, false)
+TR(1, 31, TR_BRAND_COLD , BRAND_COLD , "Cold Brand", 0, 1, 15, BINARY , 0, false, false)
+
+TR(2, 0, TR_SUST_STR , SUST_STR , "Sust Str" , 1, 0, 0, BINARY , 0, false, false)
+TR(2, 1, TR_SUST_INT , SUST_INT , "Sust Int" , 1, 0, 1, BINARY , 0, false, false)
+TR(2, 2, TR_SUST_WIS , SUST_WIS , "Sust Wis" , 1, 0, 2, BINARY , 0, false, false)
+TR(2, 3, TR_SUST_DEX , SUST_DEX , "Sust Dex" , 1, 0, 3, BINARY , 0, false, false)
+TR(2, 4, TR_SUST_CON , SUST_CON , "Sust Con" , 1, 0, 4, BINARY , 0, false, false)
+TR(2, 5, TR_SUST_CHR , SUST_CHR , "Sust Chr" , 1, 0, 5, BINARY , 0, false, false)
+TR(2, 6, TR_INVIS , INVIS , "Invisible" , 1, 0, 6, BINARY , 0, false, false)
+TR(2, 7, TR_LIFE , LIFE , "Mul life" , 1, 0, 7, BINARY , 0, false, false)
+TR(2, 8, TR_IM_ACID , IM_ACID , "Imm Acid" , 1, 1, 0, TERNARY(2), 1, false, false)
+TR(2, 9, TR_IM_ELEC , IM_ELEC , "Imm Elec" , 1, 1, 1, TERNARY(2), 1, false, false)
+TR(2, 10, TR_IM_FIRE , IM_FIRE , "Imm Fire" , 1, 1, 2, TERNARY(2), 1, false, false)
+TR(2, 11, TR_IM_COLD , IM_COLD , "Imm Cold" , 1, 1, 3, TERNARY(2), 1, false, false)
+TR(2, 12, TR_SENS_FIRE , SENS_FIRE , "Sens Fire" , 1, 0, 12, BINARY , 0, false, false)
+TR(2, 13, TR_REFLECT , REFLECT , "Reflect" , 1, 0, 13, BINARY , 0, false, false)
+TR(2, 14, TR_FREE_ACT , FREE_ACT , "Free Act" , 1, 0, 14, BINARY , 0, false, false)
+TR(2, 15, TR_HOLD_LIFE , HOLD_LIFE , "Hold Life" , 1, 0, 15, BINARY , 0, false, false)
+TR(2, 16, TR_RES_ACID , RES_ACID , "Res Acid" , 1, 1, 0, TERNARY(1), 0, false, false)
+TR(2, 17, TR_RES_ELEC , RES_ELEC , "Res Elec" , 1, 1, 1, TERNARY(1), 0, false, false)
+TR(2, 18, TR_RES_FIRE , RES_FIRE , "Res Fire" , 1, 1, 2, TERNARY(1), 0, false, false)
+TR(2, 19, TR_RES_COLD , RES_COLD , "Res Cold" , 1, 1, 3, TERNARY(1), 0, false, false)
+TR(2, 20, TR_RES_POIS , RES_POIS , "Res Pois" , 1, 1, 4, BINARY , 0, false, false)
+TR(2, 21, TR_RES_FEAR , RES_FEAR , "Res Fear" , 1, 1, 5, BINARY , 0, false, false)
+TR(2, 22, TR_RES_LITE , RES_LITE , "Res Light" , 1, 1, 6, BINARY , 0, false, false)
+TR(2, 23, TR_RES_DARK , RES_DARK , "Res Dark" , 1, 1, 7, BINARY , 0, false, false)
+TR(2, 24, TR_RES_BLIND , RES_BLIND , "Res Blind" , 1, 1, 8, BINARY , 0, false, false)
+TR(2, 25, TR_RES_CONF , RES_CONF , "Res Conf" , 1, 1, 9, BINARY , 0, false, false)
+TR(2, 26, TR_RES_SOUND , RES_SOUND , "Res Sound" , 1, 1, 10, BINARY , 0, false, false)
+TR(2, 27, TR_RES_SHARDS , RES_SHARDS , "Res Shard" , 1, 1, 11, BINARY , 0, false, false)
+TR(2, 28, TR_RES_NETHER , RES_NETHER , "Res Neth" , 1, 1, 12, TERNARY(1), 0, false, false)
+TR(2, 29, TR_RES_NEXUS , RES_NEXUS , "Res Nexus" , 1, 1, 13, BINARY , 0, false, false)
+TR(2, 30, TR_RES_CHAOS , RES_CHAOS , "Res Chaos" , 1, 1, 14, BINARY , 0, false, false)
+TR(2, 31, TR_RES_DISEN , RES_DISEN , "Res Disen" , 1, 1, 15, BINARY , 0, false, false)
+
+TR(3, 0, TR_SH_FIRE , SH_FIRE , "Aura Fire" , 2, 0, 0, BINARY , 0, false, false)
+TR(3, 1, TR_SH_ELEC , SH_ELEC , "Aura Elec" , 2, 0, 1, BINARY , 0, false, false)
+TR(3, 2, TR_AUTO_CURSE , AUTO_CURSE , "Auto Curse", 2, 0, 2, BINARY , 0, false, false)
+TR(3, 3, TR_DECAY , DECAY , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 4, TR_NO_TELE , NO_TELE , "NoTeleport", 2, 0, 4, BINARY , 0, false, false)
+TR(3, 5, TR_NO_MAGIC , NO_MAGIC , "AntiMagic" , 2, 0, 5, BINARY , 0, false, false)
+TR(3, 6, TR_WRAITH , WRAITH , "WraithForm", 2, 0, 6, BINARY , 0, false, false)
+TR(3, 7, TR_TY_CURSE , TY_CURSE , "EvilCurse" , 2, 0, 7, BINARY , 0, false, false)
+TR(3, 8, TR_EASY_KNOW , EASY_KNOW , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 9, TR_HIDE_TYPE , HIDE_TYPE , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 10, TR_SHOW_MODS , SHOW_MODS , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 11, TR_INSTA_ART , INSTA_ART , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 12, TR_FEATHER , FEATHER , "Levitate" , 2, 0, 12, BINARY , 0, false, false)
+TR(3, 13, TR_LITE1 , LITE1 , "Lite" , 2, 0, 13, FIXED(1) , 0, false, false)
+TR(3, 14, TR_SEE_INVIS , SEE_INVIS , "See Invis" , 2, 0, 14, BINARY , 0, false, false)
+TR(3, 15, TR_NORM_ART , NORM_ART , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 16, TR_SLOW_DIGEST , SLOW_DIGEST , "Digestion" , 2, 1, 0, BINARY , 0, false, false)
+TR(3, 17, TR_REGEN , REGEN , "Regen" , 2, 1, 1, BINARY , 0, false, false)
+TR(3, 18, TR_XTRA_MIGHT , XTRA_MIGHT , "Xtra Might", 2, 1, 2, BINARY , 0, false, false)
+TR(3, 19, TR_XTRA_SHOTS , XTRA_SHOTS , "Xtra Shots", 2, 1, 3, BINARY , 0, false, false)
+TR(3, 20, TR_IGNORE_ACID , IGNORE_ACID , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 21, TR_IGNORE_ELEC , IGNORE_ELEC , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 22, TR_IGNORE_FIRE , IGNORE_FIRE , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 23, TR_IGNORE_COLD , IGNORE_COLD , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(3, 24, TR_ACTIVATE , ACTIVATE , "Activate" , 2, 1, 8, BINARY , 0, false, false)
+TR(3, 25, TR_DRAIN_EXP , DRAIN_EXP , "Drain Exp" , 2, 1, 9, BINARY , 0, false, false)
+TR(3, 26, TR_TELEPORT , TELEPORT , "Teleport" , 2, 1, 10, BINARY , 0, false, false)
+TR(3, 27, TR_AGGRAVATE , AGGRAVATE , "Aggravate" , 2, 1, 11, BINARY , 0, false, false)
+TR(3, 28, TR_BLESSED , BLESSED , "Blessed" , 2, 1, 12, BINARY , 0, false, false)
+TR(3, 29, TR_CURSED , CURSED , "Cursed" , 2, 1, 13, BINARY , 0, false, false)
+TR(3, 30, TR_HEAVY_CURSE , HEAVY_CURSE , "Hvy Curse" , 2, 1, 14, BINARY , 0, false, false)
+TR(3, 31, TR_PERMA_CURSE , PERMA_CURSE , "Prm Curse" , 2, 1, 15, BINARY , 0, false, false)
+
+TR(4, 0, TR_NEVER_BLOW , NEVER_BLOW , "No blows" , 3, 0, 0, BINARY , 0, false, false)
+TR(4, 1, TR_PRECOGNITION , PRECOGNITION , "Precogn." , 3, 0, 1, BINARY , 0, false, false)
+TR(4, 2, TR_BLACK_BREATH , BLACK_BREATH , "B.Breath" , 3, 0, 2, BINARY , 0, false, false)
+TR(4, 3, TR_RECHARGE , RECHARGE , "Recharge" , 3, 0, 3, BINARY , 0, false, false)
+TR(4, 4, TR_FLY , FLY , "Fly" , 3, 0, 4, BINARY , 0, false, false)
+TR(4, 5, TR_DG_CURSE , DG_CURSE , "Mrg.Curse" , 3, 0, 5, BINARY , 0, false, false)
+TR(4, 6, TR_COULD2H , COULD2H , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 7, TR_MUST2H , MUST2H , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 8, TR_LEVELS , LEVELS , "Sentient" , 3, 0, 8, BINARY , 0, false, false)
+TR(4, 9, TR_CLONE , CLONE , "Clone" , 3, 0, 9, BINARY , 0, false, false)
+TR(4, 10, TR_SPECIAL_GENE , SPECIAL_GENE , nullptr , 3, 0, 10, BINARY , 0, false, false)
+TR(4, 11, TR_CLIMB , CLIMB , "Climb" , 3, 0, 11, BINARY , 0, false, false)
+TR(4, 12, TR_FAST_CAST , FAST_CAST , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 13, TR_CAPACITY , CAPACITY , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 14, TR_CHARGING , CHARGING , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 15, TR_CHEAPNESS , CHEAPNESS , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 16, TR_FOUNTAIN , FOUNTAIN , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 17, TR_ANTIMAGIC_50 , ANTIMAGIC_50 , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 21, TR_EASY_USE , EASY_USE , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 22, TR_IM_NETHER , IM_NETHER , "Imm Neth" , 1, 1, 12, TERNARY(2), 1, false, false)
+TR(4, 23, TR_RECHARGED , RECHARGED , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 24, TR_ULTIMATE , ULTIMATE , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 25, TR_AUTO_ID , AUTO_ID , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 26, TR_LITE2 , LITE2 , "Lite" , 2, 0, 13, FIXED(2) , 0, false, false)
+TR(4, 27, TR_LITE3 , LITE3 , "Lite" , 2, 0, 13, FIXED(3) , 0, false, false)
+TR(4, 28, TR_FUEL_LITE , FUEL_LITE , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 30, TR_CURSE_NO_DROP , CURSE_NO_DROP , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(4, 31, TR_NO_RECHARGE , NO_RECHARGE , nullptr , -1, -1, -1, BINARY , 0, false, false)
+
+TR(5, 0, TR_TEMPORARY , TEMPORARY , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 1, TR_DRAIN_MANA , DRAIN_MANA , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 2, TR_DRAIN_HP , DRAIN_HP , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 3, TR_KILL_DEMON , KILL_DEMON , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 4, TR_KILL_UNDEAD , KILL_UNDEAD , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 5, TR_CRIT , CRIT , nullptr , -1, -1, -1, BINARY , 0, true , false)
+TR(5, 6, TR_ATTR_MULTI , ATTR_MULTI , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 7, TR_WOUNDING , WOUNDING , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 8, TR_FULL_NAME , FULL_NAME , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 9, TR_LUCK , LUCK , nullptr , -1, -1, -1, BINARY , 0, true , false)
+TR(5, 10, TR_IMMOVABLE , IMMOVABLE , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 11, TR_SPELL_CONTAIN , SPELL_CONTAIN , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 12, TR_RES_MORGUL , RES_MORGUL , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 13, TR_ACTIVATE_NO_WIELD , ACTIVATE_NO_WIELD , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 14, TR_MAGIC_BREATH , MAGIC_BREATH , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 15, TR_WATER_BREATH , WATER_BREATH , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 16, TR_WIELD_CAST , WIELD_CAST , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 17, TR_RANDOM_RESIST , RANDOM_RESIST , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 18, TR_RANDOM_POWER , RANDOM_POWER , nullptr , -1, -1, -1, BINARY , 0, false, false)
+TR(5, 19, TR_RANDOM_RES_OR_POWER, RANDOM_RES_OR_POWER, nullptr , -1, -1, -1, BINARY , 0, false, false)
+
+TR(6, 0, ESP_ORC , ESP_ORC , "Orc.ESP" , 3, 1, 0, BINARY , 0, false, true )
+TR(6, 1, ESP_TROLL , ESP_TROLL , "Troll.ESP" , 3, 1, 1, BINARY , 0, false, true )
+TR(6, 2, ESP_DRAGON , ESP_DRAGON , "Dragon.ESP", 3, 1, 2, BINARY , 0, false, true )
+TR(6, 3, ESP_GIANT , ESP_GIANT , "Giant.ESP" , 3, 1, 3, BINARY , 0, false, true )
+TR(6, 4, ESP_DEMON , ESP_DEMON , "Demon.ESP" , 3, 1, 4, BINARY , 0, false, true )
+TR(6, 5, ESP_UNDEAD , ESP_UNDEAD , "Undead.ESP", 3, 1, 5, BINARY , 0, false, true )
+TR(6, 6, ESP_EVIL , ESP_EVIL , "Evil.ESP" , 3, 1, 6, BINARY , 0, false, true )
+TR(6, 7, ESP_ANIMAL , ESP_ANIMAL , "Animal.ESP", 3, 1, 7, BINARY , 0, false, true )
+TR(6, 8, ESP_THUNDERLORD , ESP_THUNDERLORD , "TLord.ESP" , 3, 1, 8, BINARY , 0, false, true )
+TR(6, 9, ESP_GOOD , ESP_GOOD , "Good.ESP" , 3, 1, 9, BINARY , 0, false, true )
+TR(6, 10, ESP_NONLIVING , ESP_NONLIVING , "Nlive.ESP" , 3, 1, 10, BINARY , 0, false, true )
+TR(6, 11, ESP_UNIQUE , ESP_UNIQUE , "Unique.ESP", 3, 1, 11, BINARY , 0, false, true )
+TR(6, 12, ESP_SPIDER , ESP_SPIDER , "Spider ESP", 3, 1, 12, BINARY , 0, false, true )
+TR(6, 31, ESP_ALL , ESP_ALL , "Full ESP" , 3, 1, 15, BINARY , 0, false, true )
diff --git a/src/object_flag_meta.cc b/src/object_flag_meta.cc
new file mode 100644
index 00000000..89b91fea
--- /dev/null
+++ b/src/object_flag_meta.cc
@@ -0,0 +1,59 @@
+#include "object_flag_meta.hpp"
+
+#include "object_flag.hpp"
+
+std::vector<object_flag_meta const *> const &object_flags_meta()
+{
+ static std::vector<object_flag_meta const *> instance;
+
+ if (instance.empty())
+ {
+#define NUMERIC 'n'
+#define BINARY 'b'
+#define TERNARY(n) ((n == 1) ? '+' : ((n == 2) ? '*' : '?'))
+#define FIXED(n) ((n == 1) ? '1' : ((n == 2) ? '2' : ((n == 3) ? '3' : '?')))
+#define TR(tier, index, name, e_name, c_name, c_page, c_col, c_row, c_type, c_prio, is_pval, is_esp) \
+ instance.emplace_back(new object_flag_meta { \
+ name, \
+ #name, \
+ #e_name, \
+ c_name, \
+ c_page, \
+ c_col, \
+ c_row, \
+ c_type, \
+ c_prio, \
+ is_pval, \
+ is_esp \
+ });
+#include "object_flag_list.hpp"
+#undef TR
+#undef FIXED
+#undef TERNARY
+#undef BINARY
+#undef NUMERIC
+ };
+
+ return instance;
+}
+
+object_flag_set const &object_flags_esp()
+{
+ static object_flag_set instance;
+ static bool initialized = false;
+
+ if (!initialized)
+ {
+ for (auto const object_flag_meta: object_flags_meta())
+ {
+ if (object_flag_meta->is_esp)
+ {
+ instance |= object_flag_meta->flag_set;
+ }
+ }
+
+ initialized = true;
+ }
+
+ return instance;
+}
diff --git a/src/object_flag_meta.hpp b/src/object_flag_meta.hpp
new file mode 100644
index 00000000..d488c0d5
--- /dev/null
+++ b/src/object_flag_meta.hpp
@@ -0,0 +1,75 @@
+#pragma once
+
+#include "object_flag_set.hpp"
+
+#include <vector>
+
+struct object_flag_meta {
+
+ /**
+ * Flag set representation of the object flag.
+ */
+ const object_flag_set flag_set;
+
+ /**
+ * Name of the object flag.
+ */
+ const char *name;
+
+ /**
+ * Edit file name of the object flag.
+ */
+ const char *e_name;
+
+ /**
+ * Character sheet name of the object flag.
+ */
+ const char *c_name;
+
+ /**
+ * Character sheet page.
+ */
+ const int c_page;
+
+ /**
+ * Character sheet column.
+ */
+ const int c_column;
+
+ /**
+ * Character sheet row.
+ */
+ const int c_row;
+
+ /**
+ * Character sheet type.
+ */
+ char c_type;
+
+ /**
+ * Priority wrt. other flags in the same position
+ * on the character sheet.
+ */
+ int c_priority;
+
+ /**
+ * Is this flag *described* using PVAL?
+ */
+ bool is_pval;
+
+ /**
+ * Is this a flag which affects ESP?
+ */
+ bool is_esp;
+
+};
+
+/**
+ * Get a vector of all the object flags.
+ */
+std::vector<object_flag_meta const *> const &object_flags_meta();
+
+/**
+ * Get a flag representing all ESP flags.
+ */
+object_flag_set const &object_flags_esp();
diff --git a/src/object_flag_set.hpp b/src/object_flag_set.hpp
new file mode 100644
index 00000000..a4e8f874
--- /dev/null
+++ b/src/object_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t TR_MAX_TIERS = 6;
+
+typedef flag_set<TR_MAX_TIERS> object_flag_set;
diff --git a/src/object_kind.hpp b/src/object_kind.hpp
index 505f54d9..2f347f3f 100644
--- a/src/object_kind.hpp
+++ b/src/object_kind.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "h-basic.h"
+#include "object_flag_set.hpp"
/**
* Size of allocation table for objects
@@ -14,70 +15,59 @@ constexpr int ALLOCATION_MAX = 8;
*/
struct object_kind
{
- const char *name; /* Name */
- char *text; /* Text */
+ const char *name = nullptr; /* Name */
+ char *text = nullptr; /* Text */
- byte tval; /* Object type */
- byte sval; /* Object sub type */
+ byte tval = 0; /* Object type */
+ byte sval = 0; /* Object sub type */
- s32b pval; /* Object extra info */
- s32b pval2; /* Object extra info */
+ s32b pval = 0; /* Object extra info */
+ s32b pval2 = 0; /* Object extra info */
- s16b to_h; /* Bonus to hit */
- s16b to_d; /* Bonus to damage */
- s16b to_a; /* Bonus to armor */
+ s16b to_h = 0; /* Bonus to hit */
+ s16b to_d = 0; /* Bonus to damage */
+ s16b to_a = 0; /* Bonus to armor */
- s16b activate; /* Activation number */
+ s16b activate = 0; /* Activation number */
- s16b ac; /* Base armor */
+ s16b ac = 0; /* Base armor */
- byte dd, ds; /* Damage dice/sides */
+ byte dd = 0; /* Damage dice */
+ byte ds = 0; /* Damage sides */
- s32b weight; /* Weight */
+ s32b weight = 0; /* Weight */
- s32b cost; /* Object "base cost" */
+ s32b cost = 0; /* Object "base cost" */
- u32b flags1; /* Flags, set 1 */
- u32b flags2; /* Flags, set 2 */
- u32b flags3; /* Flags, set 3 */
- u32b flags4; /* Flags, set 4 */
- u32b flags5; /* Flags, set 5 */
+ object_flag_set flags;
- u32b oflags1; /* Obvious Flags, set 1 */
- u32b oflags2; /* Obvious Flags, set 2 */
- u32b oflags3; /* Obvious Flags, set 3 */
- u32b oflags4; /* Obvious Flags, set 4 */
- u32b oflags5; /* Obvious Flags, set 5 */
+ object_flag_set oflags;
- byte locale[ALLOCATION_MAX]; /* Allocation level(s) */
- byte chance[ALLOCATION_MAX]; /* Allocation chance(s) */
+ byte locale[ALLOCATION_MAX] = { 0 }; /* Allocation level(s) */
+ byte chance[ALLOCATION_MAX] = { 0 }; /* Allocation chance(s) */
- byte level; /* Level */
+ byte level = 0; /* Level */
- byte d_attr; /* Default object attribute */
- char d_char; /* Default object character */
+ byte d_attr = 0; /* Default object attribute */
+ char d_char = 0; /* Default object character */
- byte x_attr; /* Desired object attribute */
- char x_char; /* Desired object character */
+ byte x_attr = 0; /* Desired object attribute */
+ char x_char = 0; /* Desired object character */
- byte flavor; /* Special object flavor (or zero) */
+ byte flavor = 0; /* Special object flavor (or zero) */
- bool_ easy_know; /* This object is always known (if aware) */
+ bool_ easy_know = 0; /* This object is always known (if aware) */
+ bool_ aware = 0; /* The player is "aware" of the item's effects */
- bool_ aware; /* The player is "aware" of the item's effects */
+ bool_ tried = 0; /* The player has "tried" one of the items */
- bool_ tried; /* The player has "tried" one of the items */
+ byte btval = 0; /* Become Object type */
+ byte bsval = 0; /* Become Object sub type */
+ bool_ artifact = 0; /* Is it a normal artifact(already generated) */
- u32b esp; /* ESP flags */
- u32b oesp; /* Obvious ESP flags */
-
- byte btval; /* Become Object type */
- byte bsval; /* Become Object sub type */
- bool_ artifact; /* Is it a normal artifact(already generated) */
-
- s16b power; /* Power granted(if any) */
+ s16b power = 0; /* Power granted(if any) */
};
diff --git a/src/object_kind_fwd.hpp b/src/object_kind_fwd.hpp
deleted file mode 100644
index 6d26db9f..00000000
--- a/src/object_kind_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct object_kind;
diff --git a/src/object_proto.hpp b/src/object_proto.hpp
new file mode 100644
index 00000000..faa0b2e8
--- /dev/null
+++ b/src/object_proto.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "h-basic.h"
+
+struct object_proto
+{
+ s16b tval = 0;
+ s16b sval = 0;
+ s16b pval = 0;
+ s16b dd = 0;
+ s16b ds = 0;
+};
diff --git a/src/object_type.hpp b/src/object_type.hpp
index d7f003e6..3a34d181 100644
--- a/src/object_type.hpp
+++ b/src/object_type.hpp
@@ -1,6 +1,9 @@
#pragma once
#include "h-basic.h"
+#include "object_flag_set.hpp"
+
+#include <string>
/**
* Object information for a specific object.
@@ -31,74 +34,63 @@
*/
struct object_type
{
- s16b k_idx; /* Kind index (zero if "dead") */
+ s16b k_idx = 0; /* Kind index (zero if "dead") */
- byte iy; /* Y-position on map, or zero */
- byte ix; /* X-position on map, or zero */
+ byte iy = 0; /* Y-position on map, or zero */
+ byte ix = 0; /* X-position on map, or zero */
- byte tval; /* Item type (from kind) */
- byte sval; /* Item sub-type (from kind) */
+ byte tval = 0; /* Item type (from kind) */
+ byte sval = 0; /* Item sub-type (from kind) */
- s32b pval; /* Item extra-parameter */
- s16b pval2; /* Item extra-parameter for some special
- items*/
- s32b pval3; /* Item extra-parameter for some special
- items*/
+ s32b pval = 0; /* Item extra-parameter */
+ s16b pval2 = 0; /* Item extra-parameter for some special items */
+ s32b pval3 = 0; /* Item extra-parameter for some special items */
- byte discount; /* Discount (if any) */
+ byte discount = 0; /* Discount (if any) */
- byte number; /* Number of items */
+ byte number = 0; /* Number of items */
- s32b weight; /* Item weight */
+ s32b weight = 0; /* Item weight */
- byte elevel; /* Item exp level */
- s32b exp; /* Item exp */
+ byte elevel = 0; /* Item exp level */
+ s32b exp = 0; /* Item exp */
- byte name1; /* Artifact type, if any */
- s16b name2; /* Ego-Item type, if any */
- s16b name2b; /* Second Ego-Item type, if any */
+ byte name1 = 0; /* Artifact type, if any */
+ s16b name2 = 0; /* Ego-Item type, if any */
+ s16b name2b = 0; /* Second Ego-Item type, if any */
- byte xtra1; /* Extra info type */
- s16b xtra2; /* Extra info index */
+ byte xtra1 = 0; /* Extra info type */
+ s16b xtra2 = 0; /* Extra info index */
- s16b to_h; /* Plusses to hit */
- s16b to_d; /* Plusses to damage */
- s16b to_a; /* Plusses to AC */
+ s16b to_h = 0; /* Plusses to hit */
+ s16b to_d = 0; /* Plusses to damage */
+ s16b to_a = 0; /* Plusses to AC */
- s16b ac; /* Normal AC */
+ s16b ac = 0; /* Normal AC */
- byte dd, ds; /* Damage dice/sides */
+ byte dd = 0; /* Damage dice/sides */
+ byte ds = 0; /* Damage dice/sides */
- s16b timeout; /* Timeout Counter */
+ s16b timeout = 0; /* Timeout Counter */
- byte ident; /* Special flags */
+ byte ident = 0; /* Special flags */
- byte marked; /* Object is marked */
+ byte marked = 0; /* Object is marked */
- u16b note; /* Inscription index */
- u16b art_name; /* Artifact name (random artifacts) */
+ std::string inscription; /* Inscription index */
- u32b art_flags1; /* Flags, set 1 Alas, these were necessary */
- u32b art_flags2; /* Flags, set 2 for the random artifacts of*/
- u32b art_flags3; /* Flags, set 3 Zangband */
- u32b art_flags4; /* Flags, set 4 PernAngband */
- u32b art_flags5; /* Flags, set 5 PernAngband */
- u32b art_esp; /* Flags, set esp PernAngband */
+ std::string artifact_name; /* Artifact name */
- u32b art_oflags1; /* Obvious Flags, set 1 */
- u32b art_oflags2; /* Obvious Flags, set 2 */
- u32b art_oflags3; /* Obvious Flags, set 3 */
- u32b art_oflags4; /* Obvious Flags, set 4 */
- u32b art_oflags5; /* Obvious Flags, set 5 */
- u32b art_oesp; /* Obvious Flags, set esp */
+ object_flag_set art_flags; /* Flags */
+ object_flag_set art_oflags; /* Obvious flags */
- s16b held_m_idx; /* Monster holding us (if any) */
+ s16b held_m_idx = 0; /* Monster holding the object; if any */
- byte sense; /* Pseudo-id status */
+ byte sense = 0; /* Pseudo-id status */
- byte found; /* How did we find it */
- s16b found_aux1; /* Stores info for found */
- s16b found_aux2; /* Stores info for found */
- s16b found_aux3; /* Stores info for found */
- s16b found_aux4; /* Stores info for found */
+ byte found = 0; /* How did we find it */
+ s16b found_aux1 = 0; /* Stores info for found */
+ s16b found_aux2 = 0; /* Stores info for found */
+ s16b found_aux3 = 0; /* Stores info for found */
+ s16b found_aux4 = 0; /* Stores info for found */
};
diff --git a/src/option_type.hpp b/src/option_type.hpp
index 58834b79..4d8a7a51 100644
--- a/src/option_type.hpp
+++ b/src/option_type.hpp
@@ -8,17 +8,11 @@
struct option_type
{
/**
- * Address of actual option variable. NULL signals the
- * end of the table.
+ * Address of actual option variable.
*/
bool_ *o_var;
/**
- * Default value.
- */
- byte o_norm;
-
- /**
* Option page number.
*/
byte o_page;
diff --git a/src/options.cc b/src/options.cc
index 5501ab52..ea2f3172 100644
--- a/src/options.cc
+++ b/src/options.cc
@@ -1,89 +1,10 @@
#include "options.hpp"
-//
-// Option Set 1 -- User Interface
-//
-bool_ rogue_like_commands; /* Rogue-like commands */
-bool_ quick_messages; /* Activate quick messages */
-bool_ carry_query_flag; /* Prompt before picking things up */
-bool_ use_old_target; /* Use old target by default */
-bool_ always_pickup; /* Pick things up by default */
-bool_ always_repeat; /* Repeat obvious commands */
-bool_ ring_bell; /* Ring the bell (on errors, etc) */
-
-//
-// Option Set 2 -- Disturbance
-//
-bool_ find_ignore_stairs; /* Run past stairs */
-bool_ find_ignore_doors; /* Run through open doors */
-bool_ find_cut; /* Run past known corners */
-bool_ find_examine; /* Run into potential corners */
-bool_ disturb_move; /* Disturb whenever any monster moves */
-bool_ disturb_near; /* Disturb whenever viewable monster moves */
-bool_ disturb_panel; /* Disturb whenever map panel changes */
-bool_ disturb_detect; /* Disturb whenever leaving trap-detected area */
-bool_ disturb_state; /* Disturn whenever player state changes */
-bool_ disturb_minor; /* Disturb whenever boring things happen */
-bool_ disturb_other; /* Disturb whenever various things happen */
-bool_ alert_hitpoint; /* Alert user to critical hitpoints */
-bool_ alert_failure; /* Alert user to various failures */
-bool_ last_words; /* Get last words upon dying */
-bool_ small_levels; /* Allow unusually small dungeon levels */
-bool_ empty_levels; /* Allow empty 'arena' levels */
-bool_ confirm_stairs; /* Prompt before staircases... */
-bool_ wear_confirm; /* Confirm before putting on known cursed items */
-bool_ disturb_pets; /* Pets moving nearby disturb us */
-
-//
-// Option Set 3 -- Game-Play
-//
-bool_ auto_scum; /* Auto-scum for good levels */
-bool_ view_perma_grids; /* Map remembers all perma-lit grids */
-bool_ view_torch_grids; /* Map remembers all torch-lit grids */
-bool_ dungeon_align; /* Generate dungeons with aligned rooms */
-bool_ dungeon_stair; /* Generate dungeons with connected stairs */
-bool_ flow_by_sound; /* Monsters track new player location */
-bool_ smart_learn; /* Monsters learn from their mistakes */
-
-//
-// Option Set 4 -- Efficiency
-//
-bool_ view_reduce_lite; /* Reduce lite-radius when running */
-bool_ avoid_abort; /* Avoid checking for user abort */
-bool_ avoid_shimmer; /* Avoid processing extra shimmering */
-bool_ avoid_other; /* Avoid processing special colors */
-bool_ flush_failure; /* Flush input on any failure */
-bool_ flush_disturb; /* Flush input on disturbance */
-bool_ flush_command; /* Flush input before every command */
-bool_ fresh_before; /* Flush output before normal commands */
-bool_ fresh_after; /* Flush output after normal commands */
-bool_ fresh_message; /* Flush output after all messages */
-bool_ hilite_player; /* Hilite the player with the cursor */
-bool_ view_yellow_lite; /* Use special colors for torch-lit grids */
-bool_ view_bright_lite; /* Use special colors for 'viewable' grids */
-bool_ view_granite_lite; /* Use special colors for wall grids (slow) */
-bool_ view_special_lite; /* Use special colors for floor grids (slow) */
-bool_ center_player; /* Center view on player */
-
-//
-// Option Set 5 - ToME options
-//
-bool_ linear_stats;
-bool_ player_char_health; /* Display the player as a special symbol when in bad health ? */
-bool_ option_ingame_help; /* Ingame contextual help */
-bool_ auto_more; /* Auto more */
-bool_ inventory_no_move; /* In inventory option window, just erase the letters,
- * rather that displaying the list without the invalid
- * selections */
-
-//
-// Option Set 6 - Birth options
-//
-bool_ always_small_level;
-bool_ autoroll;
-bool_ fate_option;
-bool_ ironman_rooms;
-bool_ joke_monsters;
-bool_ point_based;
-bool_ preserve;
-bool_ no_selling;
+void options::reset_cheat_options()
+{
+ cheat_peek = FALSE;
+ cheat_hear = FALSE;
+ cheat_room = FALSE;
+ cheat_xtra = FALSE;
+ cheat_live = FALSE;
+}
diff --git a/src/options.hpp b/src/options.hpp
index 45e19cf7..c1ac35a9 100644
--- a/src/options.hpp
+++ b/src/options.hpp
@@ -1,89 +1,215 @@
#pragma once
#include "h-basic.h"
+#include "option_type.hpp"
-//
-// Option Set 1 -- User Interface.
-//
-extern bool_ rogue_like_commands;
-extern bool_ quick_messages;
-extern bool_ carry_query_flag;
-extern bool_ use_old_target;
-extern bool_ always_pickup;
-extern bool_ always_repeat;
-extern bool_ ring_bell;
-
-//
-// Option Set 2 -- Disturbance
-//
-extern bool_ find_ignore_stairs;
-extern bool_ find_ignore_doors;
-extern bool_ find_cut;
-extern bool_ find_examine;
-extern bool_ disturb_move;
-extern bool_ disturb_near;
-extern bool_ disturb_panel;
-extern bool_ disturb_detect;
-extern bool_ disturb_state;
-extern bool_ disturb_minor;
-extern bool_ disturb_other;
-extern bool_ alert_hitpoint;
-extern bool_ alert_failure;
-extern bool_ last_words;
-extern bool_ small_levels;
-extern bool_ empty_levels;
-extern bool_ confirm_stairs;
-extern bool_ wear_confirm;
-extern bool_ disturb_pets;
-
-//
-// Option Set 3 -- Game-Play
-//
-extern bool_ auto_scum;
-extern bool_ view_perma_grids;
-extern bool_ view_torch_grids;
-extern bool_ dungeon_align;
-extern bool_ dungeon_stair;
-extern bool_ flow_by_sound;
-extern bool_ smart_learn;
-
-//
-// Option Set 4 -- Efficiency
-//
-extern bool_ view_reduce_lite;
-extern bool_ avoid_abort;
-extern bool_ avoid_shimmer;
-extern bool_ avoid_other;
-extern bool_ flush_failure;
-extern bool_ flush_disturb;
-extern bool_ flush_command;
-extern bool_ fresh_before;
-extern bool_ fresh_after;
-extern bool_ fresh_message;
-extern bool_ hilite_player;
-extern bool_ view_yellow_lite;
-extern bool_ view_bright_lite;
-extern bool_ view_granite_lite;
-extern bool_ view_special_lite;
-extern bool_ center_player;
-
-//
-// Option Set 5 - ToME options
-//
-extern bool_ linear_stats;
-extern bool_ player_char_health;
-extern bool_ option_ingame_help;
-extern bool_ auto_more;
-extern bool_ inventory_no_move;
-
-//
-// Option Set 6 - Birth options
-//
-extern bool_ always_small_level;
-extern bool_ autoroll;
-extern bool_ fate_option;
-extern bool_ ironman_rooms;
-extern bool_ joke_monsters;
-extern bool_ point_based;
-extern bool_ preserve;
-extern bool_ no_selling;
+#include <vector>
+
+/**
+ * Game options accessible via the '=' menu.
+ */
+struct options {
+
+ //
+ // Option Set 1 -- User Interface
+ //
+ bool_ rogue_like_commands = FALSE; /* Rogue-like commands */
+ bool_ quick_messages = TRUE; /* Activate quick messages */
+ bool_ carry_query_flag = FALSE; /* Prompt before picking things up */
+ bool_ use_old_target = FALSE; /* Use old target by default */
+ bool_ always_pickup = FALSE; /* Pick things up by default */
+ bool_ always_repeat = TRUE; /* Repeat obvious commands */
+ bool_ ring_bell = FALSE; /* Ring the bell (on errors, etc) */
+
+ //
+ // Option Set 2 -- Disturbance
+ //
+ bool_ find_ignore_stairs = FALSE; /* Run past stairs */
+ bool_ find_ignore_doors = TRUE; /* Run through open doors */
+ bool_ find_cut = FALSE; /* Run past known corners */
+ bool_ find_examine = TRUE; /* Run into potential corners */
+ bool_ disturb_move = FALSE; /* Disturb whenever any monster moves */
+ bool_ disturb_near = TRUE; /* Disturb whenever viewable monster moves */
+ bool_ disturb_panel = TRUE; /* Disturb whenever map panel changes */
+ bool_ disturb_state = TRUE; /* Disturn whenever player state changes */
+ bool_ disturb_minor = TRUE; /* Disturb whenever boring things happen */
+ bool_ disturb_other = FALSE; /* Disturb whenever various things happen */
+ bool_ last_words = TRUE; /* Get last words upon dying */
+ bool_ wear_confirm = TRUE; /* Confirm before putting on known cursed items */
+ bool_ confirm_stairs = FALSE; /* Prompt before staircases... */
+ bool_ disturb_pets = FALSE; /* Pets moving nearby disturb us */
+
+ //
+ // Option Set 3 -- Game-Play
+ //
+ bool_ auto_scum = TRUE; /* Auto-scum for good levels */
+ bool_ view_perma_grids = TRUE; /* Map remembers all perma-lit grids */
+ bool_ view_torch_grids = FALSE; /* Map remembers all torch-lit grids */
+ bool_ dungeon_align = TRUE; /* Generate dungeons with aligned rooms */
+ bool_ dungeon_stair = TRUE; /* Generate dungeons with connected stairs */
+ bool_ flow_by_sound = FALSE; /* Monsters track new player location */
+ bool_ smart_learn = FALSE; /* Monsters learn from their mistakes */
+ bool_ small_levels = TRUE; /* Allow unusually small dungeon levels */
+ bool_ empty_levels = TRUE; /* Allow empty 'arena' levels */
+
+ //
+ // Option Set 4 -- Efficiency
+ //
+ bool_ view_reduce_lite = FALSE; /* Reduce lite-radius when running */
+ bool_ avoid_abort = FALSE; /* Avoid checking for user abort */
+ bool_ avoid_shimmer = FALSE; /* Avoid processing extra shimmering */
+ bool_ avoid_other = FALSE; /* Avoid processing special colors */
+ bool_ flush_failure = TRUE; /* Flush input on any failure */
+ bool_ flush_disturb = FALSE; /* Flush input on disturbance */
+ bool_ flush_command = FALSE; /* Flush input before every command */
+ bool_ fresh_before = TRUE; /* Flush output before normal commands */
+ bool_ fresh_after = FALSE; /* Flush output after normal commands */
+ bool_ fresh_message = FALSE; /* Flush output after all messages */
+ bool_ hilite_player = FALSE; /* Hilite the player with the cursor */
+ bool_ view_yellow_lite = FALSE; /* Use special colors for torch-lit grids */
+ bool_ view_bright_lite = FALSE; /* Use special colors for 'viewable' grids */
+ bool_ view_granite_lite = FALSE; /* Use special colors for wall grids (slow) */
+ bool_ view_special_lite = FALSE; /* Use special colors for floor grids (slow) */
+ bool_ center_player = FALSE; /* Center view on player */
+
+ //
+ // Option Set 5 - ToME options
+ //
+ bool_ ingame_help = TRUE; /* In-game contextual help? */
+ bool_ auto_more = FALSE; /* Auto more */
+ bool_ player_char_health = TRUE; /* Display the player as a special symbol when in bad health ? */
+ bool_ linear_stats = TRUE;
+
+ //
+ // Option Set 6 - Birth options
+ //
+ bool_ preserve = TRUE; /* Preserve artifacts */
+ bool_ autoroll = TRUE; /* Specify 'minimal' stats to roll */
+ bool_ point_based = FALSE; /* Generate character using a point system */
+ bool_ ironman_rooms = FALSE; /* Always generate very unusual rooms */
+ bool_ joke_monsters = FALSE; /* Allow 'joke' monsters */
+ bool_ always_small_level = FALSE; /* Force small levels */
+ bool_ fate_option = TRUE; /* Player can receive fates */
+ bool_ no_selling = FALSE; /* Player cannot sell items */
+
+ //
+ // Other options
+ //
+
+ bool_ cheat_peek = FALSE; /* Peek into object creation */
+ bool_ cheat_hear = FALSE; /* Peek into monster creation */
+ bool_ cheat_room = FALSE; /* Peek into dungeon creation */
+ bool_ cheat_xtra = FALSE; /* Peek into something else */
+ bool_ cheat_live = FALSE; /* Allow player to avoid death */
+
+ byte hitpoint_warn = 0; /* Hitpoint warning (0 to 9) */
+
+ byte delay_factor = 0; /* Delay factor (0 to 9) */
+
+ s16b autosave_freq = 100; /* Autosave frequency */
+ bool_ autosave_t = FALSE; /* Timed autosave */
+ bool_ autosave_l = FALSE; /* Autosave before entering new levels */
+
+ /**
+ * Option groups
+ */
+ std::vector<option_type> standard_options = {
+ // User-Interface
+ { &rogue_like_commands, 1, 0, "rogue_like_commands", "Rogue-like commands" },
+ { &quick_messages , 1, 1, "quick_messages" , "Activate quick messages" },
+ { &carry_query_flag , 1, 3, "carry_query_flag" , "Prompt before picking things up" },
+ { &use_old_target , 1, 4, "use_old_target" , "Use old target by default" },
+ { &always_pickup , 1, 5, "always_pickup" , "Pick things up by default" },
+ { &always_repeat , 1, 7, "always_repeat" , "Repeat obvious commands" },
+ { &ring_bell , 1, 18, "ring_bell" , "Audible bell (on errors, etc)" },
+ // Disturbance
+ { &find_ignore_stairs , 2, 0, "find_ignore_stairs" , "Run past stairs" },
+ { &find_ignore_doors , 2, 1, "find_ignore_doors" , "Run through open doors" },
+ { &find_cut , 2, 2, "find_cut" , "Run past known corners" },
+ { &find_examine , 2, 3, "find_examine" , "Run into potential corners" },
+ { &disturb_move , 2, 4, "disturb_move" , "Disturb whenever any monster moves" },
+ { &disturb_near , 2, 5, "disturb_near" , "Disturb whenever viewable monster moves" },
+ { &disturb_panel , 2, 6, "disturb_panel" , "Disturb whenever map panel changes" },
+ { &disturb_state , 2, 7, "disturb_state" , "Disturb whenever player state changes" },
+ { &disturb_minor , 2, 8, "disturb_minor" , "Disturb whenever boring things happen" },
+ { &disturb_other , 2, 9, "disturb_other" , "Disturb whenever random things happen" },
+ { &last_words , 2, 12, "last_words" , "Get last words when the character dies" },
+ { &wear_confirm , 2, 15, "confirm_wear" , "Confirm to wear/wield known cursed items" },
+ { &confirm_stairs , 2, 16, "confirm_stairs" , "Prompt before exiting a dungeon level" },
+ { &disturb_pets , 2, 17, "disturb_pets" , "Disturb when visible pets move" },
+ // Game-Play
+ { &auto_scum , 3, 1, "auto_scum" , "Auto-scum for good levels" },
+ { &view_perma_grids , 3, 6, "view_perma_grids" , "Map remembers all perma-lit grids" },
+ { &view_torch_grids , 3, 7, "view_torch_grids" , "Map remembers all torch-lit grids" },
+ { &dungeon_align , 3, 8, "dungeon_align" , "Generate dungeons with aligned rooms" },
+ { &dungeon_stair , 3, 9, "dungeon_stair" , "Generate dungeons with connected stairs" },
+ { &flow_by_sound , 3, 10, "flow_by_sound" , "Monsters chase current location (v.slow)" },
+ { &smart_learn , 3, 14, "smart_learn" , "Monsters learn from their mistakes" },
+ { &small_levels , 3, 17, "small_levels" , "Allow unusually small dungeon levels" },
+ { &empty_levels , 3, 18, "empty_levels" , "Allow empty 'arena' levels" },
+ // Efficiency
+ { &view_reduce_lite , 4, 0, "view_reduce_lite" , "Reduce lite-radius when running" },
+ { &avoid_abort , 4, 2, "avoid_abort" , "Avoid checking for user abort" },
+ { &avoid_shimmer , 4, 17, "avoid_shimmer" , "Avoid extra shimmering (fast)" },
+ { &avoid_other , 4, 3, "avoid_other" , "Avoid processing special colors (fast)" },
+ { &flush_failure , 4, 4, "flush_failure" , "Flush input on various failures" },
+ { &flush_disturb , 4, 5, "flush_disturb" , "Flush input whenever disturbed" },
+ { &flush_command , 4, 6, "flush_command" , "Flush input before every command" },
+ { &fresh_before , 4, 7, "fresh_before" , "Flush output before every command" },
+ { &fresh_after , 4, 8, "fresh_after" , "Flush output after every command" },
+ { &fresh_message , 4, 9, "fresh_message" , "Flush output after every message" },
+ { &hilite_player , 4, 11, "hilite_player" , "Hilite the player with the cursor" },
+ { &view_yellow_lite , 4, 12, "view_yellow_lite" , "Use special colors for torch-lit grids" },
+ { &view_bright_lite , 4, 13, "view_bright_lite" , "Use special colors for 'viewable' grids" },
+ { &view_granite_lite , 4, 14, "view_granite_lite" , "Use special colors for wall grids (slow)" },
+ { &view_special_lite , 4, 15, "view_special_lite" , "Use special colors for floor grids (slow)" },
+ { &center_player , 4, 16, "center_player" , "Center the view on the player (very slow)" },
+ // ToME options
+ { &ingame_help , 5, 1, "ingame_help" , "Ingame contextual help" },
+ { &auto_more , 5, 4, "auto_more" , "Automatically clear '-more-' prompts" },
+ { &player_char_health , 5, 6, "player_char_health" , "Player char represent his/her health" },
+ { &linear_stats , 5, 7, "linear_stats" , "Stats are represented in a linear way" },
+ // Birth Options
+ { &preserve , 6, 2, "preserve" , "Preserve artifacts" },
+ { &autoroll , 6, 3, "autoroll" , "Specify 'minimal' stats" },
+ { &point_based , 6, 17, "point_based" , "Generate character using a point system" },
+ { &ironman_rooms , 6, 6, "ironman_rooms" , "Always generate very unusual rooms" },
+ { &joke_monsters , 6, 14, "joke_monsters" , "Allow use of some 'joke' monsters" },
+ { &always_small_level , 6, 16, "always_small_level" , "Always make small levels" },
+ { &fate_option , 6, 18, "fate_option" , "You can receive fates, good or bad" },
+ { &no_selling , 6, 20, "no_selling" , "Items always sell for 0 gold" },
+ };
+
+ /*
+ * Cheating options
+ */
+ std::vector<option_type> cheat_options = {
+ { &cheat_peek, 0, 0, "cheat_peek", "Peek into object creation" },
+ { &cheat_hear, 0, 1, "cheat_hear", "Peek into monster creation" },
+ { &cheat_room, 0, 2, "cheat_room", "Peek into dungeon creation" },
+ { &cheat_xtra, 0, 3, "cheat_xtra", "Peek into something else" },
+ { &cheat_live, 0, 5, "cheat_live", "Allow player to avoid death" },
+ };
+
+ /**
+ * Autosave boolean options
+ */
+ std::vector<option_type> autosave_options {
+ { &autosave_l, 0, 6, "autosave_l", "Autosave when entering new levels" },
+ { &autosave_t, 0, 7, "autosave_t", "Timed autosave" }
+ };
+
+ /*
+ * Reset cheat options
+ */
+ void reset_cheat_options();
+
+ /**
+ * Convert delay_factor to milliseconds
+ */
+ int delay_factor_ms() const
+ {
+ return delay_factor * delay_factor * delay_factor;
+ }
+
+};
diff --git a/src/owner_type.hpp b/src/owner_type.hpp
index 703d3159..4c47dc48 100644
--- a/src/owner_type.hpp
+++ b/src/owner_type.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include <string>
+
#include "h-basic.h"
/*
@@ -10,30 +12,30 @@ struct owner_type
/**
* Name
*/
- const char *name;
+ std::string name;
/**
* Purse limit
*/
- s16b max_cost;
+ s16b max_cost = 0;
/**
* Inflation
*/
- s16b inflation;
+ s16b inflation = 0;
/**
* Liked/hated races.
*/
- u32b races[2][2];
+ u32b races[2][2] { };
/**
* Liked/hated classes
*/
- u32b classes[2][2];
+ u32b classes[2][2] { };
/**
* Costs for liked people
*/
- s16b costs[3];
+ s16b costs[3] { };
};
diff --git a/src/owner_type_fwd.hpp b/src/owner_type_fwd.hpp
deleted file mode 100644
index 20c25802..00000000
--- a/src/owner_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct owner_type;
diff --git a/src/player_class.hpp b/src/player_class.hpp
index d67d1d73..02d0fc11 100644
--- a/src/player_class.hpp
+++ b/src/player_class.hpp
@@ -2,104 +2,48 @@
#include "body.hpp"
#include "h-basic.h"
+#include "object_flag_set.hpp"
+#include "object_proto.hpp"
#include "player_defs.hpp"
+#include "player_level_flag.hpp"
+#include "player_race_flag_set.hpp"
+#include "player_shared.hpp"
#include "player_spec.hpp"
-
-/**
- * Maximum number of specialties.
- */
-constexpr int MAX_SPEC = 20;
+#include "skill_modifiers.hpp"
/**
* Player descriptor and runtime data.
*/
struct player_class
{
- const char *title; /* Type of class */
- char *desc; /* Small desc of the class */
- const char *titles[PY_MAX_LEVEL / 5];
- /* Titles */
-
- s16b c_adj[6]; /* Class stat modifier */
-
- s16b c_dis; /* class disarming */
- s16b c_dev; /* class magic devices */
- s16b c_sav; /* class saving throws */
- s16b c_stl; /* class stealth */
- s16b c_srh; /* class searching ability */
- s16b c_fos; /* class searching frequency */
- s16b c_thn; /* class to hit (normal) */
- s16b c_thb; /* class to hit (bows) */
-
- s16b x_dis; /* extra disarming */
- s16b x_dev; /* extra magic devices */
- s16b x_sav; /* extra saving throws */
- s16b x_stl; /* extra stealth */
- s16b x_srh; /* extra searching ability */
- s16b x_fos; /* extra searching frequency */
- s16b x_thn; /* extra to hit (normal) */
- s16b x_thb; /* extra to hit (bows) */
-
- s16b c_mhp; /* Class hit-dice adjustment */
- s16b c_exp; /* Class experience factor */
-
- s16b powers[4]; /* Powers of the class */
+ std::string title; /* Type of class */
+ std::string desc; /* Small desc of the class */
+ const char *titles[PY_MAX_LEVEL / 5] { }; /* Titles */
- s16b spell_book; /* Tval of spell books (if any) */
- s16b spell_stat; /* Stat for spells (if any) */
- s16b spell_lev; /* The higher it is the higher the spells level are */
- s16b spell_fail; /* The higher it is the higher the spells failure are */
- s16b spell_mana; /* The higher it is the higher the spells mana are */
- s16b spell_first; /* Level of first spell */
- s16b spell_weight; /* Weight that hurts spells */
- byte max_spell_level; /* Maximun spell level */
- byte magic_max_spell; /* Maximun numbner of spells one can learn by natural means */
+ int display_order_idx; /* Display order index; lowest first */
- u32b flags1; /* flags */
- u32b flags2; /* flags */
+ player_shared ps;
- s16b mana;
- s16b blow_num;
- s16b blow_wgt;
- s16b blow_mul;
- s16b extra_blows;
+ player_race_flag_set flags;
- s32b sense_base;
- s32b sense_pl;
- s32b sense_plus;
- byte sense_heavy;
- byte sense_heavy_magic;
+ s16b mana = 0;
+ s16b blow_num = 0;
+ s16b blow_wgt = 0;
+ s16b blow_mul = 0;
+ s16b extra_blows = 0;
- s16b obj_tval[5];
- s16b obj_sval[5];
- s16b obj_pval[5];
- s16b obj_dd[5];
- s16b obj_ds[5];
- s16b obj_num;
+ std::vector<object_proto> object_protos;
- char body_parts[BODY_MAX]; /* To help to decide what to use when body changing */
+ char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */
- u32b oflags1[PY_MAX_LEVEL + 1];
- u32b oflags2[PY_MAX_LEVEL + 1];
- u32b oflags3[PY_MAX_LEVEL + 1];
- u32b oflags4[PY_MAX_LEVEL + 1];
- u32b oflags5[PY_MAX_LEVEL + 1];
- u32b oesp[PY_MAX_LEVEL + 1];
- s16b opval[PY_MAX_LEVEL + 1];
+ std::array<player_level_flag, PY_MAX_LEVEL+1> lflags;
- char skill_basem[MAX_SKILLS];
- u32b skill_base[MAX_SKILLS];
- char skill_modm[MAX_SKILLS];
- s16b skill_mod[MAX_SKILLS];
+ struct skill_modifiers skill_modifiers;
- u32b gods;
+ u32b gods = 0;
- player_spec spec[MAX_SPEC];
+ std::vector<player_spec> spec;
- struct
- {
- s16b ability;
- s16b level;
- } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */
+ std::vector<player_race_ability_type> abilities; /* Abilities to be gained by level; ignores prereqs */
};
diff --git a/src/player_level_flag.hpp b/src/player_level_flag.hpp
new file mode 100644
index 00000000..fe4c862c
--- /dev/null
+++ b/src/player_level_flag.hpp
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "h-basic.h"
+#include "object_flag_set.hpp"
+#include "player_defs.hpp"
+
+struct player_level_flag {
+
+ object_flag_set oflags;
+
+ s16b pval = 0;
+
+};
diff --git a/src/player_race.hpp b/src/player_race.hpp
index edb304f2..e0b236db 100644
--- a/src/player_race.hpp
+++ b/src/player_race.hpp
@@ -2,82 +2,45 @@
#include "h-basic.h"
#include "body.hpp"
+#include "object_flag_set.hpp"
+#include "object_proto.hpp"
#include "player_defs.hpp"
-#include "skills_defs.hpp"
+#include "player_level_flag.hpp"
+#include "player_race_ability_type.hpp"
+#include "player_race_flag_set.hpp"
+#include "player_shared.hpp"
+#include "skill_modifiers.hpp"
+
+#include <array>
+#include <string>
+#include <vector>
+
/**
* Player racial descriptior.
*/
struct player_race
{
- const char *title; /* Type of race */
- char *desc;
-
- s16b r_adj[6]; /* Racial stat bonuses */
-
- char luck; /* Luck */
-
- s16b r_dis; /* disarming */
- s16b r_dev; /* magic devices */
- s16b r_sav; /* saving throw */
- s16b r_stl; /* stealth */
- s16b r_srh; /* search ability */
- s16b r_fos; /* search frequency */
- s16b r_thn; /* combat (normal) */
- s16b r_thb; /* combat (shooting) */
-
- byte r_mhp; /* Race hit-dice modifier */
- u16b r_exp; /* Race experience factor */
-
- byte b_age; /* base age */
- byte m_age; /* mod age */
-
- byte m_b_ht; /* base height (males) */
- byte m_m_ht; /* mod height (males) */
- byte m_b_wt; /* base weight (males) */
- byte m_m_wt; /* mod weight (males) */
-
- byte f_b_ht; /* base height (females) */
- byte f_m_ht; /* mod height (females) */
- byte f_b_wt; /* base weight (females) */
- byte f_m_wt; /* mod weight (females) */
+ std::string title; /* Type of race */
+ std::string desc;
- byte infra; /* Infra-vision range */
+ char luck = '\0'; /* Luck */
- u32b choice[2]; /* Legal class choices */
+ player_shared ps;
- s16b powers[4]; /* Powers of the race */
+ byte infra = 0; /* Infra-vision range */
- byte body_parts[BODY_MAX]; /* To help to decide what to use when body changing */
+ u32b choice[2] { }; /* Legal class choices */
- s16b chart; /* Chart history */
+ byte body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */
- u32b flags1;
- u32b flags2; /* flags */
+ player_race_flag_set flags;
- u32b oflags1[PY_MAX_LEVEL + 1];
- u32b oflags2[PY_MAX_LEVEL + 1];
- u32b oflags3[PY_MAX_LEVEL + 1];
- u32b oflags4[PY_MAX_LEVEL + 1];
- u32b oflags5[PY_MAX_LEVEL + 1];
- u32b oesp[PY_MAX_LEVEL + 1];
- s16b opval[PY_MAX_LEVEL + 1];
+ std::array<player_level_flag, PY_MAX_LEVEL+1> lflags;
- char skill_basem[MAX_SKILLS];
- u32b skill_base[MAX_SKILLS];
- char skill_modm[MAX_SKILLS];
- s16b skill_mod[MAX_SKILLS];
+ struct skill_modifiers skill_modifiers;
- s16b obj_tval[5];
- s16b obj_sval[5];
- s16b obj_pval[5];
- s16b obj_dd[5];
- s16b obj_ds[5];
- s16b obj_num;
+ std::vector<object_proto> object_protos;
- struct
- {
- s16b ability;
- s16b level;
- } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */
+ std::vector<player_race_ability_type> abilities; /* Abilities to be gained by level; ignores prereqs */
};
diff --git a/src/player_race_ability_type.hpp b/src/player_race_ability_type.hpp
new file mode 100644
index 00000000..5f520052
--- /dev/null
+++ b/src/player_race_ability_type.hpp
@@ -0,0 +1,9 @@
+#pragma once
+
+#include "h-basic.h"
+
+struct player_race_ability_type
+{
+ s16b ability = 0;
+ s16b level = 0;
+};
diff --git a/src/player_race_flag.hpp b/src/player_race_flag.hpp
new file mode 100644
index 00000000..1268c3c0
--- /dev/null
+++ b/src/player_race_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "player_race_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define PR(tier, index, name) \
+ DECLARE_FLAG(player_race_flag_set, BOOST_PP_CAT(PR_,name), tier, index)
+#include "player_race_flag_list.hpp"
+#undef PR
diff --git a/src/player_race_flag_list.hpp b/src/player_race_flag_list.hpp
new file mode 100644
index 00000000..5116ad87
--- /dev/null
+++ b/src/player_race_flag_list.hpp
@@ -0,0 +1,26 @@
+/**
+ * X-macro list of all the player race flags
+ */
+
+/* PR(<tier>, <index>, <name>) */
+
+PR(1, 0, EXPERIMENTAL) /* Experimental */
+PR(1, 1, RESIST_BLACK_BREATH) /* Resists black breath */
+PR(1, 2, NO_STUN) /* Cannot be stunned */
+PR(1, 3, XTRA_MIGHT_BOW) /* Xtra might with bows */
+PR(1, 4, XTRA_MIGHT_XBOW) /* Xtra might with x-bows */
+PR(1, 5, XTRA_MIGHT_SLING) /* Xtra might with slings */
+PR(1, 6, AC_LEVEL) /* AC increases with levels */
+PR(1, 7, HURT_LITE) /* Hurt by light */
+PR(1, 8, VAMPIRE) /* Vampire */
+PR(1, 9, UNDEAD) /* Undead */
+PR(1, 10, NO_CUT) /* No cuts */
+PR(1, 11, CORRUPT) /* Corrupted; automatically gains corruptions */
+PR(1, 12, NO_FOOD) /* Little gain from food */
+PR(1, 13, NO_GOD) /* Cannot worship any gods */
+PR(1, 14, ELF) /* Is an elf */
+PR(1, 15, SEMI_WRAITH) /* Allows walking through walls; taking damage */
+PR(1, 16, NO_SUBRACE_CHANGE) /* Impossible to change subrace */
+PR(1, 17, GOD_FRIEND) /* Better grace */
+PR(1, 18, EASE_STEAL) /* Gain XP by stealing */
+PR(1, 19, ASTRAL) /* Astral being from the halls of Mandos */
diff --git a/src/player_race_flag_set.hpp b/src/player_race_flag_set.hpp
new file mode 100644
index 00000000..4dd8dd9f
--- /dev/null
+++ b/src/player_race_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t PR_MAX_TIERS = 1;
+
+typedef flag_set<PR_MAX_TIERS> player_race_flag_set;
diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp
index 72f975ce..8eb984b7 100644
--- a/src/player_race_mod.hpp
+++ b/src/player_race_mod.hpp
@@ -2,86 +2,51 @@
#include "body.hpp"
#include "h-basic.h"
+#include "object_flag_set.hpp"
+#include "object_proto.hpp"
+#include "player_defs.hpp"
+#include "player_level_flag.hpp"
+#include "player_race_ability_type.hpp"
+#include "player_race_flag_set.hpp"
+#include "player_shared.hpp"
+#include "skill_modifiers.hpp"
#include "skills_defs.hpp"
+#include <array>
+#include <string>
+#include <vector>
+
struct player_race_mod
{
- char *title; /* Type of race mod */
- char *desc; /* Desc */
-
- bool_ place; /* TRUE = race race modifier, FALSE = Race modifier race */
-
- s16b r_adj[6]; /* (+) Racial stat bonuses */
-
- char luck; /* Luck */
- s16b mana; /* Mana % */
+ std::string title;
+ std::string description;
- s16b r_dis; /* (+) disarming */
- s16b r_dev; /* (+) magic devices */
- s16b r_sav; /* (+) saving throw */
- s16b r_stl; /* (+) stealth */
- s16b r_srh; /* (+) search ability */
- s16b r_fos; /* (+) search frequency */
- s16b r_thn; /* (+) combat (normal) */
- s16b r_thb; /* (+) combat (shooting) */
+ bool_ place = FALSE; /* TRUE = race race modifier, FALSE = Race modifier race */
- char r_mhp; /* (+) Race mod hit-dice modifier */
- s16b r_exp; /* (+) Race mod experience factor */
+ char luck = '\0'; /* Luck */
+ s16b mana = 0; /* Mana % */
- char b_age; /* (+) base age */
- char m_age; /* (+) mod age */
+ player_shared ps;
- char m_b_ht; /* (+) base height (males) */
- char m_m_ht; /* (+) mod height (males) */
- char m_b_wt; /* (+) base weight (males) */
- char m_m_wt; /* (+) mod weight (males) */
+ char infra = '\0'; /* (+) Infra-vision range */
- char f_b_ht; /* (+) base height (females) */
- char f_m_ht; /* (+) mod height (females) */
- char f_b_wt; /* (+) base weight (females) */
- char f_m_wt; /* (+) mod weight (females) */
+ u32b choice[2] { }; /* Legal race choices */
- char infra; /* (+) Infra-vision range */
+ u32b pclass[2] { }; /* Classes allowed */
+ u32b mclass[2] { }; /* Classes restricted */
- u32b choice[2]; /* Legal race choices */
+ char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */
- u32b pclass[2]; /* Classes allowed */
- u32b mclass[2]; /* Classes restricted */
+ player_race_flag_set flags;
- s16b powers[4]; /* Powers of the subrace */
+ std::array<player_level_flag, PY_MAX_LEVEL+1> lflags;
- char body_parts[BODY_MAX]; /* To help to decide what to use when body changing */
+ byte g_attr = 0; /* Overlay graphic attribute */
+ char g_char = '\0'; /* Overlay graphic character */
- u32b flags1;
- u32b flags2; /* flags */
+ struct skill_modifiers skill_modifiers;
- u32b oflags1[PY_MAX_LEVEL + 1];
- u32b oflags2[PY_MAX_LEVEL + 1];
- u32b oflags3[PY_MAX_LEVEL + 1];
- u32b oflags4[PY_MAX_LEVEL + 1];
- u32b oflags5[PY_MAX_LEVEL + 1];
- u32b oesp[PY_MAX_LEVEL + 1];
- s16b opval[PY_MAX_LEVEL + 1];
+ std::vector<object_proto> object_protos;
- byte g_attr; /* Overlay graphic attribute */
- char g_char; /* Overlay graphic character */
-
- char skill_basem[MAX_SKILLS];
- u32b skill_base[MAX_SKILLS];
- char skill_modm[MAX_SKILLS];
- s16b skill_mod[MAX_SKILLS];
-
- s16b obj_tval[5];
- s16b obj_sval[5];
- s16b obj_pval[5];
- s16b obj_dd[5];
- s16b obj_ds[5];
- s16b obj_num;
-
- struct
- {
- s16b ability;
- s16b level;
- } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */
+ std::vector<player_race_ability_type> abilities; /* Abilities to be gained by level; ignores prereqs */
};
-
diff --git a/src/player_sex.hpp b/src/player_sex.hpp
deleted file mode 100644
index 5722f1a4..00000000
--- a/src/player_sex.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-/**
- * Player sex descriptor.
- */
-struct player_sex
-{
- /**
- * Type of sex.
- */
- char const *title;
-
- /**
- * Winner title.
- */
- char const *winner;
-};
diff --git a/src/player_sex_fwd.hpp b/src/player_sex_fwd.hpp
deleted file mode 100644
index eabea488..00000000
--- a/src/player_sex_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct player_sex;
diff --git a/src/player_shared.hpp b/src/player_shared.hpp
new file mode 100644
index 00000000..1ae7b9a7
--- /dev/null
+++ b/src/player_shared.hpp
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "h-basic.h"
+#include "skills_defs.hpp"
+#include <array>
+#include <vector>
+
+struct player_shared
+{
+ std::array<s16b, 6> adj { }; /* Stat modifiers */
+
+ s16b mhp = 0; /* Hit-dice adjustment */
+ s16b exp = 0; /* Experience factor */
+
+ std::vector<s16b> powers; /* Powers */
+};
diff --git a/src/player_spec.hpp b/src/player_spec.hpp
index 28b32830..574425f6 100644
--- a/src/player_spec.hpp
+++ b/src/player_spec.hpp
@@ -1,38 +1,29 @@
#pragma once
#include "h-basic.h"
-#include "skills_defs.hpp"
+#include "object_proto.hpp"
+#include "player_race_ability_type.hpp"
+#include "player_race_flag_set.hpp"
+#include "skill_modifiers.hpp"
+
+#include <array>
+#include <vector>
/**
* Player class descriptor.
*/
struct player_spec
{
- const char *title; /* Type of class spec */
- char *desc; /* Small desc of the class spec */
-
- char skill_basem[MAX_SKILLS]; /* Mod for value */
- u32b skill_base[MAX_SKILLS]; /* value */
- char skill_modm[MAX_SKILLS]; /* mod for mod */
- s16b skill_mod[MAX_SKILLS]; /* mod */
+ const char *title = nullptr; /* Type of class spec */
+ char *desc = nullptr; /* Small desc of the class spec */
- u32b skill_ideal[MAX_SKILLS]; /* Ideal skill levels at level 50 */
+ struct skill_modifiers skill_modifiers;
- s16b obj_tval[5];
- s16b obj_sval[5];
- s16b obj_pval[5];
- s16b obj_dd[5];
- s16b obj_ds[5];
- s16b obj_num;
+ std::vector<object_proto> object_protos;
- u32b gods;
+ u32b gods = 0;
- u32b flags1;
- u32b flags2; /* flags */
+ player_race_flag_set flags;
- struct
- {
- s16b ability;
- s16b level;
- } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */
+ std::vector<player_race_ability_type> abilities; /* Abilities to be gained by level; ignores prereqs */
};
diff --git a/src/player_type.cc b/src/player_type.cc
new file mode 100644
index 00000000..0cc66de7
--- /dev/null
+++ b/src/player_type.cc
@@ -0,0 +1,28 @@
+#include "player_type.hpp"
+
+#include <algorithm>
+
+bool player_type::has_ability(u16b ability_idx) const
+{
+ return std::find(
+ abilities.begin(),
+ abilities.end(),
+ ability_idx) != abilities.end();
+}
+
+void player_type::gain_ability(u16b ability_idx)
+{
+ // Duplicates don't really matter, so let's just
+ // accept whatever value we get without checking
+ // anything.
+ abilities.push_back(ability_idx);
+}
+
+void player_type::lose_ability(u16b ability_idx)
+{
+ abilities.erase(
+ std::remove(
+ abilities.begin(),
+ abilities.end(),
+ ability_idx));
+}
diff --git a/src/player_type.hpp b/src/player_type.hpp
index d9410dcb..9b7ac21d 100644
--- a/src/player_type.hpp
+++ b/src/player_type.hpp
@@ -1,11 +1,16 @@
#pragma once
#include "corrupt.hpp"
+#include "defines.h"
#include "h-basic.h"
#include "help_info.hpp"
#include "inventory.hpp"
#include "object_type.hpp"
#include "powers.hpp"
+#include "random_spell.hpp"
+#include "spellbinder.hpp"
+
+#include <array>
/*
* Most of the "player" information goes here.
@@ -24,400 +29,400 @@
struct player_type
{
- s32b lives; /* How many times we resurected */
-
- s16b oldpy; /* Previous player location -KMW- */
- s16b oldpx; /* Previous player location -KMW- */
-
- s16b py; /* Player location */
- s16b px; /* Player location */
-
- byte psex; /* Sex index */
- byte prace; /* Race index */
- byte pracem; /* Race Mod index */
- byte pclass; /* Class index */
- byte pspec; /* Class spec index */
- byte mimic_form; /* Actualy transformation */
- s16b mimic_level; /* Level of the mimic effect */
- byte oops; /* Unused */
-
- object_type inventory[INVEN_TOTAL]; /* Player inventory */
-
- byte hitdie; /* Hit dice (sides) */
- u16b expfact; /* Experience factor */
-
- byte preserve; /* Preserve artifacts */
- byte special; /* Special levels */
- byte allow_one_death; /* Blood of life */
-
- s16b age; /* Characters age */
- s16b ht; /* Height */
- s16b wt; /* Weight */
- s16b sc; /* Social Class */
-
-
- s32b au; /* Current Gold */
-
- s32b max_exp; /* Max experience */
- s32b exp; /* Cur experience */
- u16b exp_frac; /* Cur exp frac (times 2^16) */
-
- s16b lev; /* Level */
-
- s16b town_num; /* Current town number */
- s16b inside_quest; /* Inside quest level */
-
- s32b wilderness_x; /* Coordinates in the wilderness */
- s32b wilderness_y;
- bool_ wild_mode; /* TRUE = Small map, FLASE = Big map */
- bool_ old_wild_mode; /* TRUE = Small map, FLASE = Big map */
-
- s16b mhp; /* Max hit pts */
- s16b chp; /* Cur hit pts */
- u16b chp_frac; /* Cur hit frac (times 2^16) */
- s16b hp_mod; /* A modificator(permanent) */
-
- s16b msp; /* Max mana pts */
- s16b csp; /* Cur mana pts */
- u16b csp_frac; /* Cur mana frac (times 2^16) */
-
- s16b msane; /* Max sanity */
- s16b csane; /* Cur sanity */
- u16b csane_frac; /* Cur sanity frac */
-
- s32b grace; /* Your God's appreciation factor. */
- s32b grace_delay; /* Delay factor for granting piety. */
- byte pgod; /* Your God. */
- bool_ praying; /* Praying to your god. */
- s16b melkor_sacrifice; /* How much hp has been sacrified for damage */
-
- s16b max_plv; /* Max Player Level */
-
- s16b stat_max[6]; /* Current "maximal" stat values */
- s16b stat_cur[6]; /* Current "natural" stat values */
-
- s16b luck_cur; /* Current "natural" luck value (range -30 <> 30) */
- s16b luck_max; /* Current "maximal base" luck value (range -30 <> 30) */
- s16b luck_base; /* Current "base" luck value (range -30 <> 30) */
-
- s16b speed_factor; /* Timed -- Fast */
- s16b fast; /* Timed -- Fast */
- s16b lightspeed; /* Timed -- Light Speed */
- s16b slow; /* Timed -- Slow */
- s16b blind; /* Timed -- Blindness */
- s16b paralyzed; /* Timed -- Paralysis */
- s16b confused; /* Timed -- Confusion */
- s16b afraid; /* Timed -- Fear */
- s16b image; /* Timed -- Hallucination */
- s16b poisoned; /* Timed -- Poisoned */
- s16b cut; /* Timed -- Cut */
- s16b stun; /* Timed -- Stun */
-
- s16b protevil; /* Timed -- Protection from Evil*/
- s16b protgood; /* Timed -- Protection from Good*/
- s16b protundead; /* Timed -- Protection from Undead*/
- s16b invuln; /* Timed -- Invulnerable */
- s16b hero; /* Timed -- Heroism */
- s16b shero; /* Timed -- Super Heroism */
- s16b shield; /* Timed -- Shield Spell */
- s16b shield_power; /* Timed -- Shield Spell Power */
- s16b shield_opt; /* Timed -- Shield Spell options */
- s16b shield_power_opt; /* Timed -- Shield Spell Power */
- s16b shield_power_opt2; /* Timed -- Shield Spell Power */
- s16b blessed; /* Timed -- Blessed */
- s16b tim_invis; /* Timed -- See Invisible */
- s16b tim_infra; /* Timed -- Infra Vision */
-
- s16b oppose_acid; /* Timed -- oppose acid */
- s16b oppose_elec; /* Timed -- oppose lightning */
- s16b oppose_fire; /* Timed -- oppose heat */
- s16b oppose_cold; /* Timed -- oppose cold */
- s16b oppose_pois; /* Timed -- oppose poison */
- s16b oppose_ld; /* Timed -- oppose light & dark */
- s16b oppose_cc; /* Timed -- oppose chaos & confusion */
- s16b oppose_ss; /* Timed -- oppose sound & shards */
- s16b oppose_nex; /* Timed -- oppose nexus */
-
- s16b tim_esp; /* Timed ESP */
- s16b tim_wraith; /* Timed wraithform */
- s16b tim_ffall; /* Timed Levitation */
- s16b tim_fly; /* Timed Levitation */
- s16b tim_poison; /* Timed poison hands */
- s16b tim_thunder; /* Timed thunderstorm */
- s16b tim_thunder_p1; /* Timed thunderstorm */
- s16b tim_thunder_p2; /* Timed thunderstorm */
-
- s16b tim_project; /* Timed project upon melee blow */
- s16b tim_project_dam;
- s16b tim_project_gf;
- s16b tim_project_rad;
- s16b tim_project_flag;
-
- s16b tim_roots; /* Timed roots */
- s16b tim_roots_ac;
- s16b tim_roots_dam;
-
- s16b tim_invisible; /* Timed Invisibility */
- s16b tim_inv_pow; /* Power of timed invisibility */
- s16b tim_mimic; /* Timed Mimic */
- s16b tim_lite; /* Timed Lite */
- s16b tim_regen; /* Timed extra regen */
- s16b tim_regen_pow; /* Timed extra regen power */
- s16b holy; /* Holy Aura */
- s16b strike; /* True Strike(+25 hit) */
- s16b tim_reflect; /* Timed Reflection */
- s16b tim_deadly; /* Timed deadly blow */
- s16b prob_travel; /* Timed probability travel */
- s16b disrupt_shield;/* Timed disruption shield */
- s16b parasite; /* Timed parasite */
- s16b parasite_r_idx;/* Timed parasite monster */
- s16b absorb_soul; /* Timed soul absordtion */
- s16b tim_magic_breath; /* Magical breathing -- can breath anywhere */
- s16b tim_water_breath; /* Water breathing -- can breath underwater */
- s16b tim_precognition; /* Timed precognition */
-
- s16b immov_cntr; /* Timed -- Last ``immovable'' command. */
-
- s16b recall_dungeon; /* Recall in which dungeon */
- s16b word_recall; /* Word of recall counter */
-
- s32b energy; /* Current energy */
-
- s16b food; /* Current nutrition */
-
- byte confusing; /* Glowing hands */
- byte searching; /* Currently searching */
-
- bool_ old_cumber_armor;
- bool_ old_cumber_glove;
- bool_ old_heavy_wield;
- bool_ old_heavy_shoot;
- bool_ old_icky_wield;
-
- s16b old_lite; /* Old radius of lite (if any) */
- s16b old_view; /* Old radius of view (if any) */
-
- s16b old_food_aux; /* Old value of food */
-
-
- bool_ cumber_armor; /* Mana draining armor */
- bool_ cumber_glove; /* Mana draining gloves */
- bool_ heavy_wield; /* Heavy weapon */
- bool_ heavy_shoot; /* Heavy shooter */
- bool_ icky_wield; /* Icky weapon */
- bool_ immovable; /* Immovable character */
-
- s16b cur_lite; /* Radius of lite (if any) */
-
-
- u32b notice; /* Special Updates (bit flags) */
- u32b update; /* Pending Updates (bit flags) */
- u32b redraw; /* Normal Redraws (bit flags) */
- u32b window; /* Window Redraws (bit flags) */
-
- s16b stat_use[6]; /* Current modified stats */
- s16b stat_top[6]; /* Maximal modified stats */
-
- s16b stat_add[6]; /* Modifiers to stat values */
- s16b stat_ind[6]; /* Indexes into stat tables */
- s16b stat_cnt[6]; /* Counter for temporary drains */
- s16b stat_los[6]; /* Amount of temporary drains */
-
- bool_ immune_acid; /* Immunity to acid */
- bool_ immune_elec; /* Immunity to lightning */
- bool_ immune_fire; /* Immunity to fire */
- bool_ immune_cold; /* Immunity to cold */
- bool_ immune_neth; /* Immunity to nether */
-
- bool_ resist_acid; /* Resist acid */
- bool_ resist_elec; /* Resist lightning */
- bool_ resist_fire; /* Resist fire */
- bool_ resist_cold; /* Resist cold */
- bool_ resist_pois; /* Resist poison */
-
- bool_ resist_conf; /* Resist confusion */
- bool_ resist_sound; /* Resist sound */
- bool_ resist_lite; /* Resist light */
- bool_ resist_dark; /* Resist darkness */
- bool_ resist_chaos; /* Resist chaos */
- bool_ resist_disen; /* Resist disenchant */
- bool_ resist_shard; /* Resist shards */
- bool_ resist_nexus; /* Resist nexus */
- bool_ resist_blind; /* Resist blindness */
- bool_ resist_neth; /* Resist nether */
- bool_ resist_fear; /* Resist fear */
- bool_ resist_continuum; /* Resist space-time continuum disruption */
-
- bool_ sensible_fire; /* Fire does more damage on the player */
- bool_ sensible_lite; /* Lite does more damage on the player and blinds her/him */
-
- bool_ reflect; /* Reflect 'bolt' attacks */
- bool_ sh_fire; /* Fiery 'immolation' effect */
- bool_ sh_elec; /* Electric 'immolation' effect */
- bool_ wraith_form; /* wraithform */
-
- bool_ anti_magic; /* Anti-magic */
- bool_ anti_tele; /* Prevent teleportation */
-
- bool_ sustain_str; /* Keep strength */
- bool_ sustain_int; /* Keep intelligence */
- bool_ sustain_wis; /* Keep wisdom */
- bool_ sustain_dex; /* Keep dexterity */
- bool_ sustain_con; /* Keep constitution */
- bool_ sustain_chr; /* Keep charisma */
-
- bool_ aggravate; /* Aggravate monsters */
- bool_ teleport; /* Random teleporting */
-
- bool_ exp_drain; /* Experience draining */
- byte drain_mana; /* mana draining */
- byte drain_life; /* hp draining */
-
- bool_ magical_breath; /* Magical breathing -- can breath anywhere */
- bool_ water_breath; /* Water breathing -- can breath underwater */
- bool_ climb; /* Can climb mountains */
- bool_ fly; /* Can fly over some features */
- bool_ ffall; /* No damage falling */
- bool_ lite; /* Permanent light */
- bool_ free_act; /* Never paralyzed */
- bool_ see_inv; /* Can see invisible */
- bool_ regenerate; /* Regenerate hit pts */
- bool_ hold_life; /* Resist life draining */
- u32b telepathy; /* Telepathy */
- bool_ slow_digest; /* Slower digestion */
- bool_ bless_blade; /* Blessed blade */
- byte xtra_might; /* Extra might bow */
- bool_ impact; /* Earthquake blows */
- bool_ auto_id; /* Auto id items */
-
- s16b invis; /* Invisibility */
-
- s16b dis_to_h; /* Known bonus to hit */
- s16b dis_to_d; /* Known bonus to dam */
- s16b dis_to_a; /* Known bonus to ac */
-
- s16b dis_ac; /* Known base ac */
-
- s16b to_l; /* Bonus to life */
- s16b to_m; /* Bonus to mana */
- s16b to_s; /* Bonus to spell */
- s16b to_h; /* Bonus to hit */
- s16b to_d; /* Bonus to dam */
- s16b to_h_melee; /* Bonus to hit for melee */
- s16b to_d_melee; /* Bonus to dam for melee */
- s16b to_h_ranged; /* Bonus to hit for ranged */
- s16b to_d_ranged; /* Bonus to dam for ranged */
- s16b to_a; /* Bonus to ac */
-
- s16b ac; /* Base ac */
-
- byte antimagic; /* Power of the anti magic field */
- byte antimagic_dis; /* Radius of the anti magic field */
-
- s16b see_infra; /* Infravision range */
-
- s16b skill_dis; /* Skill: Disarming */
- s16b skill_dev; /* Skill: Magic Devices */
- s16b skill_sav; /* Skill: Saving throw */
- s16b skill_stl; /* Skill: Stealth factor */
- s16b skill_srh; /* Skill: Searching ability */
- s16b skill_fos; /* Skill: Searching frequency */
- s16b skill_thn; /* Skill: To hit (normal) */
- s16b skill_thb; /* Skill: To hit (shooting) */
- s16b skill_tht; /* Skill: To hit (throwing) */
- s16b skill_dig; /* Skill: Digging */
-
- s16b num_blow; /* Number of blows */
- s16b num_fire; /* Number of shots */
- s16b xtra_crit; /* % of increased crits */
-
- byte throw_mult; /* Multiplier for throw damage */
-
- byte tval_ammo; /* Correct ammo tval */
-
- s16b pspeed; /* Current speed */
-
- u32b mimic_extra; /* Mimicry powers use that */
- u32b antimagic_extra; /* Antimagic powers */
- u32b music_extra; /* Music songs */
- u32b necro_extra; /* Necro powers */
- u32b necro_extra2; /* Necro powers */
-
- s16b dodge_chance; /* Dodging chance */
-
- u32b maintain_sum; /* Do we have partial summons */
+ s32b lives = 0; /* How many times we resurected */
+
+ s16b oldpy = 0; /* Previous player location */
+ s16b oldpx = 0; /* Previous player location */
+
+ s16b py = 0; /* Player location */
+ s16b px = 0; /* Player location */
+
+ byte prace = 0; /* Race index */
+ byte pracem = 0; /* Race Mod index */
+ byte pclass = 0; /* Class index */
+ byte pspec = 0; /* Class spec index */
+ byte mimic_form = 0; /* Actualy transformation */
+ s16b mimic_level = 0; /* Level of the mimic effect */
+
+ std::array<object_type, INVEN_TOTAL> inventory { }; /* Player inventory */
+
+ byte hitdie = 0; /* Hit dice (sides) */
+ u16b expfact = 0; /* Experience factor */
+
+ byte allow_one_death = 0; /* Blood of life */
+
+ s32b au = 0; /* Current Gold */
+
+ s32b max_exp = 0; /* Max experience */
+ s32b exp = 0; /* Cur experience */
+ u16b exp_frac = 0; /* Cur exp frac (times 2^16) */
+
+ s16b lev = 0; /* Level */
+
+ s16b town_num = 0; /* Current town number */
+ s16b inside_quest = 0; /* Inside quest level */
+
+ s32b wilderness_x = 0; /* Coordinates in the wilderness */
+ s32b wilderness_y = 0;
+ bool_ wild_mode = FALSE; /* TRUE = Small map, FLASE = Big map */
+ bool_ old_wild_mode = FALSE; /* TRUE = Small map, FLASE = Big map */
+
+ s16b mhp = 0; /* Max hit pts */
+ s16b chp = 0; /* Cur hit pts */
+ u16b chp_frac = 0; /* Cur hit frac (times 2^16) */
+ s16b hp_mod = 0; /* A modificator (permanent) */
+
+ s16b msp = 0; /* Max mana pts */
+ s16b csp = 0; /* Cur mana pts */
+ u16b csp_frac = 0; /* Cur mana frac (times 2^16) */
+
+ s16b msane = 0; /* Max sanity */
+ s16b csane = 0; /* Cur sanity */
+ u16b csane_frac = 0; /* Cur sanity frac */
+
+ s32b grace = 0; /* Your God's appreciation factor. */
+ s32b grace_delay = 0; /* Delay factor for granting piety. */
+ byte pgod = 0; /* Your God. */
+ bool_ praying = FALSE; /* Praying to your god. */
+ s16b melkor_sacrifice = 0; /* How much hp has been sacrified for damage */
+
+ s16b max_plv = 0; /* Max Player Level */
+
+ s16b stat_max[6] = { 0 }; /* Current "maximal" stat values */
+ s16b stat_cur[6] = { 0 }; /* Current "natural" stat values */
+
+ s16b luck_cur = 0; /* Current "natural" luck value (range -30 <> 30) */
+ s16b luck_max = 0; /* Current "maximal base" luck value (range -30 <> 30) */
+ s16b luck_base = 0; /* Current "base" luck value (range -30 <> 30) */
+
+ s16b speed_factor = 0; /* Timed -- Fast */
+ s16b fast = 0; /* Timed -- Fast */
+ s16b lightspeed = 0; /* Timed -- Light Speed */
+ s16b slow = 0; /* Timed -- Slow */
+ s16b blind = 0; /* Timed -- Blindness */
+ s16b paralyzed = 0; /* Timed -- Paralysis */
+ s16b confused = 0; /* Timed -- Confusion */
+ s16b afraid = 0; /* Timed -- Fear */
+ s16b image = 0; /* Timed -- Hallucination */
+ s16b poisoned = 0; /* Timed -- Poisoned */
+ s16b cut = 0; /* Timed -- Cut */
+ s16b stun = 0; /* Timed -- Stun */
+
+ s16b protevil = 0; /* Timed -- Protection from Evil*/
+ s16b invuln = 0; /* Timed -- Invulnerable */
+ s16b hero = 0; /* Timed -- Heroism */
+ s16b shero = 0; /* Timed -- Super Heroism */
+ s16b shield = 0; /* Timed -- Shield Spell */
+ s16b shield_power = 0; /* Timed -- Shield Spell Power */
+ s16b shield_opt = 0; /* Timed -- Shield Spell options */
+ s16b shield_power_opt = 0; /* Timed -- Shield Spell Power */
+ s16b shield_power_opt2 = 0; /* Timed -- Shield Spell Power */
+ s16b blessed = 0; /* Timed -- Blessed */
+ s16b tim_invis = 0; /* Timed -- See Invisible */
+ s16b tim_infra = 0; /* Timed -- Infra Vision */
+
+ s16b oppose_acid = 0; /* Timed -- oppose acid */
+ s16b oppose_elec = 0; /* Timed -- oppose lightning */
+ s16b oppose_fire = 0; /* Timed -- oppose heat */
+ s16b oppose_cold = 0; /* Timed -- oppose cold */
+ s16b oppose_pois = 0; /* Timed -- oppose poison */
+ s16b oppose_cc = 0; /* Timed -- oppose chaos & confusion */
+
+ s16b tim_esp = 0; /* Timed ESP */
+ s16b tim_wraith = 0; /* Timed wraithform */
+ s16b tim_ffall = 0; /* Timed Levitation */
+ s16b tim_fly = 0; /* Timed Levitation */
+ s16b tim_poison = 0; /* Timed poison hands */
+ s16b tim_thunder = 0; /* Timed thunderstorm */
+ s16b tim_thunder_p1 = 0; /* Timed thunderstorm */
+ s16b tim_thunder_p2 = 0; /* Timed thunderstorm */
+
+ s16b tim_project = 0; /* Timed project upon melee blow */
+ s16b tim_project_dam = 0;
+ s16b tim_project_gf = 0;
+ s16b tim_project_rad = 0;
+ s16b tim_project_flag = 0;
+
+ s16b tim_roots = 0; /* Timed roots */
+ s16b tim_roots_ac = 0;
+ s16b tim_roots_dam = 0;
+
+ s16b tim_invisible = 0; /* Timed Invisibility */
+ s16b tim_inv_pow = 0; /* Power of timed invisibility */
+ s16b tim_mimic = 0; /* Timed Mimic */
+ s16b tim_lite = 0; /* Timed Lite */
+ s16b tim_regen = 0; /* Timed extra regen */
+ s16b tim_regen_pow = 0; /* Timed extra regen power */
+ s16b holy = 0; /* Holy Aura */
+ s16b strike = 0; /* True Strike(+25 hit) */
+ s16b tim_reflect = 0; /* Timed Reflection */
+ s16b tim_deadly = 0; /* Timed deadly blow */
+ s16b prob_travel = 0; /* Timed probability travel */
+ s16b disrupt_shield = 0; /* Timed disruption shield */
+ s16b parasite = 0; /* Timed parasite */
+ s16b parasite_r_idx = 0; /* Timed parasite monster */
+ s16b absorb_soul = 0; /* Timed soul absordtion */
+ s16b tim_magic_breath = 0; /* Magical breathing -- can breath anywhere */
+ s16b tim_water_breath = 0; /* Water breathing -- can breath underwater */
+ s16b tim_precognition = 0; /* Timed precognition */
+
+ s16b immov_cntr = 0; /* Timed -- Last ``immovable'' command. */
+
+ byte recall_dungeon = 0; /* Recall in which dungeon */
+ s16b word_recall = 0; /* Word of recall counter */
+
+ s32b energy = 0; /* Current energy */
+
+ s16b food = 0; /* Current nutrition */
+
+ byte confusing = 0; /* Glowing hands */
+
+ bool_ old_cumber_armor = FALSE;
+ bool_ old_cumber_glove = FALSE;
+ bool_ old_heavy_wield = FALSE;
+ bool_ old_heavy_shoot = FALSE;
+ bool_ old_icky_wield = FALSE;
+
+ s16b old_lite = 0; /* Old radius of lite (if any) */
+ s16b old_view = 0; /* Old radius of view (if any) */
+
+ s16b old_food_aux = 0; /* Old value of food */
+
+ bool_ cumber_armor = FALSE; /* Mana draining armor */
+ bool_ cumber_glove = FALSE; /* Mana draining gloves */
+ bool_ heavy_wield = FALSE; /* Heavy weapon */
+ bool_ heavy_shoot = FALSE; /* Heavy shooter */
+ bool_ icky_wield = FALSE; /* Icky weapon */
+ bool_ immovable = FALSE; /* Immovable character */
+
+ s16b cur_lite = 0; /* Radius of lite (if any) */
+
+ u32b notice = 0; /* Special Updates (bit flags) */
+ u32b update = 0; /* Pending Updates (bit flags) */
+ u32b redraw = 0; /* Normal Redraws (bit flags) */
+ u32b window = 0; /* Window Redraws (bit flags) */
+
+ s16b stat_use[6] = { 0 }; /* Current modified stats */
+ s16b stat_top[6] = { 0 }; /* Maximal modified stats */
+
+ s16b stat_add[6] = { 0 }; /* Modifiers to stat values */
+ s16b stat_ind[6] = { 0 }; /* Indexes into stat tables */
+ s16b stat_cnt[6] = { 0 }; /* Counter for temporary drains */
+ s16b stat_los[6] = { 0 }; /* Amount of temporary drains */
+
+ bool_ immune_acid = FALSE; /* Immunity to acid */
+ bool_ immune_elec = FALSE; /* Immunity to lightning */
+ bool_ immune_fire = FALSE; /* Immunity to fire */
+ bool_ immune_cold = FALSE; /* Immunity to cold */
+ bool_ immune_neth = FALSE; /* Immunity to nether */
+
+ bool_ resist_acid = FALSE; /* Resist acid */
+ bool_ resist_elec = FALSE; /* Resist lightning */
+ bool_ resist_fire = FALSE; /* Resist fire */
+ bool_ resist_cold = FALSE; /* Resist cold */
+ bool_ resist_pois = FALSE; /* Resist poison */
+
+ bool_ resist_conf = FALSE; /* Resist confusion */
+ bool_ resist_sound = FALSE; /* Resist sound */
+ bool_ resist_lite = FALSE; /* Resist light */
+ bool_ resist_dark = FALSE; /* Resist darkness */
+ bool_ resist_chaos = FALSE; /* Resist chaos */
+ bool_ resist_disen = FALSE; /* Resist disenchant */
+ bool_ resist_shard = FALSE; /* Resist shards */
+ bool_ resist_nexus = FALSE; /* Resist nexus */
+ bool_ resist_blind = FALSE; /* Resist blindness */
+ bool_ resist_neth = FALSE; /* Resist nether */
+ bool_ resist_fear = FALSE; /* Resist fear */
+ bool_ resist_continuum = FALSE; /* Resist space-time continuum disruption */
+
+ bool_ sensible_fire = FALSE; /* Fire does more damage on the player */
+ bool_ sensible_lite = FALSE; /* Lite does more damage on the player and blinds her/him */
+
+ bool_ reflect = FALSE; /* Reflect 'bolt' attacks */
+ bool_ sh_fire = FALSE; /* Fiery 'immolation' effect */
+ bool_ sh_elec = FALSE; /* Electric 'immolation' effect */
+ bool_ wraith_form = FALSE; /* wraithform */
+
+ bool_ anti_magic = FALSE; /* Anti-magic */
+ bool_ anti_tele = FALSE; /* Prevent teleportation */
+
+ bool_ sustain_str = FALSE; /* Keep strength */
+ bool_ sustain_int = FALSE; /* Keep intelligence */
+ bool_ sustain_wis = FALSE; /* Keep wisdom */
+ bool_ sustain_dex = FALSE; /* Keep dexterity */
+ bool_ sustain_con = FALSE; /* Keep constitution */
+ bool_ sustain_chr = FALSE; /* Keep charisma */
+
+ bool_ aggravate = FALSE; /* Aggravate monsters */
+ bool_ teleport = FALSE; /* Random teleporting */
+
+ bool_ exp_drain = FALSE; /* Experience draining */
+ byte drain_mana = FALSE; /* mana draining */
+ byte drain_life = FALSE; /* hp draining */
+
+ bool_ magical_breath = FALSE; /* Magical breathing -- can breath anywhere */
+ bool_ water_breath = FALSE; /* Water breathing -- can breath underwater */
+ bool_ climb = FALSE; /* Can climb mountains */
+ bool_ fly = FALSE; /* Can fly over some features */
+ bool_ ffall = FALSE; /* No damage falling */
+ bool_ lite = FALSE; /* Permanent light */
+ bool_ free_act = FALSE; /* Never paralyzed */
+ bool_ see_inv = FALSE; /* Can see invisible */
+ bool_ regenerate = FALSE; /* Regenerate hit pts */
+ bool_ hold_life = FALSE; /* Resist life draining */
+ bool_ slow_digest = FALSE; /* Slower digestion */
+ bool_ bless_blade = FALSE; /* Blessed blade */
+ byte xtra_might = 0; /* Extra might bow */
+ bool_ impact = FALSE; /* Earthquake blows */
+ bool_ auto_id = FALSE; /* Auto id items */
+
+ s16b invis = 0; /* Invisibility */
+
+ s16b dis_to_h = 0; /* Known bonus to hit */
+ s16b dis_to_d = 0; /* Known bonus to dam */
+ s16b dis_to_a = 0; /* Known bonus to ac */
+
+ s16b dis_ac = 0; /* Known base ac */
+
+ s16b to_l = 0; /* Bonus to life */
+ s16b to_m = 0; /* Bonus to mana */
+ s16b to_s = 0; /* Bonus to spell */
+ s16b to_h = 0; /* Bonus to hit */
+ s16b to_d = 0; /* Bonus to dam */
+ s16b to_h_melee = 0; /* Bonus to hit for melee */
+ s16b to_d_melee = 0; /* Bonus to dam for melee */
+ s16b to_h_ranged = 0; /* Bonus to hit for ranged */
+ s16b to_d_ranged = 0; /* Bonus to dam for ranged */
+ s16b to_a = 0; /* Bonus to ac */
+
+ s16b ac = 0; /* Base ac */
+
+ byte antimagic = 0; /* Power of the anti magic field */
+ byte antimagic_dis = 0; /* Radius of the anti magic field */
+
+ s16b see_infra; /* Infravision range */
+
+ s16b skill_dev = 0; /* Skill: Magic Devices */
+ s16b skill_sav = 0; /* Skill: Saving throw */
+ s16b skill_stl = 0; /* Skill: Stealth factor */
+ s16b skill_thn = 0; /* Skill: To hit (normal) */
+ s16b skill_thb = 0; /* Skill: To hit (shooting) */
+ s16b skill_tht = 0; /* Skill: To hit (throwing) */
+ s16b skill_dig = 0; /* Skill: Digging */
+
+ s16b num_blow = 0; /* Number of blows */
+ s16b num_fire = 0; /* Number of shots */
+ s16b xtra_crit = 0; /* % of increased crits */
+
+ byte throw_mult = 0; /* Multiplier for throw damage */
+
+ byte tval_ammo = 0; /* Correct ammo tval */
+
+ s16b pspeed = 0; /* Current speed */
+
+ u32b mimic_extra = 0; /* Mimicry powers use that */
+ u32b antimagic_extra = 0; /* Antimagic powers */
+ u32b music_extra = 0; /* Music songs */
+ u32b necro_extra = 0; /* Necro powers */
+ u32b necro_extra2 = 0; /* Necro powers */
+
+ s16b dodge_chance = 0; /* Dodging chance */
+
+ u32b maintain_sum = 0; /* Do we have partial summons */
- byte spellbinder_num; /* Number of spells bound */
- u32b spellbinder[4]; /* Spell bounds */
- byte spellbinder_trigger; /* Spellbinder trigger condition */
+ struct spellbinder spellbinder;
- cptr mimic_name;
-
- char tactic; /* from 128-4 extremely coward to */
- /* 128+4 berserker */
- char movement; /* base movement way */
-
- s16b companion_killed; /* Number of companion death */
+ cptr mimic_name = nullptr;
- bool_ no_mortal; /* Fated to never die by the hand of a mortal being */
-
- bool_ black_breath; /* The Tolkien's Black Breath */
+ char tactic = '\0'; /* from 128-4 "extremely coward" to, 128+4 "berserker" */
+ char movement = '\0'; /* base movement way */
- bool_ precognition; /* Like the cheat mode */
+ s16b companion_killed = 0; /* Number of companion death */
- /*** Extra flags -- used for lua and easying stuff ***/
- u32b xtra_f1;
- u32b xtra_f2;
- u32b xtra_f3;
- u32b xtra_f4;
- u32b xtra_f5;
- u32b xtra_esp;
+ bool_ no_mortal = FALSE; /* Fated to never die by the hand of a mortal being */
+
+ bool_ black_breath = FALSE; /* The Tolkien's Black Breath */
+
+ bool_ precognition = FALSE; /* Like the cheat mode */
+
+ /*** Extra flags ***/
+ object_flag_set xtra_flags;
+
+ /** Computed flags based on all worn items, etc. */
+ object_flag_set computed_flags;
/* Corruptions */
- bool_ corruptions[CORRUPTIONS_MAX];
- bool_ corrupt_anti_teleport_stopped;
+ bool_ corruptions[CORRUPTIONS_MAX] = { FALSE };
+ bool_ corrupt_anti_teleport_stopped = FALSE;
/*** Pet commands ***/
- byte pet_follow_distance; /* Length of the imaginary "leash" for pets */
- byte pet_open_doors; /* flag - allow pets to open doors */
- byte pet_pickup_items; /* flag - allow pets to pickup items */
+ byte pet_follow_distance = 0; /* Length of the imaginary "leash" for pets */
+ byte pet_open_doors = 0; /* flag - allow pets to open doors */
+ byte pet_pickup_items = 0; /* flag - allow pets to pickup items */
- s16b control; /* Controlled monster */
- byte control_dir; /* Controlled monster */
+ s16b control = 0; /* Controlled monster */
+ byte control_dir; /* Controlled monster */
/*** Body changing variables ***/
- u16b body_monster; /* In which body is the player */
- bool_ disembodied; /* Is the player in a body ? */
- byte body_parts[INVEN_TOTAL - INVEN_WIELD]; /* Which body parts does he have ? */
+ u16b body_monster = 0; /* In which body is the player */
+ bool_ disembodied = FALSE; /* Is the player in a body ? */
+ std::array<byte, INVEN_TOTAL-INVEN_WIELD> body_parts = /* Which body parts does he have ? */
+ { };
/* Astral */
- bool_ astral; /* We started at the bottom ? */
+ bool_ astral = FALSE; /* We started at the bottom ? */
/* Powers */
- bool_ powers[POWER_MAX]; /* Actual powers */
- bool_ powers_mod[POWER_MAX]; /* Intrinsinc powers */
+ bool_ powers[POWER_MAX] = { FALSE }; /* Actual powers */
+ bool_ powers_mod[POWER_MAX] = { FALSE }; /* Intrinsinc powers */
+
+ /* Acquired abilities; indexes into ab_info[] */
+ std::vector<u16b> abilities;
+
+ /* Known inscriptions; true if known, false otherwise. */
+ std::array<bool, MAX_INSCRIPTIONS> inscriptions;
/* Skills */
- s16b skill_points;
- s16b skill_last_level; /* Prevents gaining skills by losing level and regaining them */
- s16b melee_style; /* How are */
- s16b use_piercing_shots; /* for archery */
+ s16b skill_points = 0;
+ s16b skill_last_level = 0; /* Prevents gaining skills by losing level and regaining them */
+ s16b melee_style = 0; /* How are */
+ s16b use_piercing_shots = 0; /* for archery */
/* Dripping Tread spell timer */
- s16b dripping_tread;
+ s16b dripping_tread = 0;
/* Help */
help_info help;
/* Inertia control */
- s32b inertia_controlled_spell;
+ s32b inertia_controlled_spell = 0;
/* For automatic stat-gain */
- s16b last_rewarded_level;
+ s16b last_rewarded_level = 0;
/*** Temporary fields ***/
- bool_ did_nothing; /* True if the last action wasnt a real action */
- bool_ leaving; /* True if player is leaving */
-};
+ bool_ did_nothing = FALSE; /* True if the last action wasnt a real action */
+ bool_ leaving = FALSE; /* True if player is leaving */
+
+ /**
+ * Random spells.
+ */
+ std::vector<random_spell> random_spells;
+
+ /**
+ * Does the player have the given ability?
+ */
+ bool has_ability(u16b ability_idx) const;
+ /**
+ * Gain the given ability.
+ */
+ void gain_ability(u16b ability_idx);
+
+ /**
+ * Lose the given ability.
+ */
+ void lose_ability(u16b ability_idx);
+
+};
diff --git a/src/point.hpp b/src/point.hpp
new file mode 100644
index 00000000..c0c12f58
--- /dev/null
+++ b/src/point.hpp
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <cstdint>
+
+struct point {
+
+private:
+ std::uint8_t m_x;
+ std::uint8_t m_y;
+
+public:
+ point(std::uint8_t x, std::uint8_t y)
+ : m_x(x), m_y(y) {
+ }
+
+ std::uint8_t x() const {
+ return m_x;
+ }
+
+ std::uint8_t y() const {
+ return m_y;
+ }
+
+};
diff --git a/src/powers.cc b/src/powers.cc
index a7db2968..f3ffe668 100644
--- a/src/powers.cc
+++ b/src/powers.cc
@@ -13,25 +13,27 @@
#include "cmd1.hpp"
#include "cmd2.hpp"
#include "cmd7.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "mimic.hpp"
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "spells1.hpp"
#include "spells2.hpp"
#include "stats.hpp"
#include "tables.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -119,7 +121,7 @@ static bool_ power_chance(power_type *x_ptr)
return (TRUE);
}
- if (flush_failure) flush();
+ flush_on_failure();
msg_print("You've failed to concentrate hard enough.");
return (FALSE);
@@ -127,6 +129,9 @@ static bool_ power_chance(power_type *x_ptr)
static void power_activate(int power)
{
+ auto const &f_info = game->edit_data.f_info;
+ auto const &k_info = game->edit_data.k_info;
+
s16b plev = p_ptr->lev;
char ch = 0;
int amber_power = 0;
@@ -195,11 +200,6 @@ static void power_activate(int power)
}
}
break;
- case PWR_LAY_TRAP:
- {
- do_cmd_set_trap();
- }
- break;
case PWR_MAGIC_MAP:
{
msg_print("You sense the world around you.");
@@ -235,17 +235,17 @@ static void power_activate(int power)
case PWR_UNFEAR:
{
msg_print("You play tough.");
- (void)set_afraid(0);
+ set_afraid(0);
}
break;
case PWR_BERSERK:
{
msg_print("RAAAGH!");
- (void)set_afraid(0);
+ set_afraid(0);
- (void)set_shero(p_ptr->shero + 10 + randint(plev));
- (void)hp_player(30);
+ set_shero(p_ptr->shero + 10 + randint(plev));
+ hp_player(30);
}
break;
@@ -260,7 +260,7 @@ static void power_activate(int power)
{
if (!get_aim_dir(&dir)) break;
msg_print("You bash at a stone wall.");
- (void)wall_to_mud(dir);
+ wall_to_mud(dir);
}
break;
@@ -311,7 +311,7 @@ static void power_activate(int power)
x_ptr_foo.diff = 7;
if (power_chance(&x_ptr_foo))
{
- (void)set_light_speed(p_ptr->lightspeed + 3);
+ set_light_speed(p_ptr->lightspeed + 3);
}
}
break;
@@ -328,9 +328,8 @@ static void power_activate(int power)
case PWR_DETECT_TD:
{
msg_print("You examine your surroundings.");
- (void)detect_traps(DEFAULT_RADIUS);
- (void)detect_doors(DEFAULT_RADIUS);
- (void)detect_stairs(DEFAULT_RADIUS);
+ detect_doors(DEFAULT_RADIUS);
+ detect_stairs(DEFAULT_RADIUS);
}
break;
@@ -390,7 +389,7 @@ static void power_activate(int power)
}
if (amber_power == 2)
{
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels ...");
break;
@@ -417,7 +416,7 @@ static void power_activate(int power)
}
if (amber_power == 3)
{
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No recall on special levels..");
break;
@@ -511,7 +510,7 @@ static void power_activate(int power)
{
if (p_ptr->food < PY_FOOD_FULL)
/* No heal if we are "full" */
- (void)hp_player(dummy);
+ hp_player(dummy);
else
msg_print("You were not hungry.");
/* Gain nutritional sustenance: 150/hp drained */
@@ -520,7 +519,7 @@ static void power_activate(int power)
/* But if we ARE Gorged, it won't cure us */
dummy = p_ptr->food + MIN(5000, 100 * dummy);
if (p_ptr->food < PY_FOOD_MAX) /* Not gorged already */
- (void)set_food(dummy >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dummy);
+ set_food(dummy >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dummy);
}
else
msg_print("Yechh. That tastes foul.");
@@ -531,14 +530,14 @@ static void power_activate(int power)
{
msg_print("You emit an eldritch howl!");
if (!get_aim_dir(&dir)) break;
- (void)fear_monster(dir, plev);
+ fear_monster(dir, plev);
}
break;
case PWR_REST_LIFE:
{
msg_print("You attempt to restore your lost energies.");
- (void)restore_level();
+ restore_level();
}
break;
@@ -560,7 +559,7 @@ static void power_activate(int power)
m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if ((r_ptr->flags1 & RF1_NEVER_MOVE) && (m_ptr->status == MSTATUS_PET) && (!(r_ptr->flags9 & RF9_SPECIAL_GENE)))
+ if ((r_ptr->flags & RF_NEVER_MOVE) && (m_ptr->status == MSTATUS_PET) && (!(r_ptr->flags & RF_SPECIAL_GENE)))
{
q_ptr = &forge;
object_prep(q_ptr, lookup_kind(TV_HYPNOS, 1));
@@ -654,7 +653,7 @@ static void power_activate(int power)
{
msg_print("Your eyes look mesmerising...");
if (get_aim_dir(&dir))
- (void) charm_monster(dir, p_ptr->lev);
+ charm_monster(dir, p_ptr->lev);
}
break;
@@ -690,13 +689,13 @@ static void power_activate(int power)
case PWR_SMELL_MET:
{
- (void)detect_treasure(DEFAULT_RADIUS);
+ detect_treasure(DEFAULT_RADIUS);
}
break;
case PWR_SMELL_MON:
{
- (void)detect_monsters_normal(DEFAULT_RADIUS);
+ detect_monsters_normal(DEFAULT_RADIUS);
}
break;
@@ -720,7 +719,7 @@ static void power_activate(int power)
msg_print("You bite into thin air!");
break;
}
- else if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT) || (c_ptr->feat == FEAT_MOUNTAIN))
+ else if ((f_info[c_ptr->feat].flags & FF_PERMANENT) || (c_ptr->feat == FEAT_MOUNTAIN))
{
msg_print("Ouch! This wall is harder than your teeth!");
break;
@@ -740,25 +739,25 @@ static void power_activate(int power)
if ((c_ptr->feat >= FEAT_DOOR_HEAD) &&
(c_ptr->feat <= FEAT_RUBBLE))
{
- (void)set_food(p_ptr->food + 3000);
+ set_food(p_ptr->food + 3000);
}
else if ((c_ptr->feat >= FEAT_MAGMA) &&
(c_ptr->feat <= FEAT_QUARTZ_K))
{
- (void)set_food(p_ptr->food + 5000);
+ set_food(p_ptr->food + 5000);
}
else if ((c_ptr->feat >= FEAT_SANDWALL) &&
(c_ptr->feat <= FEAT_SANDWALL_K))
{
- (void)set_food(p_ptr->food + 500);
+ set_food(p_ptr->food + 500);
}
else
{
msg_print("This granite is very filling!");
- (void)set_food(p_ptr->food + 10000);
+ set_food(p_ptr->food + 10000);
}
}
- (void)wall_to_mud(dir);
+ wall_to_mud(dir);
oy = p_ptr->py;
ox = p_ptr->px;
@@ -780,20 +779,20 @@ static void power_activate(int power)
case PWR_SWAP_POS:
{
if (!get_aim_dir(&dir)) return;
- (void)teleport_swap(dir);
+ teleport_swap(dir);
}
break;
case PWR_SHRIEK:
{
- (void)fire_ball(GF_SOUND, 0, 4 * p_ptr->lev, 8);
- (void)aggravate_monsters(0);
+ fire_ball(GF_SOUND, 0, 4 * p_ptr->lev, 8);
+ aggravate_monsters(0);
}
break;
case PWR_ILLUMINE:
{
- (void)lite_area(damroll(2, (p_ptr->lev / 2)), (p_ptr->lev / 10) + 1);
+ lite_area(damroll(2, (p_ptr->lev / 2)), (p_ptr->lev / 10) + 1);
}
break;
@@ -821,7 +820,7 @@ static void power_activate(int power)
case PWR_MIDAS_TCH:
{
- (void)alchemy();
+ alchemy();
}
break;
@@ -842,27 +841,27 @@ static void power_activate(int power)
if (rand_int(5) < num)
{
- (void)set_oppose_acid(p_ptr->oppose_acid + dur);
+ set_oppose_acid(p_ptr->oppose_acid + dur);
num--;
}
if (rand_int(4) < num)
{
- (void)set_oppose_elec(p_ptr->oppose_elec + dur);
+ set_oppose_elec(p_ptr->oppose_elec + dur);
num--;
}
if (rand_int(3) < num)
{
- (void)set_oppose_fire(p_ptr->oppose_fire + dur);
+ set_oppose_fire(p_ptr->oppose_fire + dur);
num--;
}
if (rand_int(2) < num)
{
- (void)set_oppose_cold(p_ptr->oppose_cold + dur);
+ set_oppose_cold(p_ptr->oppose_cold + dur);
num--;
}
if (num)
{
- (void)set_oppose_pois(p_ptr->oppose_pois + dur);
+ set_oppose_pois(p_ptr->oppose_pois + dur);
num--;
}
}
@@ -978,7 +977,7 @@ static void power_activate(int power)
case PWR_RECALL:
{
- if (!(dungeon_flags2 & DF2_ASK_LEAVE) || ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? ")))
+ if (!(dungeon_flags & DF_ASK_LEAVE) || ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? ")))
{
recall_player(21, 15);
}
@@ -1000,7 +999,7 @@ static void power_activate(int power)
monster_type *m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags3 & RF3_EVIL)
+ if (r_ptr->flags & RF_EVIL)
{
/* Delete the monster, rather than killing it. */
delete_monster_idx(c_ptr->m_idx);
diff --git a/src/powers.hpp b/src/powers.hpp
index 35d317b0..aa24e7d0 100644
--- a/src/powers.hpp
+++ b/src/powers.hpp
@@ -1,6 +1,6 @@
#pragma once
-extern void do_cmd_power();
+void do_cmd_power();
/*
* Powers (mutation, activations, ...)
@@ -64,7 +64,6 @@ extern void do_cmd_power();
#define PWR_UNHYPNO 53
#define PWR_INCARNATE 54
#define PWR_MAGIC_MAP 55
-#define PWR_LAY_TRAP 56
#define PWR_COMPANION 58
#define PWR_BEAR 59
#define PWR_DODGE 60
diff --git a/src/q_betwen.cc b/src/q_betwen.cc
index 2bebe452..ca8243b4 100644
--- a/src/q_betwen.cc
+++ b/src/q_betwen.cc
@@ -1,6 +1,7 @@
#include "q_betwen.hpp"
#include "cave.hpp"
+#include "dungeon_flag.hpp"
#include "cave_type.hpp"
#include "hook_chardump_in.hpp"
#include "hook_init_quest_in.hpp"
@@ -18,7 +19,7 @@
#define cquest (quest[QUEST_BETWEEN])
-static bool_ quest_between_move_hook(void *, void *in_, void *)
+static bool quest_between_move_hook(void *, void *in_, void *)
{
struct hook_move_in *in = static_cast<struct hook_move_in *>(in_);
s32b y = in->y;
@@ -27,7 +28,10 @@ static bool_ quest_between_move_hook(void *, void *in_, void *)
c_ptr = &cave[y][x];
- if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
/* The tower of Turgon */
if ((c_ptr->feat == FEAT_SHOP) && (c_ptr->special == 27))
@@ -37,19 +41,28 @@ static bool_ quest_between_move_hook(void *, void *in_, void *)
cquest.status = QUEST_STATUS_COMPLETED;
- return TRUE;
+ return true;
}
/* Only 1 ambush */
- if (cquest.data[0]) return (FALSE);
+ if (cquest.data[0])
+ {
+ return false;
+ }
if (!p_ptr->wild_mode)
{
- if (p_ptr->wilderness_y > 19) return (FALSE);
+ if (p_ptr->wilderness_y > 19)
+ {
+ return false;
+ }
}
else
{
- if (p_ptr->py > 19) return (FALSE);
+ if (p_ptr->py > 19)
+ {
+ return false;
+ }
}
/* Mark as entered */
@@ -63,16 +76,19 @@ static bool_ quest_between_move_hook(void *, void *in_, void *)
cmsg_print(TERM_YELLOW, "Trone steps forth and speaks: 'The secret of the Void Jumpgates");
cmsg_print(TERM_YELLOW, "will not be used by any but the thunderlords!'");
- return FALSE;
+ return false;
}
-static bool_ quest_between_gen_hook(void *, void *, void *)
+static bool quest_between_gen_hook(void *, void *, void *)
{
int x, y;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_BETWEEN) return FALSE;
+ if (p_ptr->inside_quest != QUEST_BETWEEN)
+ {
+ return false;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -96,18 +112,18 @@ static bool_ quest_between_gen_hook(void *, void *, void *)
/* Otherwise instadeath */
energy_use = 0;
- dungeon_flags2 |= DF2_NO_GENO;
+ dungeon_flags |= DF_NO_GENO;
- return TRUE;
+ return true;
}
-static bool_ quest_between_finish_hook(void *, void *in_, void *)
+static bool quest_between_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
object_type forge, *q_ptr;
- if (q_idx != QUEST_BETWEEN) return FALSE;
+ if (q_idx != QUEST_BETWEEN) return false;
c_put_str(TERM_YELLOW, "Ah you finally arrived, I hope your travel wasn't too hard.", 8, 0);
c_put_str(TERM_YELLOW, "As a reward you can freely use the Void Jumpgates for quick travel.", 9, 0);
@@ -128,7 +144,7 @@ static bool_ quest_between_finish_hook(void *, void *in_, void *)
object_known(q_ptr);
q_ptr->discount = 100;
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_NULL;
@@ -136,14 +152,17 @@ static bool_ quest_between_finish_hook(void *, void *in_, void *)
del_hook_new(HOOK_QUEST_FINISH, quest_between_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_between_death_hook(void *, void *, void *)
+static bool quest_between_death_hook(void *, void *, void *)
{
int i, mcnt = 0;
- if (p_ptr->inside_quest != QUEST_BETWEEN) return FALSE;
+ if (p_ptr->inside_quest != QUEST_BETWEEN)
+ {
+ return false;
+ }
for (i = m_max - 1; i >= 1; i--)
{
@@ -162,14 +181,14 @@ static bool_ quest_between_death_hook(void *, void *, void *)
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_LESS);
cave[p_ptr->py][p_ptr->px].special = 0;
- return FALSE;
+ return false;
}
- return FALSE;
+ return false;
}
-static bool_ quest_between_dump_hook(void *, void *in_, void *)
+static bool quest_between_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -179,10 +198,10 @@ static bool_ quest_between_dump_hook(void *, void *in_, void *)
fprintf(f, "\n You established a permanent void jumpgates liaison between Minas Anor and Gondolin,");
fprintf(f, "\n thus allowing the last alliance to exist.");
}
- return (FALSE);
+ return false;
}
-static bool_ quest_between_forbid_hook(void *, void *in_, void *)
+static bool quest_between_forbid_hook(void *, void *in_, void *)
{
hook_init_quest_in *in = static_cast<struct hook_init_quest_in *>(in_);
s32b q_idx = in->q_idx;
@@ -192,12 +211,12 @@ static bool_ quest_between_forbid_hook(void *, void *in_, void *)
if (p_ptr->lev < 45)
{
c_put_str(TERM_WHITE, "I fear you are not ready for the next quest, come back later.", 8, 0);
- return (TRUE);
+ return true;
}
- return (FALSE);
+ return false;
}
-bool_ quest_between_init_hook(int q)
+void quest_between_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -208,5 +227,4 @@ bool_ quest_between_init_hook(int q)
}
add_hook_new(HOOK_CHAR_DUMP, quest_between_dump_hook, "between_dump", NULL);
add_hook_new(HOOK_INIT_QUEST, quest_between_forbid_hook, "between_forbid", NULL);
- return (FALSE);
}
diff --git a/src/q_betwen.hpp b/src/q_betwen.hpp
index d2fc08f0..54042a24 100644
--- a/src/q_betwen.hpp
+++ b/src/q_betwen.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_between_init_hook(int q_idx);
+void quest_between_init_hook();
diff --git a/src/q_bounty.cc b/src/q_bounty.cc
index bb84d48d..f0a431de 100644
--- a/src/q_bounty.cc
+++ b/src/q_bounty.cc
@@ -1,7 +1,10 @@
#include "q_bounty.hpp"
+#include "game.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "object1.hpp"
#include "object2.hpp"
#include "object_type.hpp"
@@ -11,38 +14,42 @@
#include "util.hpp"
#include "variable.hpp"
+#include <fmt/format.h>
+
#define cquest (quest[QUEST_BOUNTY])
#define bounty_quest_monster (cquest.data[0])
static bool_ lua_mon_hook_bounty(int r_idx)
{
- monster_race* r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
/* Reject uniques */
- if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
+ if (r_ptr->flags & RF_UNIQUE) return (FALSE);
/* Reject those who cannot leave anything */
- if (!(r_ptr->flags9 & RF9_DROP_CORPSE)) return (FALSE);
+ if (!(r_ptr->flags & RF_DROP_CORPSE)) return (FALSE);
/* Accept only monsters that can be generated */
- if (r_ptr->flags9 & RF9_SPECIAL_GENE) return (FALSE);
- if (r_ptr->flags9 & RF9_NEVER_GENE) return (FALSE);
+ if (r_ptr->flags & RF_SPECIAL_GENE) return (FALSE);
+ if (r_ptr->flags & RF_NEVER_GENE) return (FALSE);
/* Reject pets */
- if (r_ptr->flags7 & RF7_PET) return (FALSE);
+ if (r_ptr->flags & RF_PET) return (FALSE);
/* Reject friendly creatures */
- if (r_ptr->flags7 & RF7_FRIENDLY) return (FALSE);
+ if (r_ptr->flags & RF_FRIENDLY) return (FALSE);
/* Accept only monsters that are not breeders */
- if (r_ptr->flags4 & RF4_MULTIPLY) return (FALSE);
+ if (r_ptr->spells & SF_MULTIPLY) return (FALSE);
/* Forbid joke monsters */
- if (r_ptr->flags8 & RF8_JOKEANGBAND) return (FALSE);
+ if (r_ptr->flags & RF_JOKEANGBAND) return (FALSE);
/* Accept only monsters that are not good */
- if (r_ptr->flags3 & RF3_GOOD) return (FALSE);
+ if (r_ptr->flags & RF_GOOD) return (FALSE);
/* The rest are acceptable */
return (TRUE);
@@ -74,9 +81,9 @@ static bool bounty_item_tester_hook(object_type const *o_ptr)
return ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval2 == bounty_quest_monster));
}
-bool_ quest_bounty_init_hook(int dummy)
+void quest_bounty_init_hook()
{
- return FALSE;
+ // Initialized by building action
}
bool_ quest_bounty_drop_item()
@@ -104,6 +111,8 @@ bool_ quest_bounty_drop_item()
bool_ quest_bounty_get_item()
{
+ auto &s_info = game->s_info;
+
if (cquest.status != QUEST_STATUS_TAKEN)
{
msg_print("You do not have any bounty quest yet.");
@@ -132,16 +141,19 @@ bool_ quest_bounty_get_item()
skill_type *lore = &s_info[SKILL_LORE];
skill_type *preservation = &s_info[SKILL_PRESERVATION];
- if (lore->mod == 0) {
+ if (lore->mod == 0)
+ {
lore->mod = 900;
- lore->dev = TRUE;
+ lore->dev = true;
}
+
lore->value += lore->mod;
- if (preservation->mod == 0) {
+ if (preservation->mod == 0)
+ {
preservation->value = 800;
preservation->mod = 800;
- preservation->dev = TRUE;
+ preservation->dev = true;
msg_print("I see you don't know the corpse preservation skill, I shall teach you it too.");
}
@@ -151,20 +163,18 @@ bool_ quest_bounty_get_item()
return FALSE;
}
-bool_ quest_bounty_describe(FILE *fff)
+std::string quest_bounty_describe()
{
char mdesc[512];
+ fmt::MemoryWriter w;
if (cquest.status == QUEST_STATUS_TAKEN)
{
monster_race_desc(mdesc, bounty_quest_monster, 0);
- fprintf(fff, "#####yBounty quest!\n");
- fprintf(fff, "You must bring back %s corpse to the beastmaster.\n", mdesc);
- fprintf(fff, "\n");
-
- return TRUE;
+ w.write("#####yBounty quest!\n");
+ w.write("You must bring back {} corpse to the beastmaster.", mdesc);
}
- return FALSE;
+ return w.str();
}
diff --git a/src/q_bounty.hpp b/src/q_bounty.hpp
index 234c036d..fe9742ef 100644
--- a/src/q_bounty.hpp
+++ b/src/q_bounty.hpp
@@ -2,7 +2,9 @@
#include "h-basic.h"
-extern bool_ quest_bounty_init_hook(int q_idx);
-extern bool_ quest_bounty_drop_item();
-extern bool_ quest_bounty_get_item();
-extern bool_ quest_bounty_describe(FILE *fff);
+#include <string>
+
+void quest_bounty_init_hook();
+bool_ quest_bounty_drop_item();
+bool_ quest_bounty_get_item();
+std::string quest_bounty_describe();
diff --git a/src/q_dragons.cc b/src/q_dragons.cc
index 6c6084d1..9f89089c 100644
--- a/src/q_dragons.cc
+++ b/src/q_dragons.cc
@@ -2,7 +2,10 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_quest_finish_in.hpp"
#include "hooks.hpp"
#include "init1.hpp"
@@ -16,8 +19,10 @@
#define cquest (quest[QUEST_DRAGONS])
-static bool_ quest_dragons_gen_hook(void *, void *, void *)
+static bool quest_dragons_gen_hook(void *, void *, void *)
{
+ auto const &f_info = game->edit_data.f_info;
+
int x, y, i;
int xstart = 2;
int ystart = 2;
@@ -47,18 +52,17 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *)
init_flags = INIT_CREATE_DUNGEON;
process_dungeon_file("dragons.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
- dungeon_flags2 |= DF2_NO_GENO;
+ dungeon_flags |= DF_NO_GENO;
/* Place some columns */
for (i = 35; i > 0; )
{
- int flags;
y = rand_int(21) + 3;
x = rand_int(31) + 3;
/* Bar columns on even squares so the whole level is guaranteed to be
accessible */
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags % 2) && !(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
+ auto const flags = f_info[cave[y][x].feat].flags;
+ if (!(x % 2) && !(flags & FF_PERMANENT) && (flags & FF_FLOOR))
{
--i;
cave_set_feat(y, x, FEAT_MOUNTAIN);
@@ -68,11 +72,10 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *)
/* Place some random dragons */
for (i = 25; i > 0; )
{
- int m_idx, flags;
y = rand_int(21) + 3;
x = rand_int(31) + 3;
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
+ auto const flags = f_info[cave[y][x].feat].flags;
+ if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR))
{
/* blue, white, red, black, bronze, gold, green, multi-hued */
int baby_dragons[8] = {163, 164, 167, 166, 218, 219, 165, 204};
@@ -94,7 +97,7 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *)
dragon = mature_dragons[color];
--i;
- m_idx = place_monster_one(y, x, dragon, 0, magik(33), MSTATUS_ENEMY);
+ int m_idx = place_monster_one(y, x, dragon, 0, magik(33), MSTATUS_ENEMY);
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
}
}
@@ -104,7 +107,7 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *)
return TRUE;
}
-static bool_ quest_dragons_death_hook(void *, void *, void *)
+static bool quest_dragons_death_hook(void *, void *, void *)
{
int i, mcnt = 0;
@@ -117,9 +120,15 @@ static bool_ quest_dragons_death_hook(void *, void *, void *)
monster_type *m_ptr = &m_list[i];
/* Ignore "dead" monsters */
- if (!m_ptr->r_idx) continue;
+ if (!m_ptr->r_idx)
+ {
+ continue;
+ }
- if (m_ptr->status <= MSTATUS_ENEMY) mcnt++;
+ if (m_ptr->status <= MSTATUS_ENEMY)
+ {
+ mcnt++;
+ }
}
/* Nobody left ? */
@@ -131,17 +140,21 @@ static bool_ quest_dragons_death_hook(void *, void *, void *)
process_hooks_restart = TRUE;
cmsg_print(TERM_YELLOW, "Gondolin is safer now.");
- return (FALSE);
+ return false;
}
- return FALSE;
+
+ return false;
}
-static bool_ quest_dragons_finish_hook(void *, void *in_, void *)
+static bool quest_dragons_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_DRAGONS) return FALSE;
+ if (q_idx != QUEST_DRAGONS)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "Thank you for killing the dragons!", 8, 0);
c_put_str(TERM_YELLOW, "You can use the cave as your house as a reward.", 9, 0);
@@ -149,10 +162,10 @@ static bool_ quest_dragons_finish_hook(void *, void *in_, void *)
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_EOL;
- return TRUE;
+ return true;
}
-bool_ quest_dragons_init_hook(int q_idx)
+void quest_dragons_init_hook()
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -160,5 +173,4 @@ bool_ quest_dragons_init_hook(int q_idx)
add_hook_new(HOOK_QUEST_FINISH, quest_dragons_finish_hook, "dragons_finish", NULL);
add_hook_new(HOOK_GEN_QUEST, quest_dragons_gen_hook, "dragons_geb", NULL);
}
- return (FALSE);
}
diff --git a/src/q_dragons.hpp b/src/q_dragons.hpp
index f0aa50f2..cda41321 100644
--- a/src/q_dragons.hpp
+++ b/src/q_dragons.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_dragons_init_hook(int q_idx);
+void quest_dragons_init_hook();
diff --git a/src/q_eol.cc b/src/q_eol.cc
index f27ce9df..815b3107 100644
--- a/src/q_eol.cc
+++ b/src/q_eol.cc
@@ -2,6 +2,7 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "game.hpp"
#include "generate.hpp"
#include "hook_stair_in.hpp"
#include "hook_quest_finish_in.hpp"
@@ -14,7 +15,6 @@
#include "object2.hpp"
#include "player_type.hpp"
#include "tables.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "variable.hpp"
#include "z-rand.hpp"
@@ -25,14 +25,17 @@
GENERATE_MONSTER_LOOKUP_FN(get_eol, "Eol, the Dark Elf")
-static bool_ quest_eol_gen_hook(void *, void *, void *)
+static bool quest_eol_gen_hook(void *, void *, void *)
{
int x, y;
bool_ done = FALSE;
int xsize = 50, ysize = 30, y0, x0;
int m_idx = 0;
- if (p_ptr->inside_quest != QUEST_EOL) return FALSE;
+ if (p_ptr->inside_quest != QUEST_EOL)
+ {
+ return false;
+ }
x0 = 2 + (xsize / 2);
y0 = 2 + (ysize / 2);
@@ -95,11 +98,6 @@ static bool_ quest_eol_gen_hook(void *, void *, void *)
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
}
- if (magik(18))
- {
- place_trap(y, x);
- }
-
/* Place player at one end */
p_ptr->py = y;
p_ptr->px = x;
@@ -107,16 +105,19 @@ static bool_ quest_eol_gen_hook(void *, void *, void *)
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_LESS);
- return TRUE;
+ return true;
}
-static bool_ quest_eol_finish_hook(void *, void *in_, void *)
+static bool quest_eol_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
object_type forge, *q_ptr;
- if (q_idx != QUEST_EOL) return FALSE;
+ if (q_idx != QUEST_EOL)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "A tragedy, but the deed needed to be done.", 8, 0);
c_put_str(TERM_YELLOW, "Accept my thanks, and that reward.", 9, 0);
@@ -130,24 +131,27 @@ static bool_ quest_eol_finish_hook(void *, void *in_, void *)
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_NIRNAETH;
- quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot));
+ quest[*(quest[q_idx].plot)].init();
del_hook_new(HOOK_QUEST_FINISH, quest_eol_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_eol_fail_hook(void *, void *in_, void *)
+static bool quest_eol_fail_hook(void *, void *in_, void *)
{
struct hook_quest_fail_in *in = static_cast<struct hook_quest_fail_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_EOL) return FALSE;
+ if (q_idx != QUEST_EOL)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "You fled ! I did not think you would flee...", 8, 0);
@@ -157,16 +161,19 @@ static bool_ quest_eol_fail_hook(void *, void *in_, void *)
del_hook_new(HOOK_QUEST_FAIL, quest_eol_fail_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_eol_death_hook(void *, void *in_, void *)
+static bool quest_eol_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
s32b r_idx = m_list[m_idx].r_idx;
- if (p_ptr->inside_quest != QUEST_EOL) return FALSE;
+ if (p_ptr->inside_quest != QUEST_EOL)
+ {
+ return false;
+ }
if (r_idx == get_eol())
{
@@ -176,20 +183,28 @@ static bool_ quest_eol_death_hook(void *, void *in_, void *)
del_hook_new(HOOK_MONSTER_DEATH, quest_eol_death_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
- return FALSE;
+ return false;
}
-static bool_ quest_eol_stair_hook(void *, void *in_, void *)
+static bool quest_eol_stair_hook(void *, void *in_, void *)
{
+ auto const &r_info = game->edit_data.r_info;
+
struct hook_stair_in *in = static_cast<struct hook_stair_in *>(in_);
- monster_race *r_ptr = &r_info[get_eol()];
+ auto r_ptr = &r_info[get_eol()];
- if (p_ptr->inside_quest != QUEST_EOL) return FALSE;
+ if (p_ptr->inside_quest != QUEST_EOL)
+ {
+ return false;
+ }
- if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) return TRUE;
+ if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS)
+ {
+ return true;
+ }
if (r_ptr->max_num)
{
@@ -198,21 +213,24 @@ static bool_ quest_eol_stair_hook(void *, void *in_, void *)
/* Flush input */
flush();
- if (!get_check("Really abandon the quest?")) return TRUE;
+ if (!get_check("Really abandon the quest?"))
+ {
+ return true;
+ }
cmsg_print(TERM_YELLOW, "You flee away from Eol...");
cquest.status = QUEST_STATUS_FAILED;
del_hook_new(HOOK_STAIR, quest_eol_stair_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
}
- return FALSE;
+ return false;
}
-bool_ quest_eol_init_hook(int q)
+void quest_eol_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -222,5 +240,4 @@ bool_ quest_eol_init_hook(int q)
add_hook_new(HOOK_QUEST_FAIL, quest_eol_fail_hook, "eol_fail", NULL);
add_hook_new(HOOK_QUEST_FINISH, quest_eol_finish_hook, "eol_finish", NULL);
}
- return (FALSE);
}
diff --git a/src/q_eol.hpp b/src/q_eol.hpp
index ab7f1274..19af3583 100644
--- a/src/q_eol.hpp
+++ b/src/q_eol.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_eol_init_hook(int q_idx);
+void quest_eol_init_hook();
diff --git a/src/q_evil.cc b/src/q_evil.cc
index 3bc953cd..4636356a 100644
--- a/src/q_evil.cc
+++ b/src/q_evil.cc
@@ -2,7 +2,10 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_quest_finish_in.hpp"
#include "hooks.hpp"
#include "init1.hpp"
@@ -16,17 +19,24 @@
#define cquest (quest[QUEST_EVIL])
-static bool_ quest_evil_gen_hook(void *, void *, void *)
+static bool quest_evil_gen_hook(void *, void *, void *)
{
+ auto const &f_info = game->edit_data.f_info;
+
int x, y, i;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_EVIL) return FALSE;
+ if (p_ptr->inside_quest != QUEST_EVIL)
+ {
+ return false;
+ }
/* Just in case we didnt talk the the mayor */
if (cquest.status == QUEST_STATUS_UNTAKEN)
+ {
cquest.status = QUEST_STATUS_TAKEN;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -47,18 +57,17 @@ static bool_ quest_evil_gen_hook(void *, void *, void *)
init_flags = INIT_CREATE_DUNGEON;
process_dungeon_file("evil.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
- dungeon_flags2 |= DF2_NO_GENO;
+ dungeon_flags |= DF_NO_GENO;
/* Place some random balrogs */
for (i = 6; i > 0; )
{
- int m_idx, flags;
y = rand_int(21) + 3;
x = rand_int(31) + 3;
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
+ auto const flags = f_info[cave[y][x].feat].flags;
+ if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR))
{
- m_idx = place_monster_one(y, x, 996, 0, FALSE, MSTATUS_ENEMY);
+ int m_idx = place_monster_one(y, x, 996, 0, FALSE, MSTATUS_ENEMY);
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
--i;
}
@@ -66,14 +75,17 @@ static bool_ quest_evil_gen_hook(void *, void *, void *)
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_evil_death_hook(void *, void *, void *)
+static bool quest_evil_death_hook(void *, void *, void *)
{
int i, mcnt = 0;
- if (p_ptr->inside_quest != QUEST_EVIL) return FALSE;
+ if (p_ptr->inside_quest != QUEST_EVIL)
+ {
+ return false;
+ }
/* Process the monsters (backwards) */
for (i = m_max - 1; i >= 1; i--)
@@ -99,17 +111,20 @@ static bool_ quest_evil_death_hook(void *, void *, void *)
process_hooks_restart = TRUE;
cmsg_print(TERM_YELLOW, "Khazad-Dum is safer now.");
- return (FALSE);
+ return false;
}
- return FALSE;
+ return false;
}
-static bool_ quest_evil_finish_hook(void *, void *in_, void *)
+static bool quest_evil_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_EVIL) return FALSE;
+ if (q_idx != QUEST_EVIL)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "Thank you for saving us!", 8, 0);
c_put_str(TERM_YELLOW, "You can use the cave as your house as a reward.", 9, 0);
@@ -117,10 +132,10 @@ static bool_ quest_evil_finish_hook(void *, void *in_, void *)
/* End the plot */
*(quest[q_idx].plot) = QUEST_NULL;
- return TRUE;
+ return true;
}
-bool_ quest_evil_init_hook(int q_idx)
+void quest_evil_init_hook()
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -128,5 +143,4 @@ bool_ quest_evil_init_hook(int q_idx)
add_hook_new(HOOK_QUEST_FINISH, quest_evil_finish_hook, "evil_finish", NULL);
add_hook_new(HOOK_GEN_QUEST, quest_evil_gen_hook, "evil_geb", NULL);
}
- return (FALSE);
}
diff --git a/src/q_evil.hpp b/src/q_evil.hpp
index 06fb17e1..0079e56c 100644
--- a/src/q_evil.hpp
+++ b/src/q_evil.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_evil_init_hook(int q_idx);
+void quest_evil_init_hook();
diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc
index 021cf2fb..26bf75af 100644
--- a/src/q_fireprof.cc
+++ b/src/q_fireprof.cc
@@ -1,27 +1,27 @@
#include "q_fireprof.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "hook_get_in.hpp"
#include "hooks.hpp"
#include "lua_bind.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_type.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "tables.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "variable.hpp"
#include "z-rand.hpp"
#include <cassert>
+#include <fmt/format.h>
#define cquest (quest[QUEST_FIREPROOF])
-#define print_hook(fmt,...) do { fprintf(hook_file, fmt, ##__VA_ARGS__); } while (0)
-
/*
* Per-module "settings"
*/
@@ -29,16 +29,16 @@ typedef struct fireproof_settings fireproof_settings;
struct fireproof_settings
{
byte tval; /* tval of object to use. */
+ byte sval; /* sval of object to use. */
cptr tval_name; /* descriptive name of tval */
cptr tval_name_plural; /* descriptive name of tval (plural) */
- byte sval_max; /* max sval of object to use; sval will be 1<=X<=sval_max. */
s32b total_points; /* total number of points awarded */
};
static fireproof_settings const *fireproof_get_settings()
{
static fireproof_settings fireproof_settings =
- { TV_RUNE2, "rune", "runes", 5, 24 };
+ { TV_SCROLL, SV_SCROLL_FIRE, "scroll", "scrolls", 24 };
return &fireproof_settings;
}
@@ -61,22 +61,13 @@ static void set_item_points_remaining(s32b v)
cquest.data[0] = settings->total_points - v;
}
-static void fireproof_set_sval(int sval_max)
-{
- cquest.data[1] = sval_max;
-}
-
-static int fireproof_get_sval()
-{
- return cquest.data[1];
-}
-
static bool item_tester_hook_eligible(object_type const *o_ptr)
{
+ fireproof_settings const *settings = fireproof_get_settings();
/* check it's the 'marked' item */
- return ((o_ptr->tval == fireproof_get_settings()->tval) &&
- (o_ptr->sval == fireproof_get_sval()) &&
- (o_ptr->pval2 == fireproof_get_sval()));
+ return ((o_ptr->tval == settings->tval) &&
+ (o_ptr->sval == settings->sval) &&
+ (o_ptr->pval2 == settings->sval));
}
static object_filter_t const &item_tester_hook_proofable()
@@ -90,7 +81,7 @@ static object_filter_t const &item_tester_hook_proofable()
TVal(TV_STAFF)),
// Must NOT already be fireproof
Not(
- HasFlag3(TR3_IGNORE_FIRE)));
+ HasFlags(TR_IGNORE_FIRE)));
return instance;
}
@@ -368,7 +359,7 @@ void quest_fireproof_building(bool_ *paid, bool_ *recreate)
}
}
-static bool_ fireproof_get_hook(void *, void *in_, void *)
+static bool fireproof_get_hook(void *, void *in_, void *)
{
struct hook_get_in *in = static_cast<struct hook_get_in *>(in_);
object_type *o_ptr = in->o_ptr;
@@ -378,24 +369,24 @@ static bool_ fireproof_get_hook(void *, void *in_, void *)
* generated via random object placement */
if ((p_ptr->inside_quest == QUEST_FIREPROOF) &&
(cquest.status != QUEST_STATUS_COMPLETED) &&
- (o_ptr->pval2 == fireproof_get_sval()))
+ (o_ptr->pval2 == fireproof_get_settings()->sval))
{
/* ok mark the quest 'completed' */
cquest.status = QUEST_STATUS_COMPLETED;
cmsg_print(TERM_YELLOW, "Fine! Looks like you've found it.");
}
- return FALSE;
+ return false;
}
-static bool_ fireproof_stair_hook(void *, void *, void *)
+static bool fireproof_stair_hook(void *, void *, void *)
{
/* only ask this if player about to go up stairs of quest and
* hasn't retrieved item */
if ((p_ptr->inside_quest != QUEST_FIREPROOF) ||
(cquest.status == QUEST_STATUS_COMPLETED))
{
- return FALSE;
+ return false;
}
else
{
@@ -403,7 +394,7 @@ static bool_ fireproof_stair_hook(void *, void *, void *)
if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS)
{
- return FALSE;
+ return false;
}
/* flush all pending input */
@@ -417,17 +408,17 @@ static bool_ fireproof_stair_hook(void *, void *, void *)
{
/* fail the quest */
cquest.status = QUEST_STATUS_FAILED;
- return FALSE;
+ return false;
}
else
{
/* if no, they stay in the quest */
- return TRUE;
+ return true;
}
}
}
-bool_ quest_fireproof_describe(FILE *hook_file)
+std::string quest_fireproof_describe()
{
fireproof_settings const *settings = fireproof_get_settings();
int num_books, num_staff, num_scroll;
@@ -437,53 +428,48 @@ bool_ quest_fireproof_describe(FILE *hook_file)
num_staff = get_item_points_remaining() / FIREPROOF_STAFF_POINTS;
num_scroll = get_item_points_remaining() / FIREPROOF_SCROLL_POINTS;
+ fmt::MemoryWriter w;
+
if (status == QUEST_STATUS_TAKEN)
{
/* Quest taken */
- print_hook("#####yAn Old Mages Quest!\n");
- print_hook("Retrieve the strange %s for the old mage "
- "in Lothlorien.\n", settings->tval_name);
- print_hook("\n");
+ w.write("#####yAn Old Mages Quest!\n");
+ w.write("Retrieve the strange {} for the old mage in Lothlorien.", settings->tval_name);
}
else if (status == QUEST_STATUS_COMPLETED)
{
/* essence retrieved, not taken to mage */
- print_hook("#####yAn Old Mages Quest!\n");
- print_hook("You have retrieved the %s for the old "
- "mage in Lothlorien. Perhaps you \n", settings->tval_name);
- print_hook("should see about a reward.\n");
- print_hook("\n");
+ w.write("#####yAn Old Mages Quest!\n");
+ w.write("You have retrieved the {} for the old mage in Lothlorien.\n", settings->tval_name);
+ w.write("Perhaps you should see about a reward.");
}
else if ((status == QUEST_STATUS_FINISHED) &&
(get_item_points_remaining() > 0))
{
/* essence returned, not all books fireproofed */
- print_hook("#####yAn Old Mages Quest!\n");
- print_hook("You have retrieved the %s for the old "
- "mage in Lothlorien. He will still \n", settings->tval_name);
- print_hook("fireproof %d book(s) or %d staff/staves "
- "or %d scroll(s) for you.\n",
- num_books, num_staff, num_scroll);
- print_hook("\n");
+ w.write("#####yAn Old Mages Quest!\n");
+ w.write("You have retrieved the {} for the old "
+ "mage in Lothlorien. He will still\n", settings->tval_name);
+ w.write("fireproof {} book(s) or {} staff/staves "
+ "or {} scroll(s) for you.",
+ num_books, num_staff, num_scroll);
}
- return TRUE;
+ return w.str();
}
-static bool_ fireproof_gen_hook(void *, void *, void *)
+static bool fireproof_gen_hook(void *, void *, void *)
{
fireproof_settings const *settings = fireproof_get_settings();
/* Only if player doing this quest */
if (p_ptr->inside_quest != QUEST_FIREPROOF)
{
- return FALSE;
+ return false;
}
/* Go ahead */
{
- int traps, trap_y, trap_x;
-
/* load the map */
{
int x0 = 2;
@@ -492,75 +478,30 @@ static bool_ fireproof_gen_hook(void *, void *, void *)
}
/* no teleport */
- dungeon_flags2 = DF2_NO_TELEPORT;
-
- /* determine type of item */
- fireproof_set_sval(randint(settings->sval_max));
+ dungeon_flags = DF_NO_TELEPORT;
- /* create essence */
+ /* create quest item */
{
- int x, y;
object_type forge;
-
- object_prep(&forge, lookup_kind(settings->tval, fireproof_get_sval()));
+ object_prep(&forge, lookup_kind(settings->tval, settings->sval));
/* mark item */
- forge.pval2 = fireproof_get_sval();
- forge.note = quark_add("quest");
+ forge.pval2 = settings->sval;
+ forge.inscription = "quest";
/* roll for co-ordinates in top half of map */
- y = randint(3) + 2;
- x = randint(45) + 2;
+ int const y = randint(3) + 2;
+ int const x = randint(45) + 2;
/* drop it */
drop_near(&forge, -1, y, x);
}
- /* how many traps to generate */
- traps = rand_range(10, 30);
-
- /* generate the traps */
- while (traps > 0)
- {
- int tries = 0, trap_level = 0;
-
- /* make sure it's a safe place */
- while (tries == 0)
- {
- /* get grid coordinates */
- trap_y = randint(19) + 2;
- trap_x = randint(45) + 2;
- cave_type *c_ptr = &cave[trap_y][trap_x];
-
- /* are the coordinates on a stair, or a wall? */
- if (((f_info[c_ptr->feat].flags1 & FF1_PERMANENT) != 0) ||
- ((f_info[c_ptr->feat].flags1 & FF1_FLOOR) == 0))
- {
- /* try again */
- tries = 0;
- }
- else
- {
- /* not a stair, then stop this 'while' */
- tries = 1;
- }
- }
-
- /* randomise level of trap */
- trap_level = rand_range(20, 40);
-
- /* put the trap there */
- place_trap_leveled(trap_y, trap_x, trap_level);
-
- /* that's one less trap to place */
- traps = traps - 1;
- }
-
- return TRUE;
+ return true;
}
}
-bool_ quest_fireproof_init_hook(int q)
+void quest_fireproof_init_hook()
{
/* Only need hooks if the quest is unfinished. */
if ((cquest.status >= QUEST_STATUS_UNTAKEN) &&
@@ -570,8 +511,4 @@ bool_ quest_fireproof_init_hook(int q)
add_hook_new(HOOK_GET , fireproof_get_hook , "fireproof_get_hook", NULL);
add_hook_new(HOOK_STAIR , fireproof_stair_hook, "fireproof_stair_hook", NULL);
}
-
- return FALSE;
}
-
-#undef print_hook
diff --git a/src/q_fireprof.hpp b/src/q_fireprof.hpp
index 53d368b0..361d45ad 100644
--- a/src/q_fireprof.hpp
+++ b/src/q_fireprof.hpp
@@ -2,6 +2,8 @@
#include "h-basic.h"
-extern void quest_fireproof_building(bool_ *paid, bool_ *recreate);
-extern bool_ quest_fireproof_init_hook(int q);
-extern bool_ quest_fireproof_describe(FILE *fff);
+#include <string>
+
+void quest_fireproof_building(bool_ *paid, bool_ *recreate);
+void quest_fireproof_init_hook();
+std::string quest_fireproof_describe();
diff --git a/src/q_god.cc b/src/q_god.cc
index 0a3b07e7..68296f36 100644
--- a/src/q_god.cc
+++ b/src/q_god.cc
@@ -1,16 +1,20 @@
#include "q_god.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_chardump_in.hpp"
#include "hook_get_in.hpp"
#include "hook_enter_dungeon_in.hpp"
#include "hook_player_level_in.hpp"
#include "hooks.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "object2.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "skill_type.hpp"
#include "tables.hpp"
#include "util.hpp"
@@ -20,6 +24,7 @@
#include "z-rand.hpp"
#include <assert.h>
+#include <fmt/format.h>
#define cquest (quest[QUEST_GOD])
#define cquest_quests_given (cquest.data[0])
@@ -41,13 +46,9 @@
* the return value will be one of the following: north, south,
* east, west, north-east, south-east, south-west, north-west,
* or "close" if it is within 2 tiles.
- *
- * The returned string is allocated with strdup().
*/
-static char *compass(int y, int x, int y2, int x2)
+static std::string compass(int y, int x, int y2, int x2)
{
- char compass_dir[64];
-
// is it close to the north/south meridian?
int y_diff = y2 - y;
@@ -85,20 +86,25 @@ static char *compass(int y, int x, int y2, int x2)
}
// Maybe it is very close
- if ((!x_axis) && (!y_axis)) { strcpy(compass_dir, "close"); }
+ if ((!x_axis) && (!y_axis)) {
+ return ""; // Handled specially by caller
+ }
// Maybe it is (almost) due N/S
- else if (!x_axis) { strcpy(compass_dir, y_axis); }
+ else if (!x_axis) {
+ return y_axis;
+ }
// Maybe it is (almost) due E/W
- else if (!y_axis) { strcpy(compass_dir, x_axis); }
+ else if (!y_axis) {
+ return x_axis;
+ }
// or if it is neither
- else { sprintf(compass_dir, "%s-%s", y_axis, x_axis); }
-
- /* Return a copy */
- return strdup(compass_dir);
+ else {
+ return fmt::format("{}-{}", y_axis, x_axis);
+ }
}
/* Returns a relative approximation of the 'distance' of y2, x2 from y, x. */
-static cptr approximate_distance(int y, int x, int y2, int x2)
+static std::string approximate_distance(int y, int x, int y2, int x2)
{
// how far to away to the north/south?
int y_diff = abs(y2 - y);
@@ -222,107 +228,80 @@ static void get_home_coordinates(int *home1_y, int *home1_x, const char **home1,
}
}
-/* Print using cmsg_print. */
-static void print_using_cmsg(cptr line, void *dummy)
-{
- cmsg_print(TERM_YELLOW, line);
-}
-
-/* Print using print_hook. */
-static void print_using_print_hook(cptr line, void *f_)
-{
- FILE *f = (FILE *) f_;
- fprintf(f, "%s\n", line);
-}
-
-/* Show directions */
-static void print_directions(bool_ feel_it, void (*pfunc)(cptr, void *), void *pfdata)
+static std::string make_directions(bool feel_it)
{
int home1_y, home1_x;
int home2_y, home2_x;
const char *home1 = NULL;
const char *home2 = NULL;
- char *home1_axis = NULL;
- char *home2_axis = NULL;
- cptr home1_distance = NULL;
- cptr home2_distance = NULL;
cptr feel_it_str = feel_it ? ", I can feel it.'" : ".";
- char buf[256];
get_home_coordinates(
&home1_y, &home1_x, &home1,
&home2_y, &home2_x, &home2);
- home1_axis = compass(home1_y, home1_x, cquest_dung_y, cquest_dung_x);
- home2_axis = compass(home2_y, home2_x, cquest_dung_y, cquest_dung_x);
-
- home1_distance = approximate_distance(home1_y, home1_x, cquest_dung_y, cquest_dung_x);
- home2_distance = approximate_distance(home2_y, home2_x, cquest_dung_y, cquest_dung_x);
+ auto home1_axis = compass(home1_y, home1_x, cquest_dung_y, cquest_dung_x);
+ auto home2_axis = compass(home2_y, home2_x, cquest_dung_y, cquest_dung_x);
/* Build the message */
- if (!streq(home1_axis, "close"))
+ if (home1_axis.empty())
{
- snprintf(buf, sizeof(buf),
- "The temple lies %s to the %s of %s, ",
- home1_distance,
- home1_axis,
- home1);
- pfunc(buf, pfdata);
+ return fmt::format("The temple lies very close to {}, ",
+ home1);
}
else
{
- snprintf(buf, sizeof(buf),
- "The temple lies very close to %s, ",
- home1);
- pfunc(buf, pfdata);
+ auto home1_distance = approximate_distance(home1_y, home1_x, cquest_dung_y, cquest_dung_x);
+ return fmt::format("The temple lies {} to the {} of {}, ",
+ home1_distance,
+ home1_axis,
+ home1);
}
- if (!streq(home2_axis, "close"))
+ if (home2_axis.empty())
{
- snprintf(buf, sizeof(buf),
- "and %s to the %s of %s%s",
- home2_distance,
- home2_axis,
- home2,
- feel_it_str);
- pfunc(buf, pfdata);
+ return fmt::format("and very close to {}{}",
+ home2,
+ feel_it_str);
}
else
{
- snprintf(buf, sizeof(buf),
- "and very close to %s%s",
- home2,
- feel_it_str);
- pfunc(buf, pfdata);
+ auto home2_distance = approximate_distance(home2_y, home2_x, cquest_dung_y, cquest_dung_x);
+ return fmt::format("and {} to the {} of {}{}",
+ home2_distance,
+ home2_axis,
+ home2,
+ feel_it_str);
}
-
- /* Free dyanmically allocated strings */
- free(home1_axis);
- free(home2_axis);
}
-bool_ quest_god_describe(FILE *fff)
+std::string quest_god_describe()
{
+ fmt::MemoryWriter w;
+
if (cquest.status == QUEST_STATUS_TAKEN)
{
- fprintf(fff, "#####yGod quest " FMTs32b "!\n", cquest_quests_given);
- fprintf(fff, "Thou art to find the lost temple of thy God and\n");
- fprintf(fff, "to retrieve the lost part of the relic for thy God! \n");
- print_directions(FALSE, print_using_print_hook, fff);
- fprintf(fff, "\n");
+ auto directions = make_directions(false);
+ w.write("#####yGod quest {}!\n", cquest_quests_given);
+ w.write("Thou art to find the lost temple of thy God and\n");
+ w.write("to retrieve the lost part of the relic for thy God!\n");
+ w.write("{}", directions.c_str());
}
- return TRUE;
+ return w.str();
}
static void quest_god_place_rand_dung()
{
+ auto &wilderness = game->wilderness;
+ auto const &wf_info = game->edit_data.wf_info;
+
int x = -1, y = -1, tries;
/* erase old dungeon */
if (cquest_quests_given > 0)
{
- wild_map[cquest_dung_y][cquest_dung_x].entrance = 0;
+ wilderness(cquest_dung_x, cquest_dung_y).entrance = 0;
/* erase old recall level */
max_dlv[DUNGEON_GOD] = 0;
@@ -332,19 +311,17 @@ static void quest_god_place_rand_dung()
tries = 1000;
while (tries > 0)
{
- wilderness_map *w_ptr = NULL;
- wilderness_type_info *wf_ptr = NULL;
tries = tries - 1;
/* get grid coordinates, within a range which prevents
* dungeon being generated at the very edge of the
* wilderness (would crash the game). */
- x = rand_range(1, max_wild_x-2);
- y = rand_range(1, max_wild_y-2);
+ x = rand_range(1, wilderness.width()-2);
+ y = rand_range(1, wilderness.height()-2);
/* Is there a town/dungeon/potentially impassable feature there, ? */
- w_ptr = &wild_map[y][x];
- wf_ptr = &wf_info[w_ptr->feat];
+ wilderness_map const *w_ptr = &wilderness(x, y);
+ wilderness_type_info const *wf_ptr = &wf_info[w_ptr->feat];
if ((w_ptr->entrance != 0) ||
(wf_ptr->entrance != 0) ||
@@ -375,7 +352,7 @@ static void quest_god_place_rand_dung()
}
/* create god dungeon in that place */
- wild_map[y][x].entrance = 1000 + DUNGEON_GOD;
+ wilderness(x, y).entrance = 1000 + DUNGEON_GOD;
/* set quest variables */
cquest_dung_x = x;
@@ -384,6 +361,8 @@ static void quest_god_place_rand_dung()
static void quest_god_generate_relic()
{
+ auto const &f_info = game->edit_data.f_info;
+
int tries = 1000, x = -1, y = -1;
object_type relic;
@@ -401,9 +380,8 @@ static void quest_god_generate_relic()
c_ptr = &cave[y][x];
/* are the coordinates on a floor, not on a permanent feature (eg stairs), and not on a trap ? */
- if ((f_info[c_ptr->feat].flags1 & FF1_FLOOR) &&
- (!(f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) &&
- (c_ptr->t_idx == 0))
+ if ((f_info[c_ptr->feat].flags & FF_FLOOR) &&
+ (!(f_info[c_ptr->feat].flags & FF_PERMANENT)))
{
break;
}
@@ -413,7 +391,7 @@ static void quest_god_generate_relic()
object_prep(&relic, lookup_kind(TV_JUNK, get_relic_num()));
/* inscribe it to prevent automatizer 'accidents' */
- relic.note = quark_add("quest");
+ relic.inscription = "quest";
/* If no safe co-ords were found, put it in the players backpack */
if (tries == 0)
@@ -446,6 +424,8 @@ static void quest_god_generate_relic()
static void quest_god_set_god_dungeon_attributes_eru()
{
+ auto &d_info = game->edit_data.d_info;
+
/* The Eru temple is based on Meneltarma. */
/* W: Not too many monsters (they'll be tough though, with big
@@ -478,30 +458,36 @@ static void quest_god_set_god_dungeon_attributes_eru()
/* F: A large pillar, with stairs created at edges. (You can't
* climb a rock through the middle, can you?) */
- d_info[DUNGEON_GOD].flags1 =
- DF1_BIG | DF1_NO_DOORS | DF1_CIRCULAR_ROOMS |
- DF1_EMPTY | DF1_TOWER | DF1_FLAT | DF1_ADJUST_LEVEL_2;
- d_info[DUNGEON_GOD].flags2 =
- DF2_ADJUST_LEVEL_1_2 |
- DF2_NO_SHAFT |
- DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_BIG |
+ DF_NO_DOORS |
+ DF_CIRCULAR_ROOMS |
+ DF_EMPTY |
+ DF_TOWER |
+ DF_FLAT |
+ DF_ADJUST_LEVEL_2 |
+ DF_ADJUST_LEVEL_1_2 |
+ DF_NO_SHAFT |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: */
d_info[DUNGEON_GOD].rules[0].mode = 3;
d_info[DUNGEON_GOD].rules[0].percent = 50;
/* M: We want evil or flying characters */
- d_info[DUNGEON_GOD].rules[0].mflags3 = RF3_EVIL;
+ d_info[DUNGEON_GOD].rules[0].mflags = RF_EVIL;
d_info[DUNGEON_GOD].rules[1].mode = 3;
d_info[DUNGEON_GOD].rules[1].percent = 50;
/* M: We want evil or flying characters */
- d_info[DUNGEON_GOD].rules[1].mflags7 = RF7_CAN_FLY;
+ d_info[DUNGEON_GOD].rules[1].mflags = RF_CAN_FLY;
}
static void quest_god_set_god_dungeon_attributes_manwe()
{
+ auto &d_info = game->edit_data.d_info;
+
/* Manwe's lost temple is high in the clouds */
/* W: Has average number of monsters. */
@@ -533,11 +519,13 @@ static void quest_god_set_god_dungeon_attributes_manwe()
/* F: It's open, goes up like a tower, give it a few
* interesting rooms, make the monsters hard(ish). */
- d_info[DUNGEON_GOD].flags1 =
- DF1_NO_DOORS | DF1_TOWER |
- DF1_CAVERN | DF1_ADJUST_LEVEL_2;
- d_info[DUNGEON_GOD].flags2 =
- DF2_NO_SHAFT | DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_NO_DOORS |
+ DF_TOWER |
+ DF_CAVERN |
+ DF_ADJUST_LEVEL_2 |
+ DF_NO_SHAFT |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: */
d_info[DUNGEON_GOD].rules[0].mode = 3;
@@ -553,15 +541,17 @@ static void quest_god_set_god_dungeon_attributes_manwe()
/* M: We want air(poison-type) or flying characters. Orcs
* too. They would have ransacked his elf-loving temple :) */
- d_info[DUNGEON_GOD].rules[0].mflags2 = RF2_INVISIBLE;
- d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_ORC | RF3_IM_POIS;
- d_info[DUNGEON_GOD].rules[2].mflags4 = RF4_BR_POIS | RF4_BR_GRAV;
- d_info[DUNGEON_GOD].rules[3].mflags5 = RF5_BA_POIS;
- d_info[DUNGEON_GOD].rules[4].mflags7 = RF7_CAN_FLY;
+ d_info[DUNGEON_GOD].rules[0].mflags = RF_INVISIBLE;
+ d_info[DUNGEON_GOD].rules[1].mflags = RF_ORC | RF_IM_POIS;
+ d_info[DUNGEON_GOD].rules[2].mspells = SF_BR_POIS | SF_BR_GRAV;
+ d_info[DUNGEON_GOD].rules[3].mspells = SF_BA_POIS;
+ d_info[DUNGEON_GOD].rules[4].mflags = RF_CAN_FLY;
}
static void quest_god_set_god_dungeon_attributes_tulkas()
{
+ auto &d_info = game->edit_data.d_info;
+
/* Tulkas dungeon is quite normal, possibly a bit boring to be
* honest. Maybe I should add something radical to it. 'The
* house of Tulkas in the midmost of Valmar was a house of
@@ -592,19 +582,23 @@ static void quest_god_set_god_dungeon_attributes_tulkas()
d_info[DUNGEON_GOD].objs.tools = 15;
/* F: fairly standard */
- d_info[DUNGEON_GOD].flags1 = DF1_NO_DESTROY | DF1_ADJUST_LEVEL_2;
- d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_NO_DESTROY |
+ DF_ADJUST_LEVEL_2 |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: */
d_info[DUNGEON_GOD].rules[0].mode = 3;
d_info[DUNGEON_GOD].rules[0].percent = 100;
/* M: plenty demons please */
- d_info[DUNGEON_GOD].rules[0].mflags3 = RF3_DEMON | RF3_EVIL;
+ d_info[DUNGEON_GOD].rules[0].mflags = RF_DEMON | RF_EVIL;
}
static void quest_god_set_god_dungeon_attributes_melkor()
{
+ auto &d_info = game->edit_data.d_info;
+
/* Melkors dungeon will be dark, fiery and stuff */
/* Many many monsters! (but prob ADJUST_LEVEL_1_2) */
@@ -637,8 +631,12 @@ static void quest_god_set_god_dungeon_attributes_melkor()
d_info[DUNGEON_GOD].objs.tools = 25;
/* F: Small, lava rivers, nasty monsters hehehehehe */
- d_info[DUNGEON_GOD].flags1 = DF1_SMALL | DF1_LAVA_RIVERS | DF1_ADJUST_LEVEL_1;
- d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_1_2 | DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_SMALL |
+ DF_LAVA_RIVERS |
+ DF_ADJUST_LEVEL_1 |
+ DF_ADJUST_LEVEL_1_2 |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: No restrictions on monsters here */
d_info[DUNGEON_GOD].rules[0].mode = 0;
@@ -649,11 +647,13 @@ static void quest_god_set_god_dungeon_attributes_melkor()
d_info[DUNGEON_GOD].rules[1].percent = 20;
/* M: */
- d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_GOOD;
+ d_info[DUNGEON_GOD].rules[1].mflags = RF_GOOD;
}
static void quest_god_set_god_dungeon_attributes_yavanna()
{
+ auto &d_info = game->edit_data.d_info;
+
/* Yavannas dungeon will be very natural, tress and stuff. */
d_info[DUNGEON_GOD].min_m_alloc_level = 22;
@@ -683,25 +683,30 @@ static void quest_god_set_god_dungeon_attributes_yavanna()
d_info[DUNGEON_GOD].objs.tools = 40;
/* F: Natural looking */
- d_info[DUNGEON_GOD].flags1 =
- DF1_NO_DOORS | DF1_WATER_RIVERS |
- DF1_NO_DESTROY | DF1_ADJUST_LEVEL_1 |
- DF1_NO_RECALL;
- d_info[DUNGEON_GOD].flags2 =
- DF2_ADJUST_LEVEL_1_2 | DF2_NO_SHAFT |
- DF2_NO_GENO | DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_NO_DOORS |
+ DF_WATER_RIVERS |
+ DF_NO_DESTROY |
+ DF_ADJUST_LEVEL_1 |
+ DF_NO_RECALL |
+ DF_ADJUST_LEVEL_1_2 |
+ DF_NO_SHAFT |
+ DF_NO_GENO |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: Demons, Undead, non-living */
d_info[DUNGEON_GOD].rules[0].mode = 3;
d_info[DUNGEON_GOD].rules[0].percent = 100;
/* M: */
- d_info[DUNGEON_GOD].rules[0].mflags3 =
- RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING;
+ d_info[DUNGEON_GOD].rules[0].mflags =
+ RF_DEMON | RF_UNDEAD | RF_NONLIVING;
}
static void quest_god_set_god_dungeon_attributes_aule()
{
+ auto &d_info = game->edit_data.d_info;
+
d_info[DUNGEON_GOD].min_m_alloc_level = 24;
d_info[DUNGEON_GOD].max_m_alloc_chance = 80;
@@ -731,9 +736,11 @@ static void quest_god_set_god_dungeon_attributes_aule()
/* F: Small, no destroyed levels, min monster level = dungeon
* level */
- d_info[DUNGEON_GOD].flags1 =
- DF1_SMALL | DF1_NO_DESTROY |
- DF1_ADJUST_LEVEL_1 | DF1_NO_STREAMERS;
+ d_info[DUNGEON_GOD].flags =
+ DF_SMALL |
+ DF_NO_DESTROY |
+ DF_ADJUST_LEVEL_1 |
+ DF_NO_STREAMERS;
/* R: No restrictions on monsters here */
d_info[DUNGEON_GOD].rules[0].mode = 0;
@@ -742,6 +749,8 @@ static void quest_god_set_god_dungeon_attributes_aule()
static void quest_god_set_god_dungeon_attributes_varda()
{
+ auto &d_info = game->edit_data.d_info;
+
/* Varda lives with Manwe, so high in the clouds */
/* W: Has average number of monsters. */
@@ -771,11 +780,13 @@ static void quest_god_set_god_dungeon_attributes_varda()
/* F: It's open, goes up like a tower, give it a few
* interesting rooms, make the monsters hard(ish). */
- d_info[DUNGEON_GOD].flags1 =
- DF1_NO_DOORS | DF1_TOWER |
- DF1_CAVERN | DF1_ADJUST_LEVEL_1;
- d_info[DUNGEON_GOD].flags2 =
- DF2_NO_SHAFT | DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_NO_DOORS |
+ DF_TOWER |
+ DF_CAVERN |
+ DF_ADJUST_LEVEL_1 |
+ DF_NO_SHAFT |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: */
d_info[DUNGEON_GOD].rules[0].mode = 3;
@@ -790,15 +801,17 @@ static void quest_god_set_god_dungeon_attributes_varda()
d_info[DUNGEON_GOD].rules[4].percent = 20;
/* M: We want air(poison-type) or flying characters. Orcs too. */
- d_info[DUNGEON_GOD].rules[0].mflags2 = RF2_INVISIBLE;
- d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_ORC | RF3_IM_POIS;
- d_info[DUNGEON_GOD].rules[2].mflags4 = RF4_BR_POIS | RF4_BR_GRAV;
- d_info[DUNGEON_GOD].rules[3].mflags5 = RF5_BA_POIS;
- d_info[DUNGEON_GOD].rules[4].mflags7 = RF7_CAN_FLY;
+ d_info[DUNGEON_GOD].rules[0].mflags = RF_INVISIBLE;
+ d_info[DUNGEON_GOD].rules[1].mflags = RF_ORC | RF_IM_POIS;
+ d_info[DUNGEON_GOD].rules[2].mspells = SF_BR_POIS | SF_BR_GRAV;
+ d_info[DUNGEON_GOD].rules[3].mspells = SF_BA_POIS;
+ d_info[DUNGEON_GOD].rules[4].mflags = RF_CAN_FLY;
}
static void quest_god_set_god_dungeon_attributes_ulmo()
{
+ auto &d_info = game->edit_data.d_info;
+
/* Ulmo dungeon is basically Tulkas, except with acquatic creatures. */
/* W: but with lots of monsters */
@@ -823,8 +836,10 @@ static void quest_god_set_god_dungeon_attributes_ulmo()
d_info[DUNGEON_GOD].objs.tools = 5;
/* F: fairly standard */
- d_info[DUNGEON_GOD].flags1 = DF1_NO_DESTROY | DF1_ADJUST_LEVEL_2;
- d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_NO_DESTROY |
+ DF_ADJUST_LEVEL_2 |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: */
d_info[DUNGEON_GOD].rules[0].mode = 3;
@@ -835,13 +850,15 @@ static void quest_god_set_god_dungeon_attributes_ulmo()
d_info[DUNGEON_GOD].rules[2].percent = 30;
/* M: Aquatic creatures only. */
- d_info[DUNGEON_GOD].rules[0].mflags3 = RF7_CAN_FLY;
- d_info[DUNGEON_GOD].rules[1].mflags3 = RF7_AQUATIC;
- d_info[DUNGEON_GOD].rules[2].mflags3 = RF3_RES_WATE;
+ d_info[DUNGEON_GOD].rules[0].mflags = RF_CAN_FLY;
+ d_info[DUNGEON_GOD].rules[1].mflags = RF_AQUATIC;
+ d_info[DUNGEON_GOD].rules[2].mflags = RF_RES_WATE;
}
static void quest_god_set_god_dungeon_attributes_mandos()
{
+ auto &d_info = game->edit_data.d_info;
+
/* Mandos dungeon is basically Tulkas, except with undead. */
/* W: but with lots of monsters */
@@ -866,8 +883,10 @@ static void quest_god_set_god_dungeon_attributes_mandos()
d_info[DUNGEON_GOD].objs.tools = 15;
/* F: fairly standard */
- d_info[DUNGEON_GOD].flags1 = DF1_NO_DESTROY | DF1_ADJUST_LEVEL_2;
- d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_PLAYER;
+ d_info[DUNGEON_GOD].flags =
+ DF_NO_DESTROY |
+ DF_ADJUST_LEVEL_2 |
+ DF_ADJUST_LEVEL_PLAYER;
/* R: */
d_info[DUNGEON_GOD].rules[0].mode = 3;
@@ -879,16 +898,16 @@ static void quest_god_set_god_dungeon_attributes_mandos()
d_info[DUNGEON_GOD].rules[0].r_char[2] = '\0';
d_info[DUNGEON_GOD].rules[0].r_char[3] = '\0';
d_info[DUNGEON_GOD].rules[0].r_char[4] = '\0';
- d_info[DUNGEON_GOD].rules[0].mflags3 = RF3_UNDEAD | RF3_EVIL;
+ d_info[DUNGEON_GOD].rules[0].mflags = RF_UNDEAD | RF_EVIL;
}
-static bool_ quest_god_level_end_gen_hook(void *, void *, void *)
+static bool quest_god_level_end_gen_hook(void *, void *, void *)
{
/* Check for dungeon */
if ((dungeon_type != DUNGEON_GOD) ||
(cquest.status == QUEST_STATUS_UNTAKEN))
{
- return FALSE;
+ return false;
}
/* if the relic has been created at this point, then it was
@@ -936,17 +955,17 @@ static bool_ quest_god_level_end_gen_hook(void *, void *, void *)
}
}
- return FALSE;
+ return false;
}
-static bool_ quest_god_player_level_hook(void *, void *in_, void *)
+static bool quest_god_player_level_hook(void *, void *in_, void *)
{
struct hook_player_level_in *in = static_cast<struct hook_player_level_in *>(in_);
s32b gained = in->gained_levels;
if (gained <= 0)
{
- return FALSE;
+ return false;
}
/* check player is worshipping a god, not already on a god quest. */
@@ -965,7 +984,7 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *)
{
cquest_dun_minplev = p_ptr->lev;
}
- return FALSE;
+ return false;
}
else
{
@@ -978,6 +997,8 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *)
quest_god_place_rand_dung();
/* God issues instructions */
+ auto directions = make_directions(true);
+
cmsg_format(TERM_L_BLUE, "The voice of %s booms in your head:", deity_info[p_ptr->pgod].name);
cmsg_print(TERM_YELLOW, "'I have a task for thee.");
@@ -986,9 +1007,8 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *)
cmsg_print(TERM_YELLOW, "Thou art to find my lost temple and retrieve a piece of the relic.");
cmsg_print(TERM_YELLOW, "When thy task is done, thou art to lift it in the air and call upon my name.");
cmsg_print(TERM_YELLOW, "I shall then come to reclaim what is mine!");
-
- print_directions(TRUE, print_using_cmsg, NULL);
-
+ cmsg_print(TERM_YELLOW, directions.c_str());
+
/* Prepare depth of dungeon. If this was
* generated in set_god_dungeon_attributes(),
* then we'd have trouble if someone levelled
@@ -997,11 +1017,13 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *)
cquest_dun_maxdepth = cquest_dun_mindepth + 4;
}
- return FALSE;
+ return false;
}
-static bool_ quest_god_get_hook(void *, void *in_, void *)
+static bool quest_god_get_hook(void *, void *in_, void *)
{
+ auto &s_info = game->s_info;
+
hook_get_in *in = static_cast<hook_get_in *>(in_);
s32b item = -in->o_idx; /* Note the negation */
@@ -1049,13 +1071,13 @@ static bool_ quest_god_get_hook(void *, void *in_, void *)
/* Prevent further processing of 'take' action; we've
destroyed the item. */
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-static bool_ quest_god_char_dump_hook(void *, void *in_, void *)
+static bool quest_god_char_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -1088,11 +1110,13 @@ static bool_ quest_god_char_dump_hook(void *, void *in_, void *)
fprintf(f, "\n You found %s of the relic pieces%s.", relics_text, append_text);
}
- return FALSE;
+ return false;
}
static void set_god_dungeon_attributes()
{
+ auto &d_info = game->edit_data.d_info;
+
/* dungeon properties altered according to which god player is worshipping, */
if (p_ptr->pgod == GOD_ERU)
{
@@ -1138,7 +1162,7 @@ static void set_god_dungeon_attributes()
/* W: All dungeons are 5 levels deep, and created at 2/3 of
* the player clvl when the quest is given */
{
- dungeon_info_type *d_ptr = &d_info[DUNGEON_GOD];
+ auto d_ptr = &d_info[DUNGEON_GOD];
d_ptr->mindepth = cquest_dun_mindepth;
d_ptr->maxdepth = cquest_dun_maxdepth;
d_ptr->min_plev = cquest_dun_minplev;
@@ -1157,26 +1181,26 @@ static void quest_god_dungeon_setup(int d_idx)
set_god_dungeon_attributes();
}
-static bool_ quest_god_enter_dungeon_hook(void *, void *in_, void *)
+static bool quest_god_enter_dungeon_hook(void *, void *in_, void *)
{
struct hook_enter_dungeon_in *in = static_cast<struct hook_enter_dungeon_in *>(in_);
quest_god_dungeon_setup(in->d_idx);
- return FALSE;
+ return false;
}
-static bool_ quest_god_gen_level_begin_hook(void *, void *, void *)
+static bool quest_god_gen_level_begin_hook(void *, void *, void *)
{
quest_god_dungeon_setup(dungeon_type);
- return FALSE;
+ return false;
}
-static bool_ quest_god_stair_hook(void *, void *, void *)
+static bool quest_god_stair_hook(void *, void *, void *)
{
quest_god_dungeon_setup(dungeon_type);
- return FALSE;
+ return false;
}
-static bool_ quest_god_birth_objects_hook(void *, void *, void *)
+static bool quest_god_birth_objects_hook(void *, void *, void *)
{
cquest_quests_given = 0;
cquest_relics_found = 0;
@@ -1186,10 +1210,10 @@ static bool_ quest_god_birth_objects_hook(void *, void *, void *)
cquest_relic_gen_tries = 0;
cquest_relic_generated = FALSE;
- return FALSE;
+ return false;
}
-bool_ quest_god_init_hook(int q)
+void quest_god_init_hook()
{
/* Only need hooks if the quest is unfinished. */
if ((cquest.status >= QUEST_STATUS_UNTAKEN) &&
@@ -1207,6 +1231,4 @@ bool_ quest_god_init_hook(int q)
/* Need this to re-initialize at birth; the quest data is
* zeroed which isn't quite right. */
add_hook_new(HOOK_BIRTH_OBJECTS, quest_god_birth_objects_hook, "q_god_birth_objects", NULL);
-
- return FALSE;
}
diff --git a/src/q_god.hpp b/src/q_god.hpp
index d9513bdb..839d4eaa 100644
--- a/src/q_god.hpp
+++ b/src/q_god.hpp
@@ -2,5 +2,7 @@
#include "h-basic.h"
-bool_ quest_god_describe(FILE *);
-bool_ quest_god_init_hook(int q);
+#include <string>
+
+std::string quest_god_describe();
+void quest_god_init_hook();
diff --git a/src/q_haunted.cc b/src/q_haunted.cc
index 57daa40e..f460ee80 100644
--- a/src/q_haunted.cc
+++ b/src/q_haunted.cc
@@ -2,14 +2,16 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_quest_finish_in.hpp"
#include "hooks.hpp"
#include "init1.hpp"
#include "monster2.hpp"
#include "monster_type.hpp"
#include "player_type.hpp"
-#include "traps.hpp"
#include "tables.hpp"
#include "util.hpp"
#include "variable.hpp"
@@ -17,13 +19,18 @@
#define cquest (quest[QUEST_HAUNTED])
-static bool_ quest_haunted_gen_hook(void *, void *, void *)
+static bool quest_haunted_gen_hook(void *, void *, void *)
{
+ auto const &f_info = game->edit_data.f_info;
+
int x, y, i, m_idx;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_HAUNTED) return FALSE;
+ if (p_ptr->inside_quest != QUEST_HAUNTED)
+ {
+ return false;
+ }
/* Just in case we didnt talk the the mayor */
if (cquest.status == QUEST_STATUS_UNTAKEN)
@@ -48,16 +55,15 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *)
init_flags = INIT_CREATE_DUNGEON;
process_dungeon_file("haunted.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
- dungeon_flags2 |= DF2_NO_GENO;
+ dungeon_flags |= DF_NO_GENO;
/* Place some ghosts */
for (i = 12; i > 0; )
{
- int flags;
y = rand_int(21) + 3;
x = rand_int(31) + 3;
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
+ auto const flags = f_info[cave[y][x].feat].flags;
+ if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR))
{
m_idx = place_monster_one(y, x, 477, 0, FALSE, MSTATUS_ENEMY);
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
@@ -68,11 +74,10 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *)
/* Place some random monsters to haunt us */
for (i = damroll(4, 4); i > 0; )
{
- int flags;
y = rand_int(21) + 3;
x = rand_int(31) + 3;
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
+ auto const flags = f_info[cave[y][x].feat].flags;
+ if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR))
{
int monsters[22] = { 65, 100, 124, 125, 133, 231, 273, 327, 365, 416, 418,
507, 508, 533, 534, 553, 554, 555, 577, 607, 622, 665};
@@ -83,30 +88,19 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *)
}
}
- /* Place some random traps */
- for (i = 10 + damroll(4, 4); i > 0; )
- {
- int flags;
- y = rand_int(21) + 3;
- x = rand_int(31) + 3;
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
- {
- --i;
- place_trap(y, x);
- }
- }
-
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_haunted_death_hook(void *, void *, void *)
+static bool quest_haunted_death_hook(void *, void *, void *)
{
int i, mcnt = 0;
- if (p_ptr->inside_quest != QUEST_HAUNTED) return FALSE;
+ if (p_ptr->inside_quest != QUEST_HAUNTED)
+ {
+ return false;
+ }
/* Process the monsters (backwards) */
for (i = m_max - 1; i >= 1; i--)
@@ -115,9 +109,15 @@ static bool_ quest_haunted_death_hook(void *, void *, void *)
monster_type *m_ptr = &m_list[i];
/* Ignore "dead" monsters */
- if (!m_ptr->r_idx) continue;
+ if (!m_ptr->r_idx)
+ {
+ continue;
+ }
- if (m_ptr->status <= MSTATUS_ENEMY) mcnt++;
+ if (m_ptr->status <= MSTATUS_ENEMY)
+ {
+ mcnt++;
+ }
}
/* Nobody left ? */
@@ -130,17 +130,21 @@ static bool_ quest_haunted_death_hook(void *, void *, void *)
process_hooks_restart = TRUE;
cmsg_print(TERM_YELLOW, "Minas Anor is safer now.");
- return (FALSE);
+ return false;
}
- return FALSE;
+
+ return false;
}
-static bool_ quest_haunted_finish_hook(void *, void *in_, void *)
+static bool quest_haunted_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_HAUNTED) return FALSE;
+ if (q_idx != QUEST_HAUNTED)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "Thank you for saving us!", 8, 0);
c_put_str(TERM_YELLOW, "You can use the building as your house as a reward.", 9, 0);
@@ -148,10 +152,10 @@ static bool_ quest_haunted_finish_hook(void *, void *in_, void *)
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_BETWEEN;
- return TRUE;
+ return true;
}
-bool_ quest_haunted_init_hook(int q_idx)
+void quest_haunted_init_hook()
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -159,5 +163,4 @@ bool_ quest_haunted_init_hook(int q_idx)
add_hook_new(HOOK_QUEST_FINISH, quest_haunted_finish_hook, "haunted_finish", NULL);
add_hook_new(HOOK_GEN_QUEST, quest_haunted_gen_hook, "haunted_geb", NULL);
}
- return (FALSE);
}
diff --git a/src/q_haunted.hpp b/src/q_haunted.hpp
index 4f51bce3..3965f0c3 100644
--- a/src/q_haunted.hpp
+++ b/src/q_haunted.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_haunted_init_hook(int q_idx);
+void quest_haunted_init_hook();
diff --git a/src/q_hobbit.cc b/src/q_hobbit.cc
index 5a71711e..655755a3 100644
--- a/src/q_hobbit.cc
+++ b/src/q_hobbit.cc
@@ -1,6 +1,7 @@
#include "q_hobbit.hpp"
#include "cave.hpp"
+#include "game.hpp"
#include "hook_chardump_in.hpp"
#include "hook_chat_in.hpp"
#include "hook_give_in.hpp"
@@ -25,13 +26,16 @@
GENERATE_MONSTER_LOOKUP_FN(get_melinda_proudfoot, "Melinda Proudfoot")
GENERATE_MONSTER_LOOKUP_FN(get_merton_proudfoot, "Merton Proudfoot, the lost hobbit")
-static bool_ quest_hobbit_town_gen_hook(void *, void *in_, void *)
+static bool quest_hobbit_town_gen_hook(void *, void *in_, void *)
{
struct hook_wild_gen_in *in = static_cast<struct hook_wild_gen_in *>(in_);
int x = 1, y = 1, tries = 10000;
bool_ small = in->small;
- if ((turn < (cquest.data[1] + (DAY * 10L))) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) return (FALSE);
+ if ((turn < (cquest.data[1] + (DAY * 10L))) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1))
+ {
+ return false;
+ }
/* Find a good position */
while (tries)
@@ -55,14 +59,17 @@ static bool_ quest_hobbit_town_gen_hook(void *, void *in_, void *)
place_monster_one(y, x, r_idx, 0, FALSE, MSTATUS_ENEMY);
m_allow_special[r_idx] = FALSE;
- return FALSE;
+ return false;
}
-static bool_ quest_hobbit_gen_hook(void *, void *, void *)
+static bool quest_hobbit_gen_hook(void *, void *, void *)
{
int x = 1, y = 1, tries = 10000;
- if ((cquest.status != QUEST_STATUS_TAKEN) || (dun_level != cquest.data[0]) || (dungeon_type != DUNGEON_MAZE)) return FALSE;
+ if ((cquest.status != QUEST_STATUS_TAKEN) || (dun_level != cquest.data[0]) || (dungeon_type != DUNGEON_MAZE))
+ {
+ return false;
+ }
/* Find a good position */
while (tries)
@@ -84,10 +91,10 @@ static bool_ quest_hobbit_gen_hook(void *, void *, void *)
place_monster_one(y, x, r_idx, 0, FALSE, MSTATUS_FRIEND);
m_allow_special[r_idx] = FALSE;
- return FALSE;
+ return false;
}
-static bool_ quest_hobbit_give_hook(void *, void *in_, void *)
+static bool quest_hobbit_give_hook(void *, void *in_, void *)
{
struct hook_give_in *in = static_cast<struct hook_give_in *>(in_);
object_type *o_ptr;
@@ -98,9 +105,9 @@ static bool_ quest_hobbit_give_hook(void *, void *in_, void *)
o_ptr = &p_ptr->inventory[item];
m_ptr = &m_list[m_idx];
- if (m_ptr->r_idx != get_merton_proudfoot()) return (FALSE);
+ if (m_ptr->r_idx != get_merton_proudfoot()) return false;
- if ((o_ptr->tval != TV_SCROLL) || (o_ptr->sval != SV_SCROLL_WORD_OF_RECALL)) return (FALSE);
+ if ((o_ptr->tval != TV_SCROLL) || (o_ptr->sval != SV_SCROLL_WORD_OF_RECALL)) return false;
msg_print("'Oh, thank you, noble one!'");
msg_print("Merton Proudfoot reads the scroll and is recalled to the safety of his home.");
@@ -114,27 +121,27 @@ static bool_ quest_hobbit_give_hook(void *, void *in_, void *)
del_hook_new(HOOK_GIVE, quest_hobbit_give_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_hobbit_speak_hook(void *, void *in_, void *)
+static bool quest_hobbit_speak_hook(void *, void *in_, void *)
{
struct hook_mon_speak_in *in = static_cast<struct hook_mon_speak_in *>(in_);
s32b m_idx = in->m_idx;
if (m_list[m_idx].r_idx != get_melinda_proudfoot())
{
- return (FALSE);
+ return false;
}
if (cquest.status < QUEST_STATUS_COMPLETED)
{
msg_format("%^s begs for your help.", in->m_name);
}
- return (TRUE);
+ return true;
}
-static bool_ quest_hobbit_chat_hook(void *, void *in_, void *)
+static bool quest_hobbit_chat_hook(void *, void *in_, void *)
{
struct hook_chat_in *in = static_cast<struct hook_chat_in *>(in_);
s32b m_idx = in->m_idx;
@@ -142,7 +149,10 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *)
m_ptr = &m_list[m_idx];
- if (m_ptr->r_idx != get_melinda_proudfoot()) return (FALSE);
+ if (m_ptr->r_idx != get_melinda_proudfoot())
+ {
+ return false;
+ }
if (cquest.status < QUEST_STATUS_COMPLETED)
{
@@ -151,7 +161,7 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *)
msg_print("maze and never been seen again! Could you find him for me?");
cquest.status = QUEST_STATUS_TAKEN;
- quest[QUEST_HOBBIT].init(QUEST_HOBBIT);
+ quest[QUEST_HOBBIT].init();
}
else if (cquest.status == QUEST_STATUS_COMPLETED)
{
@@ -168,7 +178,7 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *)
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
cquest.status = QUEST_STATUS_FINISHED;
@@ -176,17 +186,17 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *)
process_hooks_restart = TRUE;
delete_monster_idx(m_idx);
- return TRUE;
+ return true;
}
else
{
msg_print("Thanks again.");
}
- return TRUE;
+ return true;
}
-static bool_ quest_hobbit_dump_hook(void *, void *in_, void *)
+static bool quest_hobbit_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -195,11 +205,13 @@ static bool_ quest_hobbit_dump_hook(void *, void *in_, void *)
{
fprintf(f, "\n You saved a young hobbit from an horrible fate.");
}
- return (FALSE);
+ return false;
}
-bool_ quest_hobbit_init_hook(int q_idx)
+void quest_hobbit_init_hook()
{
+ auto &messages = game->messages;
+
/* Get a level to place the hobbit */
if (!cquest.data[0])
{
@@ -207,7 +219,7 @@ bool_ quest_hobbit_init_hook(int q_idx)
cquest.data[1] = turn;
if (wizard)
{
- message_add(format("Hobbit level %d", cquest.data[0]), TERM_BLUE);
+ messages.add(format("Hobbit level %d", cquest.data[0]), TERM_BLUE);
}
}
@@ -226,5 +238,4 @@ bool_ quest_hobbit_init_hook(int q_idx)
add_hook_new(HOOK_CHAT, quest_hobbit_chat_hook, "hobbit_chat", NULL);
}
add_hook_new(HOOK_CHAR_DUMP, quest_hobbit_dump_hook, "hobbit_dump", NULL);
- return (FALSE);
}
diff --git a/src/q_hobbit.hpp b/src/q_hobbit.hpp
index b1878748..c3482fd9 100644
--- a/src/q_hobbit.hpp
+++ b/src/q_hobbit.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_hobbit_init_hook(int q_idx);
+void quest_hobbit_init_hook();
diff --git a/src/q_invas.cc b/src/q_invas.cc
index 64483d28..60ca0b65 100644
--- a/src/q_invas.cc
+++ b/src/q_invas.cc
@@ -19,13 +19,16 @@
#define cquest (quest[QUEST_INVASION])
-static bool_ quest_invasion_gen_hook(void *, void *, void *)
+static bool quest_invasion_gen_hook(void *, void *, void *)
{
int x, y;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_INVASION) return FALSE;
+ if (p_ptr->inside_quest != QUEST_INVASION)
+ {
+ return false;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -47,6 +50,7 @@ static bool_ quest_invasion_gen_hook(void *, void *, void *)
process_dungeon_file("maeglin.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = 3; x < xstart; x++)
+ {
for (y = 3; y < ystart; y++)
{
if (cave[y][x].feat == FEAT_MARKER)
@@ -58,18 +62,22 @@ static bool_ quest_invasion_gen_hook(void *, void *, void *)
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_LESS);
}
}
+ }
- return TRUE;
+ return true;
}
-static bool_ quest_invasion_ai_hook(void *, void *in_, void *out_)
+static bool quest_invasion_ai_hook(void *, void *in_, void *out_)
{
struct hook_monster_ai_in *in = static_cast<struct hook_monster_ai_in *>(in_);
struct hook_monster_ai_out *out = static_cast<struct hook_monster_ai_out *>(out_);
monster_type *m_ptr = in->m_ptr;
s32b m_idx = in->m_idx;
- if (p_ptr->inside_quest != QUEST_INVASION) return FALSE;
+ if (p_ptr->inside_quest != QUEST_INVASION)
+ {
+ return false;
+ }
/* Ugly but thats better than a call to test_monster_name which is SLOW */
if (m_ptr->r_idx == 825)
@@ -82,26 +90,26 @@ static bool_ quest_invasion_ai_hook(void *, void *in_, void *out_)
cmsg_print(TERM_YELLOW, "Maeglin found the way to Gondolin! All hope is lost now!");
cquest.status = QUEST_STATUS_FAILED;
town_info[2].destroyed = TRUE;
- return (FALSE);
+ return false;
}
/* Attack or flee ?*/
if (distance(m_ptr->fy, m_ptr->fx, p_ptr->py, p_ptr->px) <= 2)
{
- return (FALSE);
+ return false;
}
else
{
out->y = cquest.data[0];
out->x = cquest.data[1];
- return (TRUE);
+ return true;
}
}
- return (FALSE);
+ return false;
}
-static bool_ quest_invasion_turn_hook(void *, void *, void *)
+static bool quest_invasion_turn_hook(void *, void *, void *)
{
if (cquest.status != QUEST_STATUS_UNTAKEN) return (FALSE);
if (p_ptr->lev < 45) return (FALSE);
@@ -120,14 +128,14 @@ static bool_ quest_invasion_turn_hook(void *, void *, void *)
cquest.status = QUEST_STATUS_TAKEN;
- quest_invasion_init_hook(QUEST_INVASION);
+ quest_invasion_init_hook();
del_hook_new(HOOK_END_TURN, quest_invasion_turn_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
-static bool_ quest_invasion_dump_hook(void *, void *in_, void *)
+static bool quest_invasion_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -140,16 +148,19 @@ static bool_ quest_invasion_dump_hook(void *, void *in_, void *)
{
fprintf(f, "\n You saved Gondolin from destruction.");
}
- return (FALSE);
+ return false;
}
-static bool_ quest_invasion_death_hook(void *, void *in_, void *)
+static bool quest_invasion_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
s32b r_idx = m_list[m_idx].r_idx;
- if (p_ptr->inside_quest != QUEST_INVASION) return FALSE;
+ if (p_ptr->inside_quest != QUEST_INVASION)
+ {
+ return false;
+ }
if (r_idx == test_monster_name("Maeglin, the Traitor of Gondolin"))
{
@@ -159,13 +170,13 @@ static bool_ quest_invasion_death_hook(void *, void *in_, void *)
del_hook_new(HOOK_MONSTER_DEATH, quest_invasion_death_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
- return FALSE;
+ return false;
}
-static bool_ quest_invasion_stair_hook(void *, void *in_, void *)
+static bool quest_invasion_stair_hook(void *, void *in_, void *)
{
struct hook_stair_in *in = static_cast<struct hook_stair_in *>(in_);
@@ -201,13 +212,13 @@ static bool_ quest_invasion_stair_hook(void *, void *in_, void *)
}
del_hook_new(HOOK_STAIR, quest_invasion_stair_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
- return TRUE;
+ return true;
}
-bool_ quest_invasion_init_hook(int q_idx)
+void quest_invasion_init_hook()
{
add_hook_new(HOOK_END_TURN, quest_invasion_turn_hook, "invasion_turn", NULL);
add_hook_new(HOOK_CHAR_DUMP, quest_invasion_dump_hook, "invasion_dump", NULL);
@@ -218,5 +229,4 @@ bool_ quest_invasion_init_hook(int q_idx)
add_hook_new(HOOK_MONSTER_DEATH, quest_invasion_death_hook, "invasion_death", NULL);
add_hook_new(HOOK_STAIR, quest_invasion_stair_hook, "invasion_stair", NULL);
}
- return (FALSE);
}
diff --git a/src/q_invas.hpp b/src/q_invas.hpp
index 87b8fc77..dc2d8780 100644
--- a/src/q_invas.hpp
+++ b/src/q_invas.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_invasion_init_hook(int q_idx);
+void quest_invasion_init_hook();
diff --git a/src/q_library.cc b/src/q_library.cc
index 52a67291..e267e2b7 100644
--- a/src/q_library.cc
+++ b/src/q_library.cc
@@ -1,13 +1,14 @@
#include "q_library.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "lua_bind.hpp"
#include "monster2.hpp"
#include "monster_type.hpp"
#include "object2.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "spells3.hpp"
#include "spells4.hpp"
#include "tables.hpp"
@@ -18,11 +19,10 @@
#include "z-rand.hpp"
#include <cassert>
+#include <fmt/format.h>
#define cquest (quest[QUEST_LIBRARY])
-#define print_hook(fmt,...) do { fprintf(hook_file, fmt, ##__VA_ARGS__); } while (0)
-
#define MONSTER_LICH 518
#define MONSTER_MONASTIC_LICH 611
#define MONSTER_FLESH_GOLEM 256
@@ -59,7 +59,6 @@ void initialize_bookable_spells()
push_spell(RECHARGE);
push_spell(DISPERSEMAGIC);
push_spell(BLINK);
- push_spell(DISARM);
push_spell(TELEPORT);
push_spell(SENSEMONSTERS);
push_spell(SENSEHIDDEN);
@@ -313,19 +312,19 @@ static void library_quest_fill_book()
screen_load();
}
-static bool_ quest_library_gen_hook(void *, void *, void *)
+static bool quest_library_gen_hook(void *, void *, void *)
{
/* Only if player doing this quest */
if (p_ptr->inside_quest != QUEST_LIBRARY)
{
- return FALSE;
+ return false;
}
{
int y = 2;
int x = 2;
load_map("library.map", &y, &x);
- dungeon_flags2 = DF2_NO_GENO;
+ dungeon_flags = DF_NO_GENO;
}
/* Generate monsters */
@@ -353,46 +352,41 @@ static bool_ quest_library_gen_hook(void *, void *, void *)
library_quest_place_nrandom(
10, 10, 37, 67, MONSTER_MITHRIL_GOLEM, 1);
- return TRUE;
+ return true;
}
-static bool_ quest_library_stair_hook(void *, void *, void *)
+static bool quest_library_stair_hook(void *, void *, void *)
{
- bool_ ret;
-
/* only ask this if player about to go up stairs of quest and hasn't won yet */
if ((p_ptr->inside_quest != QUEST_LIBRARY) ||
(cquest.status == QUEST_STATUS_COMPLETED))
{
- return FALSE;
+ return false;
}
if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS)
{
- return FALSE;
+ return false;
}
/* flush all pending input */
flush();
/* confirm */
- ret = get_check("Really abandon the quest?");
-
- /* if yes, then */
- if (ret == TRUE)
+ if (get_check("Really abandon the quest?"))
{
/* fail the quest */
cquest.status = QUEST_STATUS_FAILED;
- return FALSE;
+ return false;
}
else
{
/* if no, they stay in the quest */
- return TRUE;
+ return true;
}
}
-static bool_ quest_library_monster_death_hook(void *, void *, void *)
+static bool quest_library_monster_death_hook(void *, void *, void *)
{
int i, count = -1;
@@ -400,7 +394,7 @@ static bool_ quest_library_monster_death_hook(void *, void *, void *)
if ((p_ptr->inside_quest != QUEST_LIBRARY) ||
(cquest.status == QUEST_STATUS_COMPLETED))
{
- return FALSE;
+ return false;
}
/* Count all the enemies left alive */
@@ -422,7 +416,7 @@ static bool_ quest_library_monster_death_hook(void *, void *, void *)
}
/* Normal processing */
- return FALSE;
+ return false;
}
void quest_library_building(bool_ *paid, bool_ *recreate)
@@ -457,7 +451,7 @@ void quest_library_building(bool_ *paid, bool_ *recreate)
object_type forge;
object_type *q_ptr = &forge;
object_prep(q_ptr, lookup_kind(TV_BOOK, 61));
- q_ptr->art_name = quark_add(player_name);
+ q_ptr->artifact_name = game->player_name;
q_ptr->found = OBJ_FOUND_REWARD;
object_aware(q_ptr);
object_known(q_ptr);
@@ -482,28 +476,26 @@ void quest_library_building(bool_ *paid, bool_ *recreate)
}
}
-bool_ quest_library_describe(FILE *hook_file)
+std::string quest_library_describe()
{
+ fmt::MemoryWriter w;
+
if (cquest.status == QUEST_STATUS_TAKEN)
{
- print_hook("#####yAn Old Mages Quest! (Danger Level: 35)\n");
- print_hook("Make the library safe for the old mage in Minas Anor.\n");
- print_hook("\n");
+ w.write("#####yAn Old Mages Quest! (Danger Level: 35)\n");
+ w.write("Make the library safe for the old mage in Minas Anor.");
}
else if (cquest.status == QUEST_STATUS_COMPLETED)
{
- /* Quest done, book not gotten yet */
- print_hook("#####yAn Old Mages Quest!\n");
- print_hook("You have made the library safe for the old mage in Minas Anor.\n");
- print_hook("Perhaps you should see about a reward.\n");
- print_hook("\n");
+ w.write("#####yAn Old Mages Quest!\n");
+ w.write("You have made the library safe for the old mage in Minas Anor.\n");
+ w.write("Perhaps you should see about a reward.");
}
- /* Normal processing */
- return TRUE;
+ return w.str();
}
-bool_ quest_library_init_hook(int q)
+void quest_library_init_hook()
{
/* Only need hooks if the quest is unfinished. */
if ((cquest.status >= QUEST_STATUS_UNTAKEN) &&
@@ -519,8 +511,4 @@ bool_ quest_library_init_hook(int q)
{
quest_library_finalize_book();
}
-
- return FALSE;
}
-
-#undef print_hook
diff --git a/src/q_library.hpp b/src/q_library.hpp
index 8150893e..266accc3 100644
--- a/src/q_library.hpp
+++ b/src/q_library.hpp
@@ -2,7 +2,9 @@
#include "h-basic.h"
-bool_ quest_library_init_hook(int q);
-bool_ quest_library_describe(FILE *fff);
+#include <string>
+
+void quest_library_init_hook();
+std::string quest_library_describe();
void quest_library_building(bool_ *paid, bool_ *recreate);
void initialize_bookable_spells();
diff --git a/src/q_main.cc b/src/q_main.cc
index ed11b9dc..2d3473f1 100644
--- a/src/q_main.cc
+++ b/src/q_main.cc
@@ -1,10 +1,12 @@
#include "q_main.hpp"
+#include "game.hpp"
#include "hook_chardump_in.hpp"
#include "hook_monster_death_in.hpp"
#include "hook_new_monster_in.hpp"
#include "hooks.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "player_type.hpp"
#include "tables.hpp"
@@ -27,8 +29,10 @@ static void quest_describe(int q_idx)
}
}
-static bool_ quest_main_monsters_hook(void *, void *in_, void *)
+static bool quest_main_monsters_hook(void *, void *in_, void *)
{
+ auto const &r_info = game->edit_data.r_info;
+
struct hook_new_monster_in *in = static_cast<struct hook_new_monster_in *>(in_);
s32b r_idx = in->r_idx;
@@ -36,20 +40,28 @@ static bool_ quest_main_monsters_hook(void *, void *in_, void *)
if (r_idx == get_sauron())
{
/* No Sauron until Necromancer dies */
- if (r_info[get_necromancer()].max_num) return TRUE;
+ if (r_info[get_necromancer()].max_num)
+ {
+ return true;
+ }
}
/* Morgoth */
else if (r_idx == get_morgoth())
{
/* No Morgoth until Sauron dies */
- if (r_info[get_sauron()].max_num) return TRUE;
+ if (r_info[get_sauron()].max_num)
+ {
+ return true;
+ }
}
- return FALSE;
+ return false;
}
-static bool_ quest_morgoth_hook(void *, void *, void *)
+static bool quest_morgoth_hook(void *, void *, void *)
{
- monster_race *r_ptr = &r_info[get_morgoth()];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[get_morgoth()];
/* Need to kill him */
if (!r_ptr->max_num)
@@ -92,12 +104,12 @@ static bool_ quest_morgoth_hook(void *, void *, void *)
*(quest[QUEST_MORGOTH].plot) = QUEST_ULTRA_GOOD;
else
*(quest[QUEST_MORGOTH].plot) = QUEST_ULTRA_EVIL;
- quest[*(quest[QUEST_MORGOTH].plot)].init(*(quest[QUEST_MORGOTH].plot));
+ quest[*(quest[QUEST_MORGOTH].plot)].init();
}
- return (FALSE);
+ return false;
}
-static bool_ quest_morgoth_dump_hook(void *, void *in_, void *)
+static bool quest_morgoth_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -105,14 +117,18 @@ static bool_ quest_morgoth_dump_hook(void *, void *in_, void *)
if (quest[QUEST_MORGOTH].status >= QUEST_STATUS_COMPLETED)
{
if (quest[QUEST_ONE].status == QUEST_STATUS_FINISHED)
- fprintf(f, "\n You saved Arda and became a famed %s.", sp_ptr->winner);
+ {
+ fprintf(f, "\n You saved Arda and became a famed hero.");
+ }
else
+ {
fprintf(f, "\n You became a new force of darkness and enslaved all free people.");
+ }
}
- return (FALSE);
+ return false;
}
-bool_ quest_morgoth_init_hook(int q_idx)
+void quest_morgoth_init_hook()
{
if ((quest[QUEST_MORGOTH].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED))
{
@@ -120,12 +136,13 @@ bool_ quest_morgoth_init_hook(int q_idx)
}
add_hook_new(HOOK_CHAR_DUMP, quest_morgoth_dump_hook, "morgoth_dump", NULL);
add_hook_new(HOOK_NEW_MONSTER, quest_main_monsters_hook, "main_new_monster", NULL);
- return (FALSE);
}
-static bool_ quest_sauron_hook(void *, void *, void *)
+static bool quest_sauron_hook(void *, void *, void *)
{
- monster_race *r_ptr = &r_info[get_sauron()];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[get_sauron()];
/* Need to kill him */
if (!r_ptr->max_num)
@@ -139,23 +156,26 @@ static bool_ quest_sauron_hook(void *, void *, void *)
del_hook_new(HOOK_MONSTER_DEATH, quest_sauron_hook);
add_hook_new(HOOK_MONSTER_DEATH, quest_morgoth_hook, "morgort_death", NULL);
*(quest[QUEST_SAURON].plot) = QUEST_MORGOTH;
- quest_morgoth_init_hook(QUEST_MORGOTH);
+ quest_morgoth_init_hook();
process_hooks_restart = TRUE;
}
- return (FALSE);
+
+ return false;
}
-static bool_ quest_sauron_resurect_hook(void *, void *in_, void *)
+static bool quest_sauron_resurrect_hook(void *, void *in_, void *)
{
+ auto &r_info = game->edit_data.r_info;
+
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
monster_type *m_ptr = &m_list[m_idx];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ auto r_ptr = &r_info[m_ptr->r_idx];
- if ((r_ptr->flags7 & RF7_NAZGUL) && r_info[get_sauron()].max_num)
+ if ((r_ptr->flags & RF_NAZGUL) && r_info[get_sauron()].max_num)
{
- msg_format("Somehow you feel %s is not totally destroyed...", (r_ptr->flags1 & RF1_FEMALE ? "she" : "he"));
+ msg_format("Somehow you feel %s is not totally destroyed...", (r_ptr->flags & RF_FEMALE ? "she" : "he"));
r_ptr->max_num = 1;
}
else if ((m_ptr->r_idx == get_sauron()) && (quest[QUEST_ONE].status < QUEST_STATUS_FINISHED))
@@ -163,23 +183,24 @@ static bool_ quest_sauron_resurect_hook(void *, void *in_, void *)
msg_print("Sauron will not be permanently defeated until the One Ring is either destroyed or used...");
r_ptr->max_num = 1;
}
- return FALSE;
+ return false;
}
-bool_ quest_sauron_init_hook(int q_idx)
+void quest_sauron_init_hook()
{
if ((quest[QUEST_SAURON].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_SAURON].status < QUEST_STATUS_FINISHED))
{
add_hook_new(HOOK_MONSTER_DEATH, quest_sauron_hook, "sauron_death", NULL);
}
add_hook_new(HOOK_NEW_MONSTER, quest_main_monsters_hook, "main_new_monster", NULL);
- add_hook_new(HOOK_MONSTER_DEATH, quest_sauron_resurect_hook, "sauron_resurect_death", NULL);
- return (FALSE);
+ add_hook_new(HOOK_MONSTER_DEATH, quest_sauron_resurrect_hook, "sauron_resurect_death", NULL);
}
-static bool_ quest_necro_hook(void *, void *, void *)
+static bool quest_necro_hook(void *, void *, void *)
{
- monster_race *r_ptr = &r_info[get_necromancer()];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[get_necromancer()];
/* Need to kill him */
if (!r_ptr->max_num)
@@ -191,20 +212,20 @@ static bool_ quest_necro_hook(void *, void *, void *)
quest[QUEST_NECRO].status = QUEST_STATUS_FINISHED;
*(quest[QUEST_NECRO].plot) = QUEST_ONE;
- quest[*(quest[QUEST_NECRO].plot)].init(*(quest[QUEST_NECRO].plot));
+ quest[*(quest[QUEST_NECRO].plot)].init();
del_hook_new(HOOK_MONSTER_DEATH, quest_necro_hook);
process_hooks_restart = TRUE;
}
- return (FALSE);
+
+ return false;
}
-bool_ quest_necro_init_hook(int q_idx)
+void quest_necro_init_hook()
{
if ((quest[QUEST_NECRO].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED))
{
add_hook_new(HOOK_MONSTER_DEATH, quest_necro_hook, "necro_death", NULL);
}
add_hook_new(HOOK_NEW_MONSTER, quest_main_monsters_hook, "main_new_monster", NULL);
- return (FALSE);
}
diff --git a/src/q_main.hpp b/src/q_main.hpp
index a88530fc..be33897b 100644
--- a/src/q_main.hpp
+++ b/src/q_main.hpp
@@ -2,6 +2,6 @@
#include "h-basic.h"
-bool_ quest_necro_init_hook(int q_idx);
-bool_ quest_sauron_init_hook(int q_idx);
-bool_ quest_morgoth_init_hook(int q_idx);
+void quest_necro_init_hook();
+void quest_sauron_init_hook();
+void quest_morgoth_init_hook();
diff --git a/src/q_narsil.cc b/src/q_narsil.cc
index a6c0eed3..8d3c2775 100644
--- a/src/q_narsil.cc
+++ b/src/q_narsil.cc
@@ -14,7 +14,7 @@
#define cquest (quest[QUEST_NARSIL])
-static bool_ quest_narsil_move_hook(void *, void *in_, void *)
+static bool quest_narsil_move_hook(void *, void *in_, void *)
{
struct hook_move_in *in = static_cast<struct hook_move_in *>(in_);
s32b y = in->y;
@@ -23,10 +23,16 @@ static bool_ quest_narsil_move_hook(void *, void *in_, void *)
int i;
object_type *o_ptr;
- if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
/* The castle of Aragorn */
- if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 14)) return FALSE;
+ if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 14))
+ {
+ return false;
+ }
/* Look out for Narsil */
for (i = 0; i < INVEN_TOTAL; i++)
@@ -38,7 +44,10 @@ static bool_ quest_narsil_move_hook(void *, void *in_, void *)
if (o_ptr->name1 == ART_NARSIL) break;
}
- if (i == INVEN_TOTAL) return FALSE;
+ if (i == INVEN_TOTAL)
+ {
+ return false;
+ }
cmsg_print(TERM_YELLOW, "I heard that the broken sword had been found!");
cmsg_print(TERM_YELLOW, "I thought it was only a rumor... until now.");
@@ -65,10 +74,10 @@ static bool_ quest_narsil_move_hook(void *, void *in_, void *)
del_hook_new(HOOK_MOVE, quest_narsil_move_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_narsil_dump_hook(void *, void *in_, void *)
+static bool quest_narsil_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -77,10 +86,10 @@ static bool_ quest_narsil_dump_hook(void *, void *in_, void *)
{
fprintf(f, "\n The sword that was broken is now reforged.");
}
- return (FALSE);
+ return false;
}
-static bool_ quest_narsil_identify_hook(void *, void *in_, void *)
+static bool quest_narsil_identify_hook(void *, void *in_, void *)
{
struct hook_identify_in *in = static_cast<struct hook_identify_in *>(in_);
@@ -104,10 +113,10 @@ static bool_ quest_narsil_identify_hook(void *, void *in_, void *)
}
}
- return (FALSE);
+ return false;
}
-bool_ quest_narsil_init_hook(int q_idx)
+void quest_narsil_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -118,5 +127,4 @@ bool_ quest_narsil_init_hook(int q_idx)
add_hook_new(HOOK_IDENTIFY, quest_narsil_identify_hook, "narsil_id", NULL);
}
add_hook_new(HOOK_CHAR_DUMP, quest_narsil_dump_hook, "narsil_dump", NULL);
- return (FALSE);
}
diff --git a/src/q_narsil.hpp b/src/q_narsil.hpp
index b83e63cf..da0fa85d 100644
--- a/src/q_narsil.hpp
+++ b/src/q_narsil.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_narsil_init_hook(int q_idx);
+void quest_narsil_init_hook();
diff --git a/src/q_nazgul.cc b/src/q_nazgul.cc
index 15a6a843..99735eed 100644
--- a/src/q_nazgul.cc
+++ b/src/q_nazgul.cc
@@ -22,13 +22,16 @@
GENERATE_MONSTER_LOOKUP_FN(get_uvatha, "Uvatha the Horseman")
-static bool_ quest_nazgul_gen_hook(void *, void *in_, void *)
+static bool quest_nazgul_gen_hook(void *, void *in_, void *)
{
struct hook_wild_gen_in *in = static_cast<struct hook_wild_gen_in *>(in_);
int m_idx, x = 1, y = 1, tries = 10000;
bool_ small = in->small;
- if ((cquest.status != QUEST_STATUS_TAKEN) || (small) || (p_ptr->town_num != 1)) return (FALSE);
+ if ((cquest.status != QUEST_STATUS_TAKEN) || (small) || (p_ptr->town_num != 1))
+ {
+ return false;
+ }
/* Find a good position */
while (tries)
@@ -54,16 +57,19 @@ static bool_ quest_nazgul_gen_hook(void *, void *in_, void *)
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
- return FALSE;
+ return false;
}
-static bool_ quest_nazgul_finish_hook(void *, void *in_, void *)
+static bool quest_nazgul_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
object_type forge, *q_ptr;
- if (q_idx != QUEST_NAZGUL) return FALSE;
+ if (q_idx != QUEST_NAZGUL)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "I believe he will not come back! Thank you.", 8, 0);
c_put_str(TERM_YELLOW, "Some time ago a ranger gave me this.", 9, 0);
@@ -76,7 +82,7 @@ static bool_ quest_nazgul_finish_hook(void *, void *in_, void *)
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
/* End the plot */
*(quest[q_idx].plot) = QUEST_NULL;
@@ -84,10 +90,10 @@ static bool_ quest_nazgul_finish_hook(void *, void *in_, void *)
del_hook_new(HOOK_QUEST_FINISH, quest_nazgul_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_nazgul_dump_hook(void *, void *in_, void *)
+static bool quest_nazgul_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -96,42 +102,53 @@ static bool_ quest_nazgul_dump_hook(void *, void *in_, void *)
{
fprintf(f, "\n You saved Bree from a dreadful Nazgul.");
}
- return (FALSE);
+ return false;
}
-static bool_ quest_nazgul_forbid_hook(void *, void *in_, void *)
+static bool quest_nazgul_forbid_hook(void *, void *in_, void *)
{
struct hook_init_quest_in *in = static_cast<struct hook_init_quest_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_NAZGUL) return (FALSE);
+ if (q_idx != QUEST_NAZGUL)
+ {
+ return false;
+ }
if (p_ptr->lev < 30)
{
c_put_str(TERM_WHITE, "I fear you are not ready for the next quest, come back later.", 8, 0);
- return (TRUE);
+ return true;
}
- return (FALSE);
+
+ return false;
}
-static bool_ quest_nazgul_death_hook(void *, void *in_, void *)
+static bool quest_nazgul_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
s32b r_idx = m_list[m_idx].r_idx;
- if (cquest.status != QUEST_STATUS_TAKEN) return (FALSE);
- if (r_idx != get_uvatha()) return (FALSE);
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
+
+ if (r_idx != get_uvatha())
+ {
+ return false;
+ }
cquest.status = QUEST_STATUS_COMPLETED;
del_hook_new(HOOK_MONSTER_DEATH, quest_nazgul_death_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
-bool_ quest_nazgul_init_hook(int q_idx)
+void quest_nazgul_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -141,5 +158,4 @@ bool_ quest_nazgul_init_hook(int q_idx)
}
add_hook_new(HOOK_CHAR_DUMP, quest_nazgul_dump_hook, "nazgul_dump", NULL);
add_hook_new(HOOK_INIT_QUEST, quest_nazgul_forbid_hook, "nazgul_forbid", NULL);
- return (FALSE);
}
diff --git a/src/q_nazgul.hpp b/src/q_nazgul.hpp
index 32e3237c..ad35e5b3 100644
--- a/src/q_nazgul.hpp
+++ b/src/q_nazgul.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_nazgul_init_hook(int q_idx);
+void quest_nazgul_init_hook();
diff --git a/src/q_nirna.cc b/src/q_nirna.cc
index a92ba6e4..822d8b6c 100644
--- a/src/q_nirna.cc
+++ b/src/q_nirna.cc
@@ -13,13 +13,16 @@
#define cquest (quest[QUEST_NIRNAETH])
-static bool_ quest_nirnaeth_gen_hook(void *, void *, void *)
+static bool quest_nirnaeth_gen_hook(void *, void *, void *)
{
int x, y;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE;
+ if (p_ptr->inside_quest != QUEST_NIRNAETH)
+ {
+ return false;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -44,20 +47,25 @@ static bool_ quest_nirnaeth_gen_hook(void *, void *, void *)
cquest.data[0] = 0;
cquest.data[1] = 0;
for (x = 2; x < xstart; x++)
+ {
for (y = 2; y < ystart; y++)
{
if (cave[y][x].m_idx) cquest.data[0]++;
}
+ }
- return TRUE;
+ return true;
}
-static bool_ quest_nirnaeth_finish_hook(void *, void *in_, void *)
+static bool quest_nirnaeth_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_NIRNAETH) return FALSE;
+ if (q_idx != QUEST_NIRNAETH)
+ {
+ return false;
+ }
/* Killed at least 2/3 of them ? better reward ! */
if (cquest.data[1] >= (2 * cquest.data[0] / 3))
@@ -86,33 +94,39 @@ static bool_ quest_nirnaeth_finish_hook(void *, void *in_, void *)
del_hook_new(HOOK_QUEST_FINISH, quest_nirnaeth_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_nirnaeth_death_hook(void *, void *, void *)
+static bool quest_nirnaeth_death_hook(void *, void *, void *)
{
if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE;
cquest.data[1]++;
- return FALSE;
+ return false;
}
-static bool_ quest_nirnaeth_stair_hook(void *, void *, void *)
+static bool quest_nirnaeth_stair_hook(void *, void *, void *)
{
- if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE;
+ if (p_ptr->inside_quest != QUEST_NIRNAETH)
+ {
+ return false;
+ }
- if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) return (FALSE);
+ if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS)
+ {
+ return false;
+ }
cmsg_print(TERM_YELLOW, "You found a way out!");
cquest.status = QUEST_STATUS_COMPLETED;
del_hook_new(HOOK_STAIR, quest_nirnaeth_stair_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
-bool_ quest_nirnaeth_init_hook(int q_idx)
+void quest_nirnaeth_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -121,5 +135,4 @@ bool_ quest_nirnaeth_init_hook(int q_idx)
add_hook_new(HOOK_STAIR, quest_nirnaeth_stair_hook, "nirnaeth_stair", NULL);
add_hook_new(HOOK_QUEST_FINISH, quest_nirnaeth_finish_hook, "nirnaeth_finish", NULL);
}
- return (FALSE);
}
diff --git a/src/q_nirna.hpp b/src/q_nirna.hpp
index 24a8759f..1aaeae54 100644
--- a/src/q_nirna.hpp
+++ b/src/q_nirna.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_nirnaeth_init_hook(int q_idx);
+void quest_nirnaeth_init_hook();
diff --git a/src/q_one.cc b/src/q_one.cc
index 3741e009..8985b695 100644
--- a/src/q_one.cc
+++ b/src/q_one.cc
@@ -3,6 +3,7 @@
#include "artifact_type.hpp"
#include "cave.hpp"
#include "cave_type.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "hook_calculate_hp_in.hpp"
#include "hook_calculate_hp_out.hpp"
@@ -26,7 +27,7 @@
#define cquest (quest[QUEST_ONE])
-static bool_ quest_one_move_hook(void *, void *in_, void *)
+static bool quest_one_move_hook(void *, void *in_, void *)
{
struct hook_move_in *in = static_cast<struct hook_move_in *>(in_);
s32b y = in->y;
@@ -35,10 +36,16 @@ static bool_ quest_one_move_hook(void *, void *in_, void *)
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
- if (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED) return (FALSE);
+ if (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED)
+ {
+ return false;
+ }
/* The mirror of Galadriel */
- if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23)) return (FALSE);
+ if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23))
+ {
+ return false;
+ }
cmsg_print(TERM_YELLOW, "You meet Galadriel; she seems worried.");
cmsg_print(TERM_YELLOW, "'So it was Sauron that lurked in Dol Guldur...'");
@@ -82,24 +89,34 @@ static bool_ quest_one_move_hook(void *, void *in_, void *)
/* Continue the plot */
cquest.status = QUEST_STATUS_TAKEN;
- cquest.init(QUEST_ONE);
+ cquest.init();
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-static bool_ quest_one_drop_hook(void *, void *in_, void *)
+static bool quest_one_drop_hook(void *, void *in_, void *)
{
struct hook_drop_in *in = static_cast<struct hook_drop_in *>(in_);
s32b o_idx = in->o_idx;
object_type *o_ptr = &p_ptr->inventory[o_idx];
- if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
+
+ if (o_ptr->name1 != ART_POWER)
+ {
+ return false;
+ }
- if (o_ptr->name1 != ART_POWER) return FALSE;
- if (cave[p_ptr->py][p_ptr->px].feat != FEAT_GREAT_FIRE) return FALSE;
+ if (cave[p_ptr->py][p_ptr->px].feat != FEAT_GREAT_FIRE)
+ {
+ return false;
+ }
cmsg_print(TERM_YELLOW, "You throw the One Ring into the #RGreat Fire#y; it is rapidly consumed");
cmsg_print(TERM_YELLOW, "by the searing flames.");
@@ -114,34 +131,46 @@ static bool_ quest_one_drop_hook(void *, void *in_, void *)
cquest.status = QUEST_STATUS_FINISHED;
*(quest[QUEST_ONE].plot) = QUEST_SAURON;
quest[*(quest[QUEST_ONE].plot)].status = QUEST_STATUS_TAKEN;
- quest[*(quest[QUEST_ONE].plot)].init(*(quest[QUEST_ONE].plot));
+ quest[*(quest[QUEST_ONE].plot)].init();
- return TRUE;
+ return true;
}
-static bool_ quest_one_wield_hook(void *, void *in_, void *)
+static bool quest_one_wield_hook(void *, void *in_, void *)
{
struct hook_wield_in *in = static_cast<struct hook_wield_in *>(in_);
object_type *o_ptr = in->o_ptr;
- if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
- if (o_ptr->name1 != ART_POWER) return FALSE;
+ if (o_ptr->name1 != ART_POWER)
+ {
+ return false;
+ }
- /* Flush input */
+ // Make sure player is **really** warned
flush();
+ if (!get_check("You were warned not to wear it; are you sure?"))
+ {
+ return true;
+ }
- if (!get_check("You were warned not to wear it; are you sure?")) return TRUE;
- /* Flush input */
flush();
+ if (!get_check("You were warned not to wear it; are you *REALLY* sure?"))
+ {
+ return true;
+ }
- if (!get_check("You were warned not to wear it; are you *REALLY* sure?")) return TRUE;
-
- /* Flush input */
flush();
+ if (!get_check("You were *WARNED* not to wear it; are you *R*E*A*L*L*Y* sure?"))
+ {
+ return true;
+ }
- if (!get_check("You were *WARNED* not to wear it; are you *R*E*A*L*L*Y* sure?")) return TRUE;
-
+ // Ok, that's enough warning
cmsg_print(TERM_YELLOW, "As you put it on your finger you feel #Ddark powers #ysapping your soul.");
cmsg_print(TERM_YELLOW, "The ring firmly binds to your finger!");
cmsg_print(TERM_YELLOW, "You feel you are drawn to the shadow world! Your material form weakens.");
@@ -166,15 +195,15 @@ static bool_ quest_one_wield_hook(void *, void *in_, void *)
cquest.status = QUEST_STATUS_FAILED_DONE;
*(quest[QUEST_ONE].plot) = QUEST_SAURON;
quest[*(quest[QUEST_ONE].plot)].status = QUEST_STATUS_TAKEN;
- quest[*(quest[QUEST_ONE].plot)].init(*(quest[QUEST_ONE].plot));
+ quest[*(quest[QUEST_ONE].plot)].init();
/* Ok lets reset the lives counter */
p_ptr->lives = 0;
- return FALSE;
+ return false;
}
-static bool_ quest_one_hp_hook(void *, void *in_, void *out_)
+static bool quest_one_hp_hook(void *, void *in_, void *out_)
{
struct hook_calculate_hp_in *in = static_cast<struct hook_calculate_hp_in *>(in_);
struct hook_calculate_hp_out *out = static_cast<struct hook_calculate_hp_out *>(out_);
@@ -184,15 +213,18 @@ static bool_ quest_one_hp_hook(void *, void *in_, void *out_)
s32b mhp = in->mhp;
for (int i = 0; i < p_ptr->lives + 1; i++)
+ {
mhp = (mhp * 2) / 3;
+ }
out->mhp = mhp;
- return (TRUE);
+ return true;
}
- return (FALSE);
+
+ return false;
}
-static bool_ quest_one_die_hook(void *, void *, void *)
+static bool quest_one_die_hook(void *, void *, void *)
{
if (cquest.status == QUEST_STATUS_FAILED_DONE)
{
@@ -200,19 +232,19 @@ static bool_ quest_one_die_hook(void *, void *, void *)
{
cmsg_print(TERM_YELLOW, "You feel the power of the One Ring sustaining your life,");
cmsg_print(TERM_YELLOW, "but it drags you even more into the shadow world.");
- return (TRUE);
+ return true;
}
else
{
cmsg_print(TERM_YELLOW, "The One Ring finally drags you totally to the shadow world.");
cmsg_print(TERM_YELLOW, "Your mortal existence ends there.");
- strcpy(died_from, "being drawn to the shadow world");
+ game->died_from = "being drawn to the shadow world";
}
}
- return (FALSE);
+ return false;
}
-static bool_ quest_one_identify_hook(void *, void *in_, void *)
+static bool quest_one_identify_hook(void *, void *in_, void *)
{
struct hook_identify_in *in = static_cast<struct hook_identify_in *>(in_);
object_type *o_ptr = in->o_ptr;
@@ -227,44 +259,52 @@ static bool_ quest_one_identify_hook(void *, void *in_, void *)
}
}
- return (FALSE);
+ return false;
}
-static bool_ quest_one_death_hook(void *, void *in_, void *)
+static bool quest_one_death_hook(void *, void *in_, void *)
{
+ auto const &a_info = game->edit_data.a_info;
+
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
s32b r_idx = m_list[m_idx].r_idx;
- bool_ ok = FALSE;
+ bool ok = false;
- if (a_info[ART_POWER].cur_num) return FALSE;
+ if (a_info[ART_POWER].cur_num)
+ {
+ return false;
+ }
/* Paranoia */
- if (cquest.status != QUEST_STATUS_TAKEN) return (FALSE);
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
if (magik(30) && (r_idx == test_monster_name("Sauron, the Sorcerer")))
{
- ok = TRUE;
+ ok = true;
}
else if (magik(10) && (r_idx == test_monster_name("Ar-Pharazon the Golden")))
{
- ok = TRUE;
+ ok = true;
}
else if (magik(10) && (r_idx == test_monster_name("Shelob, Spider of Darkness")))
{
- ok = TRUE;
+ ok = true;
}
else if (magik(10) && (r_idx == test_monster_name("The Watcher in the Water")))
{
- ok = TRUE;
+ ok = true;
}
else if (magik(10) && (r_idx == test_monster_name("Glaurung, Father of the Dragons")))
{
- ok = TRUE;
+ ok = true;
}
else if (magik(10) && (r_idx == test_monster_name("Feagwath, the Undead Sorcerer")))
{
- ok = TRUE;
+ ok = true;
}
if (ok)
@@ -287,7 +327,10 @@ static bool_ quest_one_death_hook(void *, void *in_, void *)
for (i = 0; i < INVEN_PACK; i++)
{
/* Skip non-objects */
- if (!p_ptr->inventory[i].k_idx) break;
+ if (!p_ptr->inventory[i].k_idx)
+ {
+ break;
+ }
}
/* Arg, no space ! */
if (i == INVEN_PACK)
@@ -307,10 +350,10 @@ static bool_ quest_one_death_hook(void *, void *in_, void *)
inven_carry(q_ptr, FALSE);
}
- return (FALSE);
+ return false;
}
-static bool_ quest_one_dump_hook(void *, void *in_, void *)
+static bool quest_one_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -323,16 +366,22 @@ static bool_ quest_one_dump_hook(void *, void *in_, void *)
{
fprintf(f, "\n You fell under the evil influence of the One Ring and decided to wear it.");
}
- return (FALSE);
+ return false;
}
-static bool_ quest_one_gen_hook(void *, void *, void *)
+static bool quest_one_gen_hook(void *, void *, void *)
{
s32b x, y, tries = 10000;
/* Paranoia */
- if (cquest.status != QUEST_STATUS_TAKEN) return (FALSE);
- if ((dungeon_type != DUNGEON_ANGBAND) || (dun_level != 99)) return (FALSE);
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
+ if ((dungeon_type != DUNGEON_ANGBAND) || (dun_level != 99))
+ {
+ return false;
+ }
/* Find a good position */
while (tries)
@@ -354,10 +403,10 @@ static bool_ quest_one_gen_hook(void *, void *, void *)
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
}
- return (FALSE);
+ return false;
}
-bool_ quest_one_init_hook(int q_idx)
+void quest_one_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -374,5 +423,4 @@ bool_ quest_one_init_hook(int q_idx)
add_hook_new(HOOK_CHAR_DUMP, quest_one_dump_hook, "one_dump", NULL);
add_hook_new(HOOK_CALC_HP, quest_one_hp_hook, "one_hp", NULL);
add_hook_new(HOOK_DIE, quest_one_die_hook, "one_die", NULL);
- return (FALSE);
}
diff --git a/src/q_one.hpp b/src/q_one.hpp
index a85a5733..13389968 100644
--- a/src/q_one.hpp
+++ b/src/q_one.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_one_init_hook(int q_idx);
+void quest_one_init_hook();
diff --git a/src/q_poison.cc b/src/q_poison.cc
index a5b274b0..e7f1c71b 100644
--- a/src/q_poison.cc
+++ b/src/q_poison.cc
@@ -2,6 +2,7 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "game.hpp"
#include "hook_chardump_in.hpp"
#include "hook_drop_in.hpp"
#include "hook_init_quest_in.hpp"
@@ -10,10 +11,11 @@
#include "messages.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "object2.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "tables.hpp"
#include "util.hpp"
#include "variable.hpp"
@@ -31,9 +33,11 @@ static int wild_locs[4][2] =
static bool_ create_molds_hook(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
- if (r_ptr->flags4 & RF4_MULTIPLY) return FALSE;
+ auto r_ptr = &r_info[r_idx];
+
+ if (r_ptr->spells & SF_MULTIPLY) return FALSE;
if (r_ptr->d_char == 'm') return TRUE;
else if (r_ptr->d_char == ',') return TRUE;
@@ -41,15 +45,27 @@ static bool_ create_molds_hook(int r_idx)
else return FALSE;
}
-static bool_ quest_poison_gen_hook(void *, void *, void *)
+static bool quest_poison_gen_hook(void *, void *, void *)
{
int cy = 1, cx = 1, x, y, tries = 10000, r_idx;
bool_ (*old_get_mon_num_hook)(int r_idx);
- if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;
- if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0]) return FALSE;
- if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1]) return FALSE;
- if (p_ptr->wild_mode) return FALSE;
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
+ if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0])
+ {
+ return false;
+ }
+ if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1])
+ {
+ return false;
+ }
+ if (p_ptr->wild_mode)
+ {
+ return false;
+ }
/* Find a good position */
while (tries)
@@ -59,7 +75,10 @@ static bool_ quest_poison_gen_hook(void *, void *, void *)
cx = randint(cur_wid - 34) + 32;
/* Is it a good spot ? */
- if (cave_empty_bold(cy, cx)) break;
+ if (cave_empty_bold(cy, cx))
+ {
+ break;
+ }
/* One less try */
tries--;
@@ -78,15 +97,28 @@ static bool_ quest_poison_gen_hook(void *, void *, void *)
/* Pick a monster, using the level calculation */
for (x = cx - 25; x <= cx + 25; x++)
+ {
for (y = cy - 25; y <= cy + 25; y++)
{
- if (!in_bounds(y, x)) continue;
+ if (!in_bounds(y, x))
+ {
+ continue;
+ }
- if (distance(cy, cx, y, x) > 25) continue;
+ if (distance(cy, cx, y, x) > 25)
+ {
+ continue;
+ }
- if (magik(80) && ((cave[y][x].feat == FEAT_DEEP_WATER) || (cave[y][x].feat == FEAT_SHAL_WATER))) cave_set_feat(y, x, FEAT_TAINTED_WATER);
+ if (magik(80) && ((cave[y][x].feat == FEAT_DEEP_WATER) || (cave[y][x].feat == FEAT_SHAL_WATER)))
+ {
+ cave_set_feat(y, x, FEAT_TAINTED_WATER);
+ }
- if (distance(cy, cx, y, x) > 10) continue;
+ if (distance(cy, cx, y, x) > 10)
+ {
+ continue;
+ }
if (magik(60))
{
@@ -109,6 +141,7 @@ static bool_ quest_poison_gen_hook(void *, void *, void *)
}
}
}
+ }
/* Reset restriction */
get_mon_num_hook = old_get_mon_num_hook;
@@ -116,16 +149,19 @@ static bool_ quest_poison_gen_hook(void *, void *, void *)
/* Prepare allocation table */
get_mon_num_prep();
- return FALSE;
+ return false;
}
-static bool_ quest_poison_finish_hook(void *, void *in_, void *)
+static bool quest_poison_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
object_type forge, *q_ptr;
- if (q_idx != QUEST_POISON) return FALSE;
+ if (q_idx != QUEST_POISON)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "The water is clean again! Thank you so much.", 8, 0);
c_put_str(TERM_YELLOW, "The beautiful Mallorns are safe. Take this as a proof of our gratitude.", 9, 0);
@@ -139,7 +175,7 @@ static bool_ quest_poison_finish_hook(void *, void *in_, void *)
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_NULL;
@@ -147,10 +183,10 @@ static bool_ quest_poison_finish_hook(void *, void *in_, void *)
del_hook_new(HOOK_QUEST_FINISH, quest_poison_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_poison_dump_hook(void *, void *in_, void *)
+static bool quest_poison_dump_hook(void *, void *in_, void *)
{
hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -159,16 +195,19 @@ static bool_ quest_poison_dump_hook(void *, void *in_, void *)
{
fprintf(f, "\n You saved the beautiful Mallorns of Lothlorien.");
}
- return (FALSE);
+ return false;
}
-static bool_ quest_poison_quest_hook(void *, void *in_, void *)
+static bool quest_poison_quest_hook(void *, void *in_, void *)
{
struct hook_init_quest_in *in = static_cast<struct hook_init_quest_in *>(in_);
s32b q_idx = in->q_idx;
object_type forge, *q_ptr;
- if (q_idx != QUEST_POISON) return FALSE;
+ if (q_idx != QUEST_POISON)
+ {
+ return false;
+ }
q_ptr = &forge;
object_prep(q_ptr, lookup_kind(TV_POTION2, SV_POTION2_CURE_WATER));
@@ -176,29 +215,48 @@ static bool_ quest_poison_quest_hook(void *, void *in_, void *)
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_STOREB;
- q_ptr->note = quark_add("quest");
- (void)inven_carry(q_ptr, FALSE);
+ q_ptr->inscription = "quest";
+
+ inven_carry(q_ptr, FALSE);
del_hook_new(HOOK_INIT_QUEST, quest_poison_quest_hook);
process_hooks_restart = TRUE;
- return FALSE;
+ return false;
}
-static bool_ quest_poison_drop_hook(void *, void *in_, void *)
+static bool quest_poison_drop_hook(void *, void *in_, void *)
{
struct hook_drop_in *in = static_cast<struct hook_drop_in *>(in_);
s32b mcnt = 0, i, x, y;
s32b o_idx = in->o_idx;
object_type *o_ptr = &p_ptr->inventory[o_idx];
- if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;
- if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0]) return FALSE;
- if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1]) return FALSE;
- if (p_ptr->wild_mode) return FALSE;
+ if (cquest.status != QUEST_STATUS_TAKEN)
+ {
+ return false;
+ }
+ if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0])
+ {
+ return false;
+ }
+ if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1])
+ {
+ return false;
+ }
+ if (p_ptr->wild_mode)
+ {
+ return false;
+ }
- if (o_ptr->tval != TV_POTION2) return FALSE;
- if (o_ptr->sval != SV_POTION2_CURE_WATER) return FALSE;
+ if (o_ptr->tval != TV_POTION2)
+ {
+ return false;
+ }
+ if (o_ptr->sval != SV_POTION2_CURE_WATER)
+ {
+ return false;
+ }
for (i = m_max - 1; i >= 1; i--)
{
@@ -206,20 +264,34 @@ static bool_ quest_poison_drop_hook(void *, void *in_, void *)
monster_type *m_ptr = &m_list[i];
/* Ignore "dead" monsters */
- if (!m_ptr->r_idx) continue;
+ if (!m_ptr->r_idx)
+ {
+ continue;
+ }
- if (m_ptr->status <= MSTATUS_NEUTRAL) mcnt++;
+ if (m_ptr->status <= MSTATUS_NEUTRAL)
+ {
+ mcnt++;
+ }
}
if (mcnt < 10)
{
for (x = 1; x < cur_wid - 1; x++)
+ {
for (y = 1; y < cur_hgt - 1; y++)
{
- if (!in_bounds(y, x)) continue;
+ if (!in_bounds(y, x))
+ {
+ continue;
+ }
- if (cave[y][x].feat == FEAT_TAINTED_WATER) cave_set_feat(y, x, FEAT_SHAL_WATER);
+ if (cave[y][x].feat == FEAT_TAINTED_WATER)
+ {
+ cave_set_feat(y, x, FEAT_SHAL_WATER);
+ }
}
+ }
cmsg_print(TERM_YELLOW, "Well done! The water seems to be clean now.");
@@ -228,24 +300,29 @@ static bool_ quest_poison_drop_hook(void *, void *in_, void *)
del_hook_new(HOOK_DROP, quest_poison_drop_hook);
process_hooks_restart = TRUE;
- return FALSE;
+ return false;
}
else
{
msg_print("There are too many monsters left to cure the water.");
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-bool_ quest_poison_init_hook(int q_idx)
+void quest_poison_init_hook()
{
+ auto &messages = game->messages;
+
/* Get a place to place the poison */
if (!cquest.data[1])
{
cquest.data[1] = TRUE;
cquest.data[0] = rand_int(4);
- if (wizard) message_add(format("Wilderness poison %d, %d", wild_locs[cquest.data[0]][0], wild_locs[cquest.data[0]][1]), TERM_BLUE);
+ if (wizard)
+ {
+ messages.add(format("Wilderness poison %d, %d", wild_locs[cquest.data[0]][0], wild_locs[cquest.data[0]][1]), TERM_BLUE);
+ }
}
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
@@ -259,5 +336,4 @@ bool_ quest_poison_init_hook(int q_idx)
add_hook_new(HOOK_INIT_QUEST, quest_poison_quest_hook, "poison_iquest", NULL);
}
add_hook_new(HOOK_CHAR_DUMP, quest_poison_dump_hook, "poison_dump", NULL);
- return (FALSE);
}
diff --git a/src/q_poison.hpp b/src/q_poison.hpp
index f8d97ace..6c4e771b 100644
--- a/src/q_poison.hpp
+++ b/src/q_poison.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_poison_init_hook(int q_idx);
+void quest_poison_init_hook();
diff --git a/src/q_rand.cc b/src/q_rand.cc
index 4ef79928..b643ca39 100644
--- a/src/q_rand.cc
+++ b/src/q_rand.cc
@@ -3,7 +3,9 @@
#include "artifact_type.hpp"
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
+#include "game.hpp"
#include "generate.hpp"
#include "hook_build_room1_in.hpp"
#include "hook_chardump_in.hpp"
@@ -14,10 +16,13 @@
#include "messages.hpp"
#include "monster2.hpp"
#include "monster3.hpp"
-#include "monster_type.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
+#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "player_type.hpp"
@@ -28,6 +33,7 @@
#include "z-rand.hpp"
#include <cassert>
+#include <fmt/format.h>
static int randquest_hero[] = { 20, 13, 15, 16, 9, 17, 18, 8, -1 };
@@ -49,6 +55,10 @@ GENERATE_MONSTER_LOOKUP_FN(get_adventurer, "Adventurer")
void initialize_random_quests(int n)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto &r_info = game->edit_data.r_info;
+ auto &messages = game->messages;
+
int step, lvl, i, k;
int old_type = dungeon_type;
@@ -76,14 +86,12 @@ void initialize_random_quests(int n)
random_quest *q_ptr = &random_quests[rl];
- int j;
-
/* Find the appropriate dungeon */
- for (j = 0; j < max_d_idx; j++)
+ for (std::size_t j = 0; j < d_info.size(); j++)
{
- dungeon_info_type *d_ptr = &d_info[j];
+ auto d_ptr = &d_info[j];
- if (!(d_ptr->flags1 & DF1_PRINCIPAL)) continue;
+ if (!(d_ptr->flags & DF_PRINCIPAL)) continue;
if ((d_ptr->mindepth <= rl) && (rl <= d_ptr->maxdepth))
{
@@ -109,23 +117,23 @@ void initialize_random_quests(int n)
r_ptr = &r_info[q_ptr->r_idx];
/* Accept only monsters that can be generated */
- if (r_ptr->flags9 & RF9_SPECIAL_GENE) continue;
- if (r_ptr->flags9 & RF9_NEVER_GENE) continue;
+ if (r_ptr->flags & RF_SPECIAL_GENE) continue;
+ if (r_ptr->flags & RF_NEVER_GENE) continue;
/* Accept only monsters that are not breeders */
- if (r_ptr->flags4 & RF4_MULTIPLY) continue;
+ if (r_ptr->spells & SF_MULTIPLY) continue;
/* Forbid joke monsters */
- if (r_ptr->flags8 & RF8_JOKEANGBAND) continue;
+ if (r_ptr->flags & RF_JOKEANGBAND) continue;
/* Accept only monsters that are not friends */
- if (r_ptr->flags7 & RF7_PET) continue;
+ if (r_ptr->flags & RF_PET) continue;
/* Refuse nazguls */
- if (r_ptr->flags7 & RF7_NAZGUL) continue;
+ if (r_ptr->flags & RF_NAZGUL) continue;
/* Accept only monsters that are not good */
- if (r_ptr->flags3 & RF3_GOOD) continue;
+ if (r_ptr->flags & RF_GOOD) continue;
/* If module says a monster race is friendly, then skip */
if (modules[game_module_idx].race_status != NULL)
@@ -148,11 +156,11 @@ void initialize_random_quests(int n)
if (!ok) continue;
/* No mutliple uniques */
- if ((r_ptr->flags1 & RF1_UNIQUE) &&
+ if ((r_ptr->flags & RF_UNIQUE) &&
((q_ptr->type != 1) || (r_ptr->max_num == -1))) continue;
/* No single non uniques */
- if ((!(r_ptr->flags1 & RF1_UNIQUE)) && (q_ptr->type == 1)) continue;
+ if ((!(r_ptr->flags & RF_UNIQUE)) && (q_ptr->type == 1)) continue;
/* Level restriction */
min_level = (rl > RQ_LEVEL_CAP) ? RQ_LEVEL_CAP : rl;
@@ -166,23 +174,22 @@ void initialize_random_quests(int n)
{
if (wizard)
{
- message_add(format("Could not find quest monster on lvl %d", rl), TERM_RED);
+ messages.add(format("Could not find quest monster on lvl %d", rl), TERM_RED);
}
q_ptr->type = 0;
}
else
{
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
r_ptr->max_num = -1;
}
- q_ptr->done = FALSE;
+ q_ptr->done = false;
if (wizard)
{
- message_add(format("Quest for %d on lvl %d",
- q_ptr->r_idx, rl), TERM_RED);
+ messages.add(format("Quest for %d on lvl %d", q_ptr->r_idx, rl), TERM_RED);
}
}
@@ -211,7 +218,9 @@ bool_ is_randhero(int level)
static void do_get_new_obj(int y, int x)
{
- obj_theme theme;
+ auto &k_info = game->edit_data.k_info;
+ auto &a_info = game->edit_data.a_info;
+
object_type *q_ptr[3], forge[3];
int res, i;
@@ -225,14 +234,8 @@ static void do_get_new_obj(int y, int x)
/* Wipe the object */
object_wipe(q_ptr[i]);
- /* No themes */
- theme.treasure = 100;
- theme.combat = 100;
- theme.magic = 100;
- theme.tools = 100;
-
/* Make a great object */
- make_object(q_ptr[i], TRUE, TRUE, theme);
+ make_object(q_ptr[i], TRUE, TRUE, obj_theme::no_theme());
q_ptr[i]->found = OBJ_FOUND_REWARD;
char buf[100];
@@ -267,9 +270,9 @@ static void do_get_new_obj(int y, int x)
/* Mega-Hack -- Preserve the artifact */
if (o_ptr->tval == TV_RANDART)
{
- random_artifacts[o_ptr->sval].generated = FALSE;
+ game->random_artifacts[o_ptr->sval].generated = FALSE;
}
- else if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART)
+ else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART)
{
k_info[o_ptr->k_idx].artifact = FALSE;
}
@@ -316,7 +319,7 @@ static void princess_death(s32b m_idx, s32b r_idx)
do_get_new_obj(y, x);
- random_quests[dun_level].done = TRUE;
+ random_quests[dun_level].done = true;
break;
}
@@ -325,7 +328,7 @@ static void princess_death(s32b m_idx, s32b r_idx)
static void hero_death(s32b m_idx, s32b r_idx)
{
- random_quests[dun_level].done = TRUE;
+ random_quests[dun_level].done = true;
cmsg_print(TERM_YELLOW, "The adventurer steps out of the shadows and picks up his sword:");
cmsg_print(TERM_YELLOW, "'Ah! My sword! My trusty sword! Thanks.");
@@ -401,49 +404,60 @@ static void hero_death(s32b m_idx, s32b r_idx)
}
}
-static bool_ quest_random_death_hook(void *, void *in_, void *)
+static bool quest_random_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
int r_idx = m_list[m_idx].r_idx;
- if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE);
- if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE);
- if (!random_quests[dun_level].type) return (FALSE);
- if (random_quests[dun_level].done) return (FALSE);
- if (p_ptr->inside_quest) return (FALSE);
- if (random_quests[dun_level].r_idx != r_idx) return (FALSE);
-
- if (!(m_list[m_idx].mflag & MFLAG_QUEST)) return (FALSE);
+ if ((!(dungeon_flags & DF_PRINCIPAL)) ||
+ ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) ||
+ (!random_quests[dun_level].type) ||
+ (random_quests[dun_level].done) ||
+ (p_ptr->inside_quest) ||
+ (random_quests[dun_level].r_idx != r_idx) ||
+ (!(m_list[m_idx].mflag & MFLAG_QUEST)))
+ {
+ return false;
+ }
/* Killed enough ?*/
quest[QUEST_RANDOM].data[0]++;
if (quest[QUEST_RANDOM].data[0] == random_quests[dun_level].type)
{
if (is_randhero(dun_level))
+ {
hero_death(m_idx, r_idx);
+ }
else
+ {
princess_death(m_idx, r_idx);
+ }
}
- return (FALSE);
+ return false;
}
-static bool_ quest_random_turn_hook(void *, void *, void *)
+static bool quest_random_turn_hook(void *, void *, void *)
{
quest[QUEST_RANDOM].data[0] = 0;
quest[QUEST_RANDOM].data[1] = 0;
- return (FALSE);
+ return false;
}
-static bool_ quest_random_feeling_hook(void *, void *, void *)
+static bool quest_random_feeling_hook(void *, void *, void *)
{
- if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE);
- if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE);
- if (!random_quests[dun_level].type) return (FALSE);
- if (random_quests[dun_level].done) return (FALSE);
- if (p_ptr->inside_quest) return (FALSE);
- if (!dun_level) return (FALSE);
+ auto const &r_info = game->edit_data.r_info;
+
+ if ((!(dungeon_flags & DF_PRINCIPAL)) ||
+ ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) ||
+ (!random_quests[dun_level].type) ||
+ (random_quests[dun_level].done) ||
+ (p_ptr->inside_quest) ||
+ (!dun_level))
+ {
+ return false;
+ }
if (is_randhero(dun_level))
{
@@ -451,22 +465,25 @@ static bool_ quest_random_feeling_hook(void *, void *, void *)
cmsg_format(TERM_YELLOW, "'Oh, please help me! A horrible %s stole my sword! I'm nothing without it.'", r_info[random_quests[dun_level].r_idx].name);
}
else
+ {
cmsg_format(TERM_YELLOW, "You hear someone shouting: 'Leave me alone, stupid %s'", r_info[random_quests[dun_level].r_idx].name);
- return (FALSE);
+ }
+ return false;
}
-static bool_ quest_random_gen_hero_hook(void *, void *, void *)
+static bool quest_random_gen_hero_hook(void *, void *, void *)
{
- int i;
-
- if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE);
- if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE);
- if (!random_quests[dun_level].type) return (FALSE);
- if (random_quests[dun_level].done) return (FALSE);
- if (p_ptr->inside_quest) return (FALSE);
- if (!is_randhero(dun_level)) return (FALSE);
+ if ((!(dungeon_flags & DF_PRINCIPAL)) ||
+ ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) ||
+ (!random_quests[dun_level].type) ||
+ (random_quests[dun_level].done) ||
+ (p_ptr->inside_quest) ||
+ (!is_randhero(dun_level)))
+ {
+ return false;
+ }
- i = random_quests[dun_level].type;
+ int i = random_quests[dun_level].type;
m_allow_special[random_quests[dun_level].r_idx] = TRUE;
while (i)
@@ -483,10 +500,10 @@ static bool_ quest_random_gen_hero_hook(void *, void *, void *)
}
m_allow_special[random_quests[dun_level].r_idx] = FALSE;
- return (FALSE);
+ return false;
}
-static bool_ quest_random_gen_hook(void *, void *in_, void *)
+static bool quest_random_gen_hook(void *, void *in_, void *)
{
struct hook_build_room1_in *in = static_cast<struct hook_build_room1_in *>(in_);
s32b bx0 = in->x;
@@ -497,19 +514,25 @@ static bool_ quest_random_gen_hook(void *, void *in_, void *)
int y2, x2, yval, xval;
int y1, x1, xsize, ysize;
- if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE);
- if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE);
- if (!random_quests[dun_level].type) return (FALSE);
- if (random_quests[dun_level].done) return (FALSE);
- if (p_ptr->inside_quest) return (FALSE);
- if (quest[QUEST_RANDOM].data[1]) return (FALSE);
- if (is_randhero(dun_level)) return (FALSE);
+ if ((!(dungeon_flags & DF_PRINCIPAL)) ||
+ ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) ||
+ (!random_quests[dun_level].type) ||
+ (random_quests[dun_level].done) ||
+ (p_ptr->inside_quest) ||
+ (quest[QUEST_RANDOM].data[1]) ||
+ (is_randhero(dun_level)))
+ {
+ return false;
+ }
/* Pick a room size */
get_map_size(format("qrand%d.map", random_quests[dun_level].type), &ysize, &xsize);
/* Try to allocate space for room. If fails, exit */
- if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return FALSE;
+ if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval))
+ {
+ return false;
+ }
/* Get corner values */
y1 = yval - ysize / 2;
@@ -541,24 +564,23 @@ static bool_ quest_random_gen_hook(void *, void *in_, void *)
process_dungeon_file(format("qrand%d.map", random_quests[dun_level].type), &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = x1; x < xstart; x++)
+ {
for (y = y1; y < ystart; y++)
{
cave[y][x].info |= CAVE_ICKY | CAVE_ROOM;
if (cave[y][x].feat == FEAT_MARKER)
{
- monster_type *m_ptr;
- int i;
-
m_allow_special[random_quests[dun_level].r_idx] = TRUE;
- i = place_monster_one(y, x, random_quests[dun_level].r_idx, 0, FALSE, MSTATUS_ENEMY);
+ int i = place_monster_one(y, x, random_quests[dun_level].r_idx, 0, FALSE, MSTATUS_ENEMY);
m_allow_special[random_quests[dun_level].r_idx] = FALSE;
if (i)
{
- m_ptr = &m_list[i];
+ auto m_ptr = &m_list[i];
m_ptr->mflag |= MFLAG_QUEST;
}
}
}
+ }
/* Dont try another one for this generation */
quest[QUEST_RANDOM].data[1] = 1;
@@ -566,10 +588,10 @@ static bool_ quest_random_gen_hook(void *, void *in_, void *)
/* Boost level feeling a bit - a la pits */
rating += 10;
- return (TRUE);
+ return true;
}
-static bool_ quest_random_dump_hook(void *, void *in_, void *)
+static bool quest_random_dump_hook(void *, void *in_, void *)
{
static const char *number[] = { "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
@@ -612,37 +634,48 @@ static bool_ quest_random_dump_hook(void *, void *in_, void *)
fprintf(f, "\n You haven't completed a single lost sword quest.");
}
- return (FALSE);
+ return false;
}
-bool_ quest_random_describe(FILE *fff)
+std::string quest_random_describe()
{
- if (!(dungeon_flags1 & DF1_PRINCIPAL)) return FALSE;
- if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return FALSE;
- if (!random_quests[dun_level].type) return FALSE;
- if (random_quests[dun_level].done) return FALSE;
- if (p_ptr->inside_quest) return FALSE;
- if (!dun_level) return FALSE;
+ auto const &r_info = game->edit_data.r_info;
+
+ // Only emit description if we're actually on a
+ // random quest level.
+ if ((!(dungeon_flags & DF_PRINCIPAL)) ||
+ ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) ||
+ (!random_quests[dun_level].type) ||
+ (random_quests[dun_level].done) ||
+ (p_ptr->inside_quest) ||
+ (!dun_level))
+ {
+ return "";
+ }
+
+ fmt::MemoryWriter w;
if (!is_randhero(dun_level))
{
- fprintf(fff, "#####yCaptured princess!\n");
- fprintf(fff, "A princess is being held prisoner and tortured here!\n");
- fprintf(fff, "Save her from the horrible %s.\n", r_info[random_quests[dun_level].r_idx].name);
+ w.write("#####yCaptured princess!\n");
+ w.write("A princess is being held prisoner and tortured here!\n");
+ w.write("Save her from the horrible {}.\n", r_info[random_quests[dun_level].r_idx].name);
}
else
{
- fprintf(fff, "#####yLost sword!\n");
- fprintf(fff, "An adventurer lost his sword to a bunch of %s!\n", r_info[random_quests[dun_level].r_idx].name);
- fprintf(fff, "Kill them all to get it back.\n");
+ w.write("#####yLost sword!\n");
+ w.write("An adventurer lost his sword to a bunch of {}!\n", r_info[random_quests[dun_level].r_idx].name);
+ w.write("Kill them all to get it back.\n");
}
- fprintf(fff, "Number: %d, Killed: %ld.\n",
- random_quests[dun_level].type, (long int) quest[QUEST_RANDOM].data[0]);
- fprintf(fff, "\n");
- return TRUE;
+
+ w.write("Number: {}, Killed: {}.",
+ random_quests[dun_level].type,
+ quest[QUEST_RANDOM].data[0]);
+
+ return w.str();
}
-bool_ quest_random_init_hook(int q_idx)
+void quest_random_init_hook()
{
add_hook_new(HOOK_MONSTER_DEATH, quest_random_death_hook, "rand_death", NULL);
add_hook_new(HOOK_NEW_LEVEL, quest_random_turn_hook, "rand_new_lvl", NULL);
@@ -651,5 +684,4 @@ bool_ quest_random_init_hook(int q_idx)
add_hook_new(HOOK_BUILD_ROOM1, quest_random_gen_hook, "rand_gen", NULL);
add_hook_new(HOOK_FEELING, quest_random_feeling_hook, "rand_feel", NULL);
add_hook_new(HOOK_CHAR_DUMP, quest_random_dump_hook, "rand_dump", NULL);
- return (FALSE);
}
diff --git a/src/q_rand.hpp b/src/q_rand.hpp
index fe87289b..a992aa98 100644
--- a/src/q_rand.hpp
+++ b/src/q_rand.hpp
@@ -2,7 +2,9 @@
#include "h-basic.h"
+#include <string>
+
void initialize_random_quests(int n);
bool_ is_randhero(int level);
-bool_ quest_random_init_hook(int q_idx);
-bool_ quest_random_describe(FILE *fff);
+void quest_random_init_hook();
+std::string quest_random_describe();
diff --git a/src/q_shroom.cc b/src/q_shroom.cc
index 89b576d8..627f2b39 100644
--- a/src/q_shroom.cc
+++ b/src/q_shroom.cc
@@ -1,6 +1,7 @@
#include "q_shroom.hpp"
#include "cave.hpp"
+#include "game.hpp"
#include "hook_chat_in.hpp"
#include "hook_give_in.hpp"
#include "hook_monster_death_in.hpp"
@@ -22,15 +23,15 @@
#define cquest (quest[QUEST_SHROOM])
-static bool_ quest_shroom_speak_hook(void *, void *, void *);
-static bool_ quest_shroom_chat_hook(void *, void *, void *);
+static bool quest_shroom_speak_hook(void *, void *, void *);
+static bool quest_shroom_chat_hook(void *, void *, void *);
GENERATE_MONSTER_LOOKUP_FN(get_grip, "Grip, Farmer Maggot's dog")
GENERATE_MONSTER_LOOKUP_FN(get_wolf, "Wolf, Farmer Maggot's dog")
GENERATE_MONSTER_LOOKUP_FN(get_fang, "Fang, Farmer Maggot's dog")
GENERATE_MONSTER_LOOKUP_FN(get_farmer_maggot, "Farmer Maggot")
-static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *)
+static bool quest_shroom_town_gen_hook(void *, void *in_, void *)
{
struct hook_wild_gen_in *in = static_cast<struct hook_wild_gen_in *>(in_);
int m_idx, x = 1, y = 1, tries = 10000;
@@ -41,8 +42,12 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *)
{
/* Create the field */
for (x = (cur_wid / 2) - 7; x <= (cur_wid / 2) + 7; x++)
+ {
for (y = (cur_hgt / 2) - 5; y <= (cur_hgt / 2) + 5; y++)
+ {
cave_set_feat(y, x, 181);
+ }
+ }
/* Throw in some 'shrooms */
for (x = 0; x < (cquest.data[1] - cquest.data[0]); x++)
@@ -82,7 +87,10 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *)
}
/* Generate maggot in town, in daylight */
- if ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) return (FALSE);
+ if ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1))
+ {
+ return false;
+ }
/* Find a good position */
while (tries)
@@ -94,7 +102,10 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *)
/* Is it a good spot ? */
/* Not in player los, and avoid shop grids */
if (!los(p_ptr->py, p_ptr->px, y, x) && cave_empty_bold(y, x) &&
- cave_plain_floor_bold(y, x)) break;
+ cave_plain_floor_bold(y, x))
+ {
+ break;
+ }
/* One less try */
tries--;
@@ -105,16 +116,19 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *)
place_monster_one(y, x, get_farmer_maggot(), 0, FALSE, MSTATUS_ENEMY);
m_allow_special[get_farmer_maggot()] = FALSE;
- return FALSE;
+ return false;
}
-static bool_ quest_shroom_death_hook(void *, void *in_, void *)
+static bool quest_shroom_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
s32b r_idx = m_list[m_idx].r_idx;
- if (cquest.status > QUEST_STATUS_COMPLETED) return FALSE;
+ if (cquest.status > QUEST_STATUS_COMPLETED)
+ {
+ return false;
+ }
if ((r_idx == get_wolf()) ||
(r_idx == get_grip()) ||
@@ -123,11 +137,13 @@ static bool_ quest_shroom_death_hook(void *, void *in_, void *)
msg_print("The dog yells a last time and drops dead on the grass.");
}
- return FALSE;
+ return false;
}
-static bool_ quest_shroom_give_hook(void *, void *in_, void *)
+static bool quest_shroom_give_hook(void *, void *in_, void *)
{
+ auto const &r_info = game->edit_data.r_info;
+
struct hook_give_in *in = static_cast<struct hook_give_in *>(in_);
object_type *o_ptr;
monster_type *m_ptr;
@@ -138,7 +154,10 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *)
o_ptr = &p_ptr->inventory[item];
m_ptr = &m_list[m_idx];
- if (m_ptr->r_idx != get_farmer_maggot()) return (FALSE);
+ if (m_ptr->r_idx != get_farmer_maggot())
+ {
+ return false;
+ }
/* If one is dead .. its bad */
if ((r_info[get_grip()].max_num == 0) ||
@@ -154,10 +173,13 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *)
del_hook_new(HOOK_CHAT, quest_shroom_speak_hook);
del_hook_new(HOOK_WILD_GEN, quest_shroom_town_gen_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
- if ((o_ptr->tval != TV_FOOD) || (o_ptr->pval2 != 1)) return (FALSE);
+ if ((o_ptr->tval != TV_FOOD) || (o_ptr->pval2 != 1))
+ {
+ return false;
+ }
/* Take a mushroom */
inc_stack_size_ex(item, -1, OPTIMIZE, NO_DESCRIBE);
@@ -181,9 +203,13 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *)
q_ptr->discount = 100;
q_ptr->ident |= IDENT_STOREB;
if (inven_carry_okay(q_ptr))
+ {
inven_carry(q_ptr, FALSE);
+ }
else
+ {
drop_near(q_ptr, 0, p_ptr->py, p_ptr->px);
+ }
/* The sling of farmer maggot */
q_ptr = &forge;
@@ -196,7 +222,7 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *)
object_known(q_ptr);
q_ptr->discount = 100;
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
delete_monster_idx(m_idx);
@@ -206,13 +232,17 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *)
process_hooks_restart = TRUE;
}
else
+ {
msg_format("Oh thank you, but you still have %d mushrooms to bring back!", cquest.data[1] - cquest.data[0]);
+ }
- return TRUE;
+ return true;
}
static void check_dogs_alive(s32b m_idx)
{
+ auto const &r_info = game->edit_data.r_info;
+
if ((r_info[get_grip()].max_num == 0) ||
(r_info[get_wolf()].max_num == 0) ||
(r_info[get_fang()].max_num == 0))
@@ -234,12 +264,15 @@ static void check_dogs_alive(s32b m_idx)
}
}
-static bool_ quest_shroom_speak_hook(void *, void *in_, void *)
+static bool quest_shroom_speak_hook(void *, void *in_, void *)
{
struct hook_mon_speak_in *in = static_cast<struct hook_mon_speak_in *>(in_);
s32b m_idx = in->m_idx;
- if (m_list[m_idx].r_idx != get_farmer_maggot()) return (FALSE);
+ if (m_list[m_idx].r_idx != get_farmer_maggot())
+ {
+ return false;
+ }
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
@@ -250,16 +283,20 @@ static bool_ quest_shroom_speak_hook(void *, void *in_, void *)
{
check_dogs_alive(m_idx);
}
- return (TRUE);
+
+ return true;
}
-static bool_ quest_shroom_chat_hook(void *, void *in_, void *)
+static bool quest_shroom_chat_hook(void *, void *in_, void *)
{
struct hook_chat_in *in = static_cast<struct hook_chat_in *>(in_);
s32b m_idx = in->m_idx;
monster_type *m_ptr = &m_list[m_idx];
- if (m_ptr->r_idx != get_farmer_maggot()) return (FALSE);
+ if (m_ptr->r_idx != get_farmer_maggot())
+ {
+ return false;
+ }
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
@@ -270,18 +307,20 @@ static bool_ quest_shroom_chat_hook(void *, void *in_, void *)
msg_print("to the west of Bree? Please try to not harm my dogs. They are so lovely...");
cquest.status = QUEST_STATUS_TAKEN;
- quest[QUEST_SHROOM].init(QUEST_SHROOM);
+ quest[QUEST_SHROOM].init();
}
else
{
check_dogs_alive(m_idx);
}
- return TRUE;
+ return true;
}
-bool_ quest_shroom_init_hook(int q_idx)
+void quest_shroom_init_hook()
{
+ auto &messages = game->messages;
+
/* Get a number of 'shrooms */
if (!cquest.data[1])
{
@@ -289,7 +328,7 @@ bool_ quest_shroom_init_hook(int q_idx)
cquest.data[1] = rand_range(7, 14);
if (wizard)
{
- message_add(format("Shrooms number %d", cquest.data[1]), TERM_BLUE);
+ messages.add(format("Shrooms number %d", cquest.data[1]), TERM_BLUE);
}
}
@@ -307,5 +346,4 @@ bool_ quest_shroom_init_hook(int q_idx)
add_hook_new(HOOK_WILD_GEN, quest_shroom_town_gen_hook, "shroom_town_gen", NULL);
add_hook_new(HOOK_CHAT, quest_shroom_chat_hook, "shroom_chat", NULL);
}
- return (FALSE);
}
diff --git a/src/q_shroom.hpp b/src/q_shroom.hpp
index 6124775b..4478aee2 100644
--- a/src/q_shroom.hpp
+++ b/src/q_shroom.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_shroom_init_hook(int q_idx);
+void quest_shroom_init_hook();
diff --git a/src/q_spider.cc b/src/q_spider.cc
index 07531b96..a5fa3486 100644
--- a/src/q_spider.cc
+++ b/src/q_spider.cc
@@ -16,13 +16,16 @@
#define cquest (quest[QUEST_SPIDER])
-static bool_ quest_spider_gen_hook(void *, void *, void *)
+static bool quest_spider_gen_hook(void *, void *, void *)
{
int x, y;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_SPIDER) return FALSE;
+ if (p_ptr->inside_quest != QUEST_SPIDER)
+ {
+ return false;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -43,14 +46,17 @@ static bool_ quest_spider_gen_hook(void *, void *, void *)
init_flags = INIT_CREATE_DUNGEON;
process_dungeon_file("spiders.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
- return TRUE;
+ return true;
}
-static bool_ quest_spider_death_hook(void *, void *, void *)
+static bool quest_spider_death_hook(void *, void *, void *)
{
int i, mcnt = 0;
- if (p_ptr->inside_quest != QUEST_SPIDER) return FALSE;
+ if (p_ptr->inside_quest != QUEST_SPIDER)
+ {
+ return false;
+ }
for (i = m_max - 1; i >= 1; i--)
{
@@ -58,9 +64,15 @@ static bool_ quest_spider_death_hook(void *, void *, void *)
monster_type *m_ptr = &m_list[i];
/* Ignore "dead" monsters */
- if (!m_ptr->r_idx) continue;
+ if (!m_ptr->r_idx)
+ {
+ continue;
+ }
- if (m_ptr->status <= MSTATUS_ENEMY) mcnt++;
+ if (m_ptr->status <= MSTATUS_ENEMY)
+ {
+ mcnt++;
+ }
}
if (mcnt <= 1)
@@ -79,19 +91,22 @@ static bool_ quest_spider_death_hook(void *, void *, void *)
del_hook_new(HOOK_MONSTER_DEATH, quest_spider_death_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
- return (FALSE);
+ return false;
}
-static bool_ quest_spider_finish_hook(void *, void *in_, void *)
+static bool quest_spider_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
object_type forge, *q_ptr;
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_SPIDER) return FALSE;
+ if (q_idx != QUEST_SPIDER)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "All of us praise your mighty deed in driving back the", 8, 0);
c_put_str(TERM_YELLOW, "menace. Take this as a reward.", 9, 0);
@@ -103,19 +118,19 @@ static bool_ quest_spider_finish_hook(void *, void *in_, void *)
object_aware(q_ptr);
object_known(q_ptr);
q_ptr->ident |= IDENT_STOREB;
- (void)inven_carry(q_ptr, FALSE);
+ inven_carry(q_ptr, FALSE);
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_POISON;
- quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot));
+ quest[*(quest[q_idx].plot)].init();
del_hook_new(HOOK_QUEST_FINISH, quest_spider_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-bool_ quest_spider_init_hook(int q_idx)
+void quest_spider_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -123,5 +138,4 @@ bool_ quest_spider_init_hook(int q_idx)
add_hook_new(HOOK_GEN_QUEST, quest_spider_gen_hook, "spider_gen", NULL);
add_hook_new(HOOK_QUEST_FINISH, quest_spider_finish_hook, "spider_finish", NULL);
}
- return (FALSE);
}
diff --git a/src/q_spider.hpp b/src/q_spider.hpp
index e17cb523..bd16c06a 100644
--- a/src/q_spider.hpp
+++ b/src/q_spider.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_spider_init_hook(int q_idx);
+void quest_spider_init_hook();
diff --git a/src/q_thief.cc b/src/q_thief.cc
index 0f6543cc..a4505d2a 100644
--- a/src/q_thief.cc
+++ b/src/q_thief.cc
@@ -2,6 +2,8 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "game.hpp"
#include "hook_quest_finish_in.hpp"
#include "hooks.hpp"
#include "init1.hpp"
@@ -20,18 +22,23 @@
#define cquest (quest[QUEST_THIEVES])
-static bool_ quest_thieves_gen_hook(void *, void *, void *)
+static bool quest_thieves_gen_hook(void *, void *, void *)
{
int x, y;
int xstart = 2;
int ystart = 2;
bool_ again = TRUE;
- if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE;
+ if (p_ptr->inside_quest != QUEST_THIEVES)
+ {
+ return false;
+ }
/* Just in case we didnt talk the the mayor */
if (cquest.status == QUEST_STATUS_UNTAKEN)
+ {
cquest.status = QUEST_STATUS_TAKEN;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -52,7 +59,7 @@ static bool_ quest_thieves_gen_hook(void *, void *, void *)
init_flags = INIT_CREATE_DUNGEON;
process_dungeon_file("thieves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
- dungeon_flags2 |= DF2_NO_GENO;
+ dungeon_flags |= DF_NO_GENO;
/* Rip the inventory from the player */
cmsg_print(TERM_YELLOW, "You feel a vicious blow on your head.");
@@ -63,9 +70,15 @@ static bool_ quest_thieves_gen_hook(void *, void *, void *)
{
object_type *o_ptr = &p_ptr->inventory[x];
- if (!o_ptr->k_idx) continue;
+ if (!o_ptr->k_idx)
+ {
+ continue;
+ }
- if ((x >= INVEN_WIELD) && cursed_p(o_ptr)) continue;
+ if ((x >= INVEN_WIELD) && cursed_p(o_ptr))
+ {
+ continue;
+ }
inven_drop(x, 99, 4, 24, TRUE);
@@ -81,11 +94,14 @@ static bool_ quest_thieves_gen_hook(void *, void *, void *)
return TRUE;
}
-static bool_ quest_thieves_hook(void *, void *, void *)
+static bool quest_thieves_hook(void *, void *, void *)
{
int i, mcnt = 0;
- if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE;
+ if (p_ptr->inside_quest != QUEST_THIEVES)
+ {
+ return false;
+ }
/* ALARM !!! */
if ((cave[17][22].feat == FEAT_OPEN) ||
@@ -130,17 +146,22 @@ static bool_ quest_thieves_hook(void *, void *, void *)
process_hooks_restart = TRUE;
cmsg_print(TERM_YELLOW, "You stopped the thieves and saved Bree!");
- return (FALSE);
+ return false;
}
- return FALSE;
+ return false;
}
-static bool_ quest_thieves_finish_hook(void *, void *in_, void *)
+static bool quest_thieves_finish_hook(void *, void *in_, void *)
{
+ auto const &s_info = game->s_info;
+
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_THIEVES) return FALSE;
+ if (q_idx != QUEST_THIEVES)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "Thank you for killing the band of thieves!", 8, 0);
c_put_str(TERM_YELLOW, "You can use the hideout as your house as a reward.", 9, 0);
@@ -155,21 +176,28 @@ static bool_ quest_thieves_finish_hook(void *, void *in_, void *)
else
{
if (s_info[SKILL_COMBAT].value > s_info[SKILL_MAGIC].value)
+ {
*(quest[q_idx].plot) = QUEST_TROLL;
+ }
else
+ {
*(quest[q_idx].plot) = QUEST_WIGHT;
+ }
}
- quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot));
+ quest[*(quest[q_idx].plot)].init();
del_hook_new(HOOK_QUEST_FINISH, quest_thieves_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_thieves_feeling_hook(void *, void *, void *)
+static bool quest_thieves_feeling_hook(void *, void *, void *)
{
- if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE;
+ if (p_ptr->inside_quest != QUEST_THIEVES)
+ {
+ return false;
+ }
msg_print("You wake up in a prison cell.");
msg_print("All your possessions have been stolen!");
@@ -177,10 +205,10 @@ static bool_ quest_thieves_feeling_hook(void *, void *, void *)
del_hook_new(HOOK_FEELING, quest_thieves_feeling_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-bool_ quest_thieves_init_hook(int q_idx)
+void quest_thieves_init_hook()
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -189,5 +217,4 @@ bool_ quest_thieves_init_hook(int q_idx)
add_hook_new(HOOK_GEN_QUEST, quest_thieves_gen_hook, "thieves_geb", NULL);
add_hook_new(HOOK_FEELING, quest_thieves_feeling_hook, "thieves_feel", NULL);
}
- return (FALSE);
}
diff --git a/src/q_thief.hpp b/src/q_thief.hpp
index 48e5dc8d..0e191db7 100644
--- a/src/q_thief.hpp
+++ b/src/q_thief.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_thieves_init_hook(int q_idx);
+void quest_thieves_init_hook();
diff --git a/src/q_thrain.cc b/src/q_thrain.cc
index 05def27a..7b895695 100644
--- a/src/q_thrain.cc
+++ b/src/q_thrain.cc
@@ -3,6 +3,7 @@
#include "cave.hpp"
#include "cave_type.hpp"
#include "dungeon_info_type.hpp"
+#include "game.hpp"
#include "generate.hpp"
#include "hook_build_room1_in.hpp"
#include "hook_move_in.hpp"
@@ -11,7 +12,6 @@
#include "init1.hpp"
#include "lua_bind.hpp"
#include "object_type.hpp"
-#include "quark.hpp"
#include "randart.hpp"
#include "messages.hpp"
#include "monster2.hpp"
@@ -30,33 +30,52 @@ GENERATE_MONSTER_LOOKUP_FN(get_thrain, "Thrain, the King Under the Mountain")
GENERATE_MONSTER_LOOKUP_FN(get_dwar, "Dwar, Dog Lord of Waw")
GENERATE_MONSTER_LOOKUP_FN(get_hoarmurath, "Hoarmurath of Dir")
-static bool_ quest_thrain_death_hook(void *, void *in_, void *)
+static bool quest_thrain_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
int r, x, y;
monster_type *m_ptr;
- if ((cquest.status >= QUEST_STATUS_FINISHED) || (dun_level !=cquest.data[0]) || (dungeon_type != DUNGEON_DOL_GULDUR)) return (FALSE);
+ if ((cquest.status >= QUEST_STATUS_FINISHED) || (dun_level !=cquest.data[0]) || (dungeon_type != DUNGEON_DOL_GULDUR))
+ {
+ return false;
+ }
+
m_ptr = &m_list[m_idx];
- if ((m_ptr->r_idx != get_dwar()) && (m_ptr->r_idx != get_hoarmurath())) return (FALSE);
+ if ((m_ptr->r_idx != get_dwar()) && (m_ptr->r_idx != get_hoarmurath()))
+ {
+ return false;
+ }
cquest.data[2]++;
- if (cquest.data[2] < 2) return (FALSE);
+ if (cquest.data[2] < 2)
+ {
+ return false;
+ }
cmsg_print(TERM_YELLOW, "The magic hiding the room dissipates.");
for (x = 0; x < cur_wid; x++)
+ {
for (y = 0; y < cur_hgt; y++)
{
cave_type *c_ptr = &cave[y][x];
- if (c_ptr->mimic != 61) continue;
- if (!(c_ptr->info & CAVE_FREE)) continue;
+ if (c_ptr->mimic != 61)
+ {
+ continue;
+ }
+
+ if (!(c_ptr->info & CAVE_FREE))
+ {
+ continue;
+ }
c_ptr->mimic = 0;
lite_spot(y, x);
}
+ }
cquest.status = QUEST_STATUS_FINISHED;
cmsg_print(TERM_YELLOW, "Thrain speaks:");
@@ -72,7 +91,10 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *)
monster_type *m_ptr = &m_list[r];
/* Ignore "dead" monsters */
- if (!m_ptr->r_idx) continue;
+ if (!m_ptr->r_idx)
+ {
+ continue;
+ }
/* Is it the princess? */
if (m_ptr->r_idx == get_thrain())
@@ -80,18 +102,20 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *)
int x = m_ptr->fx;
int y = m_ptr->fy;
int i, j;
- object_type forge, *q_ptr;
delete_monster_idx(r);
/* Wipe the glass walls and create a stair */
for (i = x - 1; i <= x + 1; i++)
+ {
for (j = y - 1; j <= y + 1; j++)
{
if (in_bounds(j, i)) cave_set_feat(j, i, FEAT_FLOOR);
}
+ }
/* Get local object */
+ object_type forge, *q_ptr;
q_ptr = &forge;
/* Wipe the object */
@@ -100,7 +124,7 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *)
q_ptr->number = 1;
q_ptr->found = OBJ_FOUND_REWARD;
create_artifact(q_ptr, FALSE, TRUE);
- q_ptr->art_name = quark_add("of Thrain");
+ q_ptr->artifact_name = "of Thrain";
/* Drop it in the dungeon */
drop_near(q_ptr, -1, y, x);
@@ -112,10 +136,10 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *)
del_hook_new(HOOK_MONSTER_DEATH, quest_thrain_death_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
-static bool_ quest_thrain_gen_hook(void *, void *in_, void *)
+static bool quest_thrain_gen_hook(void *, void *in_, void *)
{
struct hook_build_room1_in *in = static_cast<struct hook_build_room1_in *>(in_);
s32b bx0 = in->x;
@@ -126,16 +150,16 @@ static bool_ quest_thrain_gen_hook(void *, void *in_, void *)
int y2, x2, yval, xval;
int y1, x1, xsize, ysize;
- if (dungeon_type != DUNGEON_DOL_GULDUR) return (FALSE);
- if (cquest.data[0] != dun_level) return (FALSE);
- if (cquest.data[1]) return (FALSE);
- if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return (FALSE);
+ if (dungeon_type != DUNGEON_DOL_GULDUR) return false;
+ if (cquest.data[0] != dun_level) return false;
+ if (cquest.data[1]) return false;
+ if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return false;
/* Pick a room size */
get_map_size("thrain.map", &ysize, &xsize);
/* Try to allocate space for room. If fails, exit */
- if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return FALSE;
+ if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return false;
/* Get corner values */
y1 = yval - ysize / 2;
@@ -183,37 +207,38 @@ static bool_ quest_thrain_gen_hook(void *, void *in_, void *)
/* Don't try another one for this generation */
cquest.data[1] = 1;
- return (TRUE);
+ return true;
}
-static bool_ quest_thrain_feeling_hook(void *, void *, void *)
+static bool quest_thrain_feeling_hook(void *, void *, void *)
{
- if (dungeon_type != DUNGEON_DOL_GULDUR) return (FALSE);
- if (cquest.data[0] != dun_level) return (FALSE);
- if (cquest.status != QUEST_STATUS_UNTAKEN) return (FALSE);
+ if (dungeon_type != DUNGEON_DOL_GULDUR) return false;
+ if (cquest.data[0] != dun_level) return false;
+ if (cquest.status != QUEST_STATUS_UNTAKEN) return false;
cmsg_format(TERM_YELLOW, "You hear someone shouting under the torture.");
cquest.status = QUEST_STATUS_TAKEN;
- cquest.init(QUEST_THRAIN);
+ cquest.init();
- return (FALSE);
+ return false;
}
-static bool_ quest_thrain_move_hook(void *, void *in_, void *)
+static bool quest_thrain_move_hook(void *, void *in_, void *)
{
struct hook_move_in *in = static_cast<struct hook_move_in *>(in_);
s32b y = in->y;
s32b x = in->x;
cave_type *c_ptr = &cave[y][x];
- if (dungeon_type != DUNGEON_DOL_GULDUR) return (FALSE);
- if (cquest.data[0] != dun_level) return (FALSE);
- if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return (FALSE);
- if (!(c_ptr->info & CAVE_FREE)) return (FALSE);
- if (c_ptr->mimic != 61) return (FALSE);
+ if (dungeon_type != DUNGEON_DOL_GULDUR) return false;
+ if (cquest.data[0] != dun_level) return false;
+ if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return false;
+ if (!(c_ptr->info & CAVE_FREE)) return false;
+ if (c_ptr->mimic != 61) return false;
cmsg_print(TERM_YELLOW, "The magic hiding the room dissipates.");
for (x = 0; x < cur_wid; x++)
+ {
for (y = 0; y < cur_hgt; y++)
{
c_ptr = &cave[y][x];
@@ -224,25 +249,29 @@ static bool_ quest_thrain_move_hook(void *, void *in_, void *)
c_ptr->mimic = 0;
lite_spot(y, x);
}
+ }
- return (FALSE);
+ return false;
}
-static bool_ quest_thrain_turn_hook(void *, void *, void *)
+static bool quest_thrain_turn_hook(void *, void *, void *)
{
cquest.data[1] = 0;
cquest.data[2] = 0;
- return (FALSE);
+ return false;
}
-bool_ quest_thrain_init_hook(int q)
+void quest_thrain_init_hook()
{
+ auto const &d_info = game->edit_data.d_info;
+ auto &messages = game->messages;
+
if (!cquest.data[0])
{
cquest.data[0] = rand_range(d_info[DUNGEON_DOL_GULDUR].mindepth + 1, d_info[DUNGEON_DOL_GULDUR].maxdepth - 1);
if (wizard)
{
- message_add(format("Thrain lvl %d", cquest.data[0]), TERM_BLUE);
+ messages.add(format("Thrain lvl %d", cquest.data[0]), TERM_BLUE);
}
}
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
@@ -257,5 +286,4 @@ bool_ quest_thrain_init_hook(int q)
add_hook_new(HOOK_FEELING, quest_thrain_feeling_hook, "thrain_feel", NULL);
add_hook_new(HOOK_MONSTER_DEATH, quest_thrain_death_hook, "thrain_death", NULL);
}
- return (FALSE);
}
diff --git a/src/q_thrain.hpp b/src/q_thrain.hpp
index 830da016..aa42385d 100644
--- a/src/q_thrain.hpp
+++ b/src/q_thrain.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-extern bool_ quest_thrain_init_hook(int q_idx);
+void quest_thrain_init_hook();
diff --git a/src/q_troll.cc b/src/q_troll.cc
index fce3ad49..54eb3406 100644
--- a/src/q_troll.cc
+++ b/src/q_troll.cc
@@ -3,6 +3,7 @@
#include "artifact_type.hpp"
#include "cave.hpp"
#include "cave_type.hpp"
+#include "game.hpp"
#include "hook_monster_death_in.hpp"
#include "hook_quest_finish_in.hpp"
#include "hooks.hpp"
@@ -25,13 +26,18 @@ GENERATE_MONSTER_LOOKUP_FN(get_tom, "Tom the Stone Troll")
GENERATE_MONSTER_LOOKUP_FN(get_stone_troll, "Stone troll")
GENERATE_MONSTER_LOOKUP_FN(get_forest_troll, "Forest troll")
-static bool_ quest_troll_gen_hook(void *, void *, void *)
+static bool quest_troll_gen_hook(void *, void *, void *)
{
+ auto &a_info = game->edit_data.a_info;
+
int x, y;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_TROLL) return FALSE;
+ if (p_ptr->inside_quest != QUEST_TROLL)
+ {
+ return false;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -110,37 +116,43 @@ static bool_ quest_troll_gen_hook(void *, void *, void *)
/* Reinitialize the ambush ... hehehe */
cquest.data[0] = FALSE;
- return TRUE;
+ return true;
}
-static bool_ quest_troll_finish_hook(void *, void *in_, void *)
+static bool quest_troll_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_TROLL) return FALSE;
+ if (q_idx != QUEST_TROLL)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "I heard about your noble deeds.", 8, 0);
c_put_str(TERM_YELLOW, "Keep what you found... may it serve you well.", 9, 0);
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_NAZGUL;
- quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot));
+ quest[*(quest[q_idx].plot)].init();
del_hook_new(HOOK_QUEST_FINISH, quest_troll_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_troll_death_hook(void *, void *in_, void *)
+static bool quest_troll_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
s32b r_idx = m_list[m_idx].r_idx;
int x, y, xstart = 2, ystart = 2;
- if (p_ptr->inside_quest != QUEST_TROLL) return FALSE;
+ if (p_ptr->inside_quest != QUEST_TROLL)
+ {
+ return false;
+ }
if (r_idx == get_tom())
{
@@ -151,19 +163,23 @@ static bool_ quest_troll_death_hook(void *, void *in_, void *)
cquest.status = QUEST_STATUS_COMPLETED;
del_hook_new(HOOK_MONSTER_DEATH, quest_troll_death_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
init_flags = INIT_GET_SIZE;
process_dungeon_file("trolls.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
- if (cquest.data[0]) return FALSE;
+ if (cquest.data[0])
+ {
+ return false;
+ }
cquest.data[0] = TRUE;
msg_print("Oops, seems like an ambush...");
for (x = 3; x < xstart; x++)
+ {
for (y = 3; y < ystart; y++)
{
cave_type *c_ptr = &cave[y][x];
@@ -178,11 +194,12 @@ static bool_ quest_troll_death_hook(void *, void *in_, void *)
place_monster_one(y, x, r_idx, 0, FALSE, MSTATUS_ENEMY);
}
}
+ }
- return FALSE;
+ return false;
}
-bool_ quest_troll_init_hook(int q_idx)
+void quest_troll_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -190,5 +207,4 @@ bool_ quest_troll_init_hook(int q_idx)
add_hook_new(HOOK_GEN_QUEST, quest_troll_gen_hook, "troll_gen", NULL);
add_hook_new(HOOK_QUEST_FINISH, quest_troll_finish_hook, "troll_finish", NULL);
}
- return (FALSE);
}
diff --git a/src/q_troll.hpp b/src/q_troll.hpp
index 140fe0b2..08bba3dd 100644
--- a/src/q_troll.hpp
+++ b/src/q_troll.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_troll_init_hook(int q_idx);
+void quest_troll_init_hook();
diff --git a/src/q_ultrae.cc b/src/q_ultrae.cc
index d42b9c6f..ff2a6a48 100644
--- a/src/q_ultrae.cc
+++ b/src/q_ultrae.cc
@@ -2,7 +2,7 @@
#define cquest (quest[QUEST_ULTRA_EVIL])
-bool_ quest_ultra_evil_init_hook(int q)
+void quest_ultra_evil_init_hook()
{
- return (FALSE);
+ // Initialized by other hook.
}
diff --git a/src/q_ultrae.hpp b/src/q_ultrae.hpp
index 5b08127b..77ec2e38 100644
--- a/src/q_ultrae.hpp
+++ b/src/q_ultrae.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_ultra_evil_init_hook(int q_idx);
+void quest_ultra_evil_init_hook();
diff --git a/src/q_ultrag.cc b/src/q_ultrag.cc
index c7c0312b..e3da974f 100644
--- a/src/q_ultrag.cc
+++ b/src/q_ultrag.cc
@@ -10,6 +10,7 @@
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_type.hpp"
#include "options.hpp"
#include "player_type.hpp"
@@ -19,7 +20,7 @@
#define cquest (quest[QUEST_ULTRA_GOOD])
-static bool_ quest_ultra_good_move_hook(void *, void *in_, void *)
+static bool quest_ultra_good_move_hook(void *, void *in_, void *)
{
struct hook_move_in *in = static_cast<struct hook_move_in *>(in_);
s32b y = in->y;
@@ -28,14 +29,20 @@ static bool_ quest_ultra_good_move_hook(void *, void *in_, void *)
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
- bool_ old_quick_messages = quick_messages;
-
- if (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED) return (FALSE);
+ if (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED)
+ {
+ return false;
+ }
/* The mirror of Galadriel */
- if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23)) return (FALSE);
+ if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23))
+ {
+ return false;
+ }
+
+ auto old_quick_messages = options->quick_messages;
+ options->quick_messages = FALSE;
- quick_messages = FALSE;
cmsg_print(TERM_L_BLUE, "You meet Galadriel.");
cmsg_print(TERM_YELLOW, "'I still cannot believe this is all over.'");
cmsg_print(TERM_YELLOW, "'Morgoth's reign of terror is over at last!'");
@@ -79,37 +86,42 @@ static bool_ quest_ultra_good_move_hook(void *, void *in_, void *)
/* Continue the plot */
cquest.status = QUEST_STATUS_TAKEN;
- cquest.init(QUEST_ULTRA_GOOD);
+ cquest.init();
}
- quick_messages = old_quick_messages;
- return TRUE;
+ options->quick_messages = old_quick_messages;
+
+ return true;
}
- return FALSE;
+ return false;
}
-static bool_ quest_ultra_good_stair_hook(void *, void *in_, void *)
+static bool quest_ultra_good_stair_hook(void *, void *in_, void *)
{
struct hook_stair_in *in = static_cast<struct hook_stair_in *>(in_);
stairs_direction dir = in->direction;
if (dungeon_type != DUNGEON_VOID)
- return FALSE;
+ {
+ return false;
+ }
/* Cant leave */
if ((dir == STAIRS_UP) && (dun_level == 128))
{
cmsg_print(TERM_YELLOW, "The portal to Arda is now closed.");
- return TRUE;
+ return true;
}
+
/* there is no coming back */
if ((dir == STAIRS_UP) && (dun_level == 150))
{
cmsg_print(TERM_YELLOW, "The barrier seems to be impenetrable from this side.");
cmsg_print(TERM_YELLOW, "You will have to move on.");
- return TRUE;
+ return true;
}
+
/* Cant enter without the flame imperishable */
if ((dir == STAIRS_DOWN) && (dun_level == 149))
{
@@ -119,15 +131,16 @@ static bool_ quest_ultra_good_stair_hook(void *, void *in_, void *)
/* Now look for an ULTIMATE artifact, that is, one imbued with the flame */
for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
{
- u32b f1, f2, f3, f4, f5, esp;
object_type *o_ptr = get_object(i);
- if (!o_ptr->k_idx) continue;
+ if (!o_ptr->k_idx)
+ {
+ continue;
+ }
- /* Examine the gloves */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
- if (f4 & TR4_ULTIMATE)
+ if (flags & TR_ULTIMATE)
{
ultimate = TRUE;
break;
@@ -148,19 +161,21 @@ static bool_ quest_ultra_good_stair_hook(void *, void *in_, void *)
}
}
- return FALSE;
+ return false;
}
-static bool_ quest_ultra_good_recall_hook(void *, void *, void *)
+static bool quest_ultra_good_recall_hook(void *, void *, void *)
{
if ((dungeon_type != DUNGEON_VOID) && (dungeon_type != DUNGEON_NETHER_REALM))
- return FALSE;
+ {
+ return false;
+ }
cmsg_print(TERM_YELLOW, "You cannot recall. The portal to Arda is closed.");
- return TRUE;
+ return true;
}
-static bool_ quest_ultra_good_death_hook(void *, void *in_, void *)
+static bool quest_ultra_good_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
@@ -226,7 +241,10 @@ static bool_ quest_ultra_good_death_hook(void *, void *in_, void *)
for (i = 0; i < INVEN_PACK; i++)
{
/* Skip non-objects */
- if (!p_ptr->inventory[i].k_idx) break;
+ if (!p_ptr->inventory[i].k_idx)
+ {
+ break;
+ }
}
/* Arg, no space ! */
if (i == INVEN_PACK)
@@ -245,10 +263,11 @@ static bool_ quest_ultra_good_death_hook(void *, void *in_, void *)
cmsg_format(TERM_VIOLET, "You feel the urge to pick up the Flame Imperishable.");
inven_carry(q_ptr, FALSE);
}
- return (FALSE);
+
+ return false;
}
-static bool_ quest_ultra_good_dump_hook(void *, void *in_, void *)
+static bool quest_ultra_good_dump_hook(void *, void *in_, void *)
{
struct hook_chardump_in *in = static_cast<struct hook_chardump_in *>(in_);
FILE *f = in->file;
@@ -271,11 +290,12 @@ static bool_ quest_ultra_good_dump_hook(void *, void *in_, void *)
}
}
}
- return (FALSE);
+
+ return false;
}
-bool_ quest_ultra_good_init_hook(int q)
+void quest_ultra_good_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -288,5 +308,4 @@ bool_ quest_ultra_good_init_hook(int q)
add_hook_new(HOOK_MOVE, quest_ultra_good_move_hook, "ultrag_move", NULL);
}
add_hook_new(HOOK_CHAR_DUMP, quest_ultra_good_dump_hook, "ultrag_dump", NULL);
- return (FALSE);
}
diff --git a/src/q_ultrag.hpp b/src/q_ultrag.hpp
index 0064b878..cef81fa5 100644
--- a/src/q_ultrag.hpp
+++ b/src/q_ultrag.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_ultra_good_init_hook(int q_idx);
+void quest_ultra_good_init_hook();
diff --git a/src/q_wight.cc b/src/q_wight.cc
index f2cc630c..ced87277 100644
--- a/src/q_wight.cc
+++ b/src/q_wight.cc
@@ -9,8 +9,8 @@
#include "monster2.hpp"
#include "monster_type.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "tables.hpp"
#include "util.hpp"
#include "variable.hpp"
@@ -22,13 +22,16 @@
GENERATE_MONSTER_LOOKUP_FN(get_wight_king, "The Wight-King of the Barrow-downs")
-static bool_ quest_wight_gen_hook(void *, void *, void *)
+static bool quest_wight_gen_hook(void *, void *, void *)
{
int x, y;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_WIGHT) return FALSE;
+ if (p_ptr->inside_quest != QUEST_WIGHT)
+ {
+ return false;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -50,6 +53,7 @@ static bool_ quest_wight_gen_hook(void *, void *, void *)
process_dungeon_file("wights.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = 3; x < xstart; x++)
+ {
for (y = 3; y < ystart; y++)
{
if (cave[y][x].feat == FEAT_MARKER)
@@ -74,25 +78,31 @@ static bool_ quest_wight_gen_hook(void *, void *, void *)
/* Name the rags */
- q_ptr->art_name = quark_add("of the Wight");
+ q_ptr->artifact_name = "of the Wight";
+
+ q_ptr->art_flags |=
+ TR_INT |
+ TR_RES_BLIND |
+ TR_SENS_FIRE |
+ TR_RES_CONF |
+ TR_IGNORE_ACID |
+ TR_IGNORE_ELEC |
+ TR_IGNORE_FIRE |
+ TR_IGNORE_COLD |
+ TR_SEE_INVIS |
+ TR_CURSED |
+ TR_HEAVY_CURSE;
- q_ptr->art_flags1 |= ( TR1_INT | TR1_SEARCH );
- q_ptr->art_flags2 |= ( TR2_RES_BLIND | TR2_SENS_FIRE | TR2_RES_CONF );
- q_ptr->art_flags3 |= ( TR3_IGNORE_ACID | TR3_IGNORE_ELEC |
- TR3_IGNORE_FIRE | TR3_IGNORE_COLD | TR3_SEE_INVIS);
-
- /* For game balance... */
- q_ptr->art_flags3 |= (TR3_CURSED | TR3_HEAVY_CURSE);
q_ptr->ident |= IDENT_CURSED;
if (randint(2) == 1)
{
- q_ptr->art_flags1 |= (TR1_SPELL);
+ q_ptr->art_flags |= TR_SPELL;
q_ptr->pval = 6;
}
else
{
- q_ptr->art_flags1 |= (TR1_MANA);
+ q_ptr->art_flags |= TR_MANA;
q_ptr->pval = 2;
}
@@ -117,17 +127,21 @@ static bool_ quest_wight_gen_hook(void *, void *, void *)
}
}
}
+ }
- return TRUE;
+ return true;
}
-static bool_ quest_wight_death_hook(void *, void *in_, void *)
+static bool quest_wight_death_hook(void *, void *in_, void *)
{
struct hook_monster_death_in *in = static_cast<struct hook_monster_death_in *>(in_);
s32b m_idx = in->m_idx;
s32b r_idx = m_list[m_idx].r_idx;
- if (p_ptr->inside_quest != QUEST_WIGHT) return FALSE;
+ if (p_ptr->inside_quest != QUEST_WIGHT)
+ {
+ return false;
+ }
if (r_idx == get_wight_king())
{
@@ -141,33 +155,36 @@ static bool_ quest_wight_death_hook(void *, void *in_, void *)
del_hook_new(HOOK_MONSTER_DEATH, quest_wight_death_hook);
process_hooks_restart = TRUE;
- return (FALSE);
+ return false;
}
- return (FALSE);
+ return false;
}
-static bool_ quest_wight_finish_hook(void *, void *in_, void *)
+static bool quest_wight_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_WIGHT) return FALSE;
+ if (q_idx != QUEST_WIGHT)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "I heard about your noble deeds.", 8, 0);
c_put_str(TERM_YELLOW, "Keep what you found .. may it serve you well.", 9, 0);
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_NAZGUL;
- quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot));
+ quest[*(quest[q_idx].plot)].init();
del_hook_new(HOOK_QUEST_FINISH, quest_wight_finish_hook);
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-bool_ quest_wight_init_hook(int q_idx)
+void quest_wight_init_hook()
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -175,5 +192,4 @@ bool_ quest_wight_init_hook(int q_idx)
add_hook_new(HOOK_GEN_QUEST, quest_wight_gen_hook, "wight_gen", NULL);
add_hook_new(HOOK_QUEST_FINISH, quest_wight_finish_hook, "wight_finish", NULL);
}
- return (FALSE);
}
diff --git a/src/q_wight.hpp b/src/q_wight.hpp
index 1252e4fa..16713332 100644
--- a/src/q_wight.hpp
+++ b/src/q_wight.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_wight_init_hook(int q_idx);
+void quest_wight_init_hook();
diff --git a/src/q_wolves.cc b/src/q_wolves.cc
index c5863b59..0e811ce6 100644
--- a/src/q_wolves.cc
+++ b/src/q_wolves.cc
@@ -2,7 +2,10 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "dungeon_flag.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_quest_finish_in.hpp"
#include "hooks.hpp"
#include "init1.hpp"
@@ -17,17 +20,24 @@
#define cquest (quest[QUEST_WOLVES])
-static bool_ quest_wolves_gen_hook(void *, void *, void *)
+static bool quest_wolves_gen_hook(void *, void *, void *)
{
+ auto const &f_info = game->edit_data.f_info;
+
int x, y, i;
int xstart = 2;
int ystart = 2;
- if (p_ptr->inside_quest != QUEST_WOLVES) return FALSE;
+ if (p_ptr->inside_quest != QUEST_WOLVES)
+ {
+ return false;
+ }
/* Just in case we didnt talk the the mayor */
if (cquest.status == QUEST_STATUS_UNTAKEN)
+ {
cquest.status = QUEST_STATUS_TAKEN;
+ }
/* Start with perm walls */
for (y = 0; y < cur_hgt; y++)
@@ -48,18 +58,17 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *)
init_flags = INIT_CREATE_DUNGEON;
process_dungeon_file("wolves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
- dungeon_flags2 |= DF2_NO_GENO;
+ dungeon_flags |= DF_NO_GENO;
/* Place some random wolves */
for (i = damroll(4, 4); i > 0; )
{
- int m_idx, flags;
y = rand_int(21) + 3;
x = rand_int(31) + 3;
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
+ auto const flags = f_info[cave[y][x].feat].flags;
+ if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR))
{
- m_idx = place_monster_one(y, x, 196, 0, magik(50), MSTATUS_ENEMY);
+ int m_idx = place_monster_one(y, x, 196, 0, magik(50), MSTATUS_ENEMY);
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
--i;
}
@@ -68,13 +77,12 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *)
/* Place some random wargs */
for (i = damroll(4, 4); i > 0; )
{
- int m_idx, flags;
y = rand_int(21) + 3;
x = rand_int(31) + 3;
- flags = f_info[cave[y][x].feat].flags1;
- if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR))
+ auto const flags = f_info[cave[y][x].feat].flags;
+ if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR))
{
- m_idx = place_monster_one(y, x, 257, 0, magik(50), MSTATUS_ENEMY);
+ int m_idx = place_monster_one(y, x, 257, 0, magik(50), MSTATUS_ENEMY);
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
--i;
}
@@ -82,14 +90,17 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *)
process_hooks_restart = TRUE;
- return TRUE;
+ return true;
}
-static bool_ quest_wolves_death_hook(void *, void *, void *)
+static bool quest_wolves_death_hook(void *, void *, void *)
{
int i, mcnt = 0;
- if (p_ptr->inside_quest != QUEST_WOLVES) return FALSE;
+ if (p_ptr->inside_quest != QUEST_WOLVES)
+ {
+ return false;
+ }
/* Process the monsters (backwards) */
for (i = m_max - 1; i >= 1; i--)
@@ -113,17 +124,20 @@ static bool_ quest_wolves_death_hook(void *, void *, void *)
process_hooks_restart = TRUE;
cmsg_print(TERM_YELLOW, "Lothlorien is safer now.");
- return (FALSE);
+ return false;
}
- return FALSE;
+ return false;
}
-static bool_ quest_wolves_finish_hook(void *, void *in_, void *)
+static bool quest_wolves_finish_hook(void *, void *in_, void *)
{
struct hook_quest_finish_in *in = static_cast<struct hook_quest_finish_in *>(in_);
s32b q_idx = in->q_idx;
- if (q_idx != QUEST_WOLVES) return FALSE;
+ if (q_idx != QUEST_WOLVES)
+ {
+ return false;
+ }
c_put_str(TERM_YELLOW, "Thank you for killing the pack of wolves!", 8, 0);
c_put_str(TERM_YELLOW, "You can use the hut as your house as a reward.", 9, 0);
@@ -131,10 +145,10 @@ static bool_ quest_wolves_finish_hook(void *, void *in_, void *)
/* Continue the plot */
*(quest[q_idx].plot) = QUEST_SPIDER;
- return TRUE;
+ return true;
}
-bool_ quest_wolves_init_hook(int q_idx)
+void quest_wolves_init_hook()
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
@@ -142,5 +156,4 @@ bool_ quest_wolves_init_hook(int q_idx)
add_hook_new(HOOK_QUEST_FINISH, quest_wolves_finish_hook, "wolves_finish", NULL);
add_hook_new(HOOK_GEN_QUEST, quest_wolves_gen_hook, "wolves_geb", NULL);
}
- return (FALSE);
}
diff --git a/src/q_wolves.hpp b/src/q_wolves.hpp
index 59a83c56..c5596fc6 100644
--- a/src/q_wolves.hpp
+++ b/src/q_wolves.hpp
@@ -2,4 +2,4 @@
#include "h-basic.h"
-bool_ quest_wolves_init_hook(int q_idx);
+void quest_wolves_init_hook();
diff --git a/src/quark.cc b/src/quark.cc
deleted file mode 100644
index 45072ded..00000000
--- a/src/quark.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "quark.hpp"
-
-#include "z-util.h"
-
-#include <cassert>
-
-/*
- * The number of quarks
- */
-static s16b quark__num = 0;
-
-
-/*
- * The pointers to the quarks [QUARK_MAX]
- */
-static cptr *quark__str = NULL;
-
-
-/*
- * Initialize the quark subsystem
- */
-void quark_init()
-{
- quark__num = 0;
- quark__str = new cptr[QUARK_MAX];
-
- for (int i = 0; i < QUARK_MAX; i++) {
- quark__str[i] = nullptr;
- }
-}
-
-
-/*
-* We use a global array for all inscriptions to reduce the memory
-* spent maintaining inscriptions. Of course, it is still possible
-* to run out of inscription memory, especially if too many different
-* inscriptions are used, but hopefully this will be rare.
-*
-* We use dynamic string allocation because otherwise it is necessary
-* to pre-guess the amount of quark activity. We limit the total
-* number of quarks, but this is much easier to "expand" as needed.
-*
-* Any two items with the same inscription will have the same "quark"
-* index, which should greatly reduce the need for inscription space.
-*
-* Note that "quark zero" is NULL and should not be "dereferenced".
-*/
-
-/*
-* Add a new "quark" to the set of quarks.
-*/
-s16b quark_add(cptr str)
-{
- assert(str != nullptr);
-
- int i;
-
- /* Look for an existing quark */
- for (i = 1; i < quark__num; i++)
- {
- /* Check for equality */
- if (streq(quark__str[i], str)) return (i);
- }
-
- /* Paranoia -- Require room */
- if (quark__num == QUARK_MAX) return (0);
-
- /* New maximal quark */
- quark__num = i + 1;
-
- /* Add a new quark */
- quark__str[i] = strdup(str);
-
- /* Return the index */
- return (i);
-}
-
-
-/*
-* This function looks up a quark
-*/
-cptr quark_str(s16b i)
-{
- cptr q;
-
- /* Verify */
- if ((i < 0) || (i >= quark__num)) i = 0;
-
- /* Access the quark */
- q = quark__str[i];
-
- /* Return the quark */
- return (q);
-}
-
-
diff --git a/src/quark.hpp b/src/quark.hpp
deleted file mode 100644
index 0fce3932..00000000
--- a/src/quark.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-
-/**
- * Maximum number of quarks.
- */
-constexpr int QUARK_MAX = 768;
-
-void quark_init();
-cptr quark_str(s16b num);
-s16b quark_add(cptr str);
diff --git a/src/quest.cc b/src/quest.cc
index a1aee67f..181b46d2 100644
--- a/src/quest.cc
+++ b/src/quest.cc
@@ -6,12 +6,11 @@
void init_hooks_quests()
{
- for (std::size_t i = 0; i < MAX_Q_IDX; i++)
+ for (auto const &q: quest)
{
- if (quest[i].init != NULL)
+ if (q.init)
{
- quest[i].init(i);
+ q.init();
}
}
}
-
diff --git a/src/quest.hpp b/src/quest.hpp
index 7ff3cd3c..1897bcfa 100644
--- a/src/quest.hpp
+++ b/src/quest.hpp
@@ -1,3 +1,3 @@
#pragma once
-extern void init_hooks_quests();
+void init_hooks_quests();
diff --git a/src/quest_type.hpp b/src/quest_type.hpp
index aa99f40a..ae97af35 100644
--- a/src/quest_type.hpp
+++ b/src/quest_type.hpp
@@ -2,6 +2,8 @@
#include "h-basic.h"
+#include <string>
+
/**
* Quest descriptor and runtime data.
*/
@@ -19,9 +21,9 @@ struct quest_type
s16b *plot; /* Which plot does it belongs to? */
- bool_ (*init)(int q); /* Function that takes care of generating hardcoded quests */
+ void (*init)(); /* Function that takes care of generating hardcoded quests */
- s32b data[9]; /* Various datas used by the quests */
+ s32b data[9]; /* Various datas used by the quests */
- bool_ (*gen_desc)(FILE *fff); /* Function for generating description. */
+ std::string (*gen_desc)(); /* Function for generating description. */
};
diff --git a/src/randart.cc b/src/randart.cc
index 5135438a..a902d734 100644
--- a/src/randart.cc
+++ b/src/randart.cc
@@ -7,77 +7,76 @@
*/
#include "randart.hpp"
+
+#include "game.hpp"
#include "mimic.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_type.hpp"
#include "options.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
-#include "randart_gen_type.hpp"
-#include "randart_part_type.hpp"
#include "spells2.hpp"
#include "util.hpp"
#include "variable.h"
#include "variable.hpp"
#include "z-rand.hpp"
-#include <memory>
-#include <vector>
-
/* Chance of using syllables to form the name instead of the "template" files */
-#define TABLE_NAME 45
#define A_CURSED 13
#define WEIRD_LUCK 12
-#define ACTIVATION_CHANCE 3
/*
* Attempt to add a power to a randart
*/
-static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *max_times)
+static bool_ grab_one_power(int *ra_idx, object_type const *o_ptr, std::vector<s16b> &max_times)
{
+ auto const &ra_info = game->edit_data.ra_info;
+
+ assert(max_times.size() >= ra_info.size());
+
bool_ ret = FALSE;
- u32b f1, f2, f3, f4, f5, esp;
std::vector<size_t> ok_ra;
/* Grab the ok randart */
- for (size_t i = 0; i < max_ra_idx; i++)
+ for (size_t i = 0; i < ra_info.size(); i++)
{
- randart_part_type *ra_ptr = &ra_info[i];
+ auto ra_ptr = &ra_info[i];
bool_ ok = FALSE;
/* Must have the correct fields */
- for (size_t j = 0; j < 20; j++)
+ for (auto const &filter: ra_ptr->kind_filter)
{
- if (ra_ptr->tval[j] == o_ptr->tval)
+ if ((filter.tval == o_ptr->tval) &&
+ (filter.min_sval <= o_ptr->sval) &&
+ (o_ptr->sval <= filter.max_sval))
{
- if ((ra_ptr->min_sval[j] <= o_ptr->sval) && (ra_ptr->max_sval[j] >= o_ptr->sval)) ok = TRUE;
+ ok = TRUE;
+ break;
}
+ }
- if (ok) break;
+ if ((0 < ra_ptr->max_pval) && (ra_ptr->max_pval < o_ptr->pval))
+ {
+ ok = FALSE;
}
- if ((0 < ra_ptr->max_pval) && (ra_ptr->max_pval < o_ptr->pval)) ok = FALSE;
+
if (!ok)
{
/* Doesnt count as a try*/
continue;
}
- /* Good should be good, bad should be bad */
- if (good && (ra_ptr->value <= 0)) continue;
- if ((!good) && (ra_ptr->value > 0)) continue;
+ /* Skip bad powers */
+ if (ra_ptr->value <= 0) continue;
+ /* Already chosen the maximum number of times? */
if (max_times[i] >= ra_ptr->max) continue;
/* Must NOT have the antagonic flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f1 & ra_ptr->aflags1) continue;
- if (f2 & ra_ptr->aflags2) continue;
- if (f3 & ra_ptr->aflags3) continue;
- if (f4 & ra_ptr->aflags4) continue;
- if (f5 & ra_ptr->aflags5) continue;
- if (esp & ra_ptr->aesp) continue;
+ auto const flags = object_flags(o_ptr);
+ if (flags & ra_ptr->aflags) continue;
/* ok */
ok_ra.push_back(i);
@@ -86,8 +85,8 @@ static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *m
/* Now test them a few times */
for (size_t count = 0; count < ok_ra.size() * 10; count++)
{
- size_t i = ok_ra[rand_int(ok_ra.size())];
- randart_part_type *ra_ptr = &ra_info[i];
+ size_t i = *uniform_element(ok_ra);
+ auto ra_ptr = &ra_info[i];
/* XXX XXX Enforce minimum player level (loosely) */
if (ra_ptr->level > p_ptr->lev)
@@ -121,24 +120,6 @@ static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *m
return (ret);
}
-void give_activation_power (object_type * o_ptr)
-{
- o_ptr->xtra2 = 0;
- o_ptr->art_flags3 &= ~TR3_ACTIVATE;
- o_ptr->timeout = 0;
-}
-
-
-int get_activation_power()
-{
- object_type *o_ptr, forge;
-
- o_ptr = &forge;
-
- give_activation_power(o_ptr);
-
- return o_ptr->xtra2;
-}
#define MIN_NAME_LEN 5
#define MAX_NAME_LEN 9
@@ -193,7 +174,7 @@ void build_prob(cptr learn)
* set. Relies on European vowels (a, e, i, o, u). The generated name should
* be copied/used before calling this function again.
*/
-static char *make_word(void)
+static char *make_word()
{
static char word_buf[90];
int r, totalfreq;
@@ -264,11 +245,13 @@ void get_random_name(char * return_name)
bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name)
{
+ auto const &ra_gen = game->edit_data.ra_gen;
+ auto const &ra_info = game->edit_data.ra_info;
+
char new_name[80];
- int powers = 0, i;
+ int powers = 0;
s32b total_flags, total_power = 0;
bool_ a_cursed = FALSE;
- u32b f1, f2, f3, f4, f5, esp;
s16b pval = 0;
bool_ limit_blows = FALSE;
@@ -276,52 +259,46 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name)
if ((!a_scroll) && (randint(A_CURSED) == 1)) a_cursed = TRUE;
- i = 0;
- while (ra_gen[i].chance)
+ for (auto const &g: ra_gen)
{
- powers += damroll(ra_gen[i].dd, ra_gen[i].ds) + ra_gen[i].plus;
- i++;
+ powers += damroll(g.dd, g.ds) + g.plus;
}
if ((!a_cursed) && (randint(30) == 1)) powers *= 2;
if (a_cursed) powers /= 2;
- std::unique_ptr<s16b[]> max_times(new s16b[max_ra_idx]);
- for (int i = 0; i < max_ra_idx; i++) {
- max_times[i] = 0;
- }
+ std::vector<s16b> max_times(ra_info.size(), 0);
/* Main loop */
while (powers)
{
- int ra_idx;
- randart_part_type *ra_ptr;
-
powers--;
- if (!grab_one_power(&ra_idx, o_ptr, TRUE, max_times.get())) continue;
+ int ra_idx;
+ if (!grab_one_power(&ra_idx, o_ptr, max_times))
+ {
+ continue;
+ }
- ra_ptr = &ra_info[ra_idx];
+ auto ra_ptr = &ra_info[ra_idx];
- if (wizard) msg_format("Adding randart power: %d", ra_idx);
+ if (wizard)
+ {
+ msg_format("Adding randart power: %d", ra_idx);
+ }
total_power += ra_ptr->value;
- o_ptr->art_flags1 |= ra_ptr->flags1;
- o_ptr->art_flags2 |= ra_ptr->flags2;
- o_ptr->art_flags3 |= ra_ptr->flags3;
- o_ptr->art_flags4 |= ra_ptr->flags4;
- o_ptr->art_flags5 |= ra_ptr->flags5;
- o_ptr->art_esp |= ra_ptr->esp;
+ o_ptr->art_flags |= ra_ptr->flags;
add_random_ego_flag(o_ptr, ra_ptr->fego, &limit_blows);
/* get flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack -- acquire "cursed" flag */
- if (f3 & TR3_CURSED) o_ptr->ident |= (IDENT_CURSED);
+ if (flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED);
/* Hack -- obtain bonuses */
if (ra_ptr->max_to_h > 0) o_ptr->to_h += randint(ra_ptr->max_to_h);
@@ -339,23 +316,26 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name)
if (pval < 0) o_ptr->pval = randint( -pval);
/* No insane number of blows */
- if (limit_blows && (o_ptr->art_flags1 & TR1_BLOWS))
+ if (limit_blows && (o_ptr->art_flags & TR_BLOWS))
{
if (o_ptr->pval > 2) o_ptr->pval = randint(2);
}
/* Just to be sure */
- o_ptr->art_flags3 |= ( TR3_IGNORE_ACID | TR3_IGNORE_ELEC |
- TR3_IGNORE_FIRE | TR3_IGNORE_COLD);
+ o_ptr->art_flags |=
+ TR_IGNORE_ACID |
+ TR_IGNORE_ELEC |
+ TR_IGNORE_FIRE |
+ TR_IGNORE_COLD;
total_flags = flag_cost(o_ptr, o_ptr->pval);
- if (cheat_peek) msg_format("%ld", total_flags);
+ if (options->cheat_peek)
+ {
+ msg_format("%ld", total_flags);
+ }
if (a_cursed) curse_artifact(o_ptr);
- /* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
if (get_name)
{
if (a_scroll)
@@ -378,7 +358,7 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name)
}
else
/* Default name = of 'player name' */
- sprintf(new_name, "of '%s'", player_name);
+ sprintf(new_name, "of '%s'", game->player_name.c_str());
}
else
{
@@ -387,19 +367,22 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name)
}
/* Save the inscription */
- o_ptr->art_name = quark_add(new_name);
+ o_ptr->artifact_name = new_name;
o_ptr->name2 = o_ptr->name2b = 0;
/* Window stuff */
p_ptr->window |= (PW_INVEN | PW_EQUIP);
+ /* Extract the flags */
+ auto const flags = object_flags(o_ptr);
+
/* HACKS for ToME */
if (o_ptr->tval == TV_CLOAK && o_ptr->sval == SV_MIMIC_CLOAK)
{
s32b mimic = find_random_mimic_shape(127, TRUE);
o_ptr->pval2 = mimic;
}
- else if (f5 & TR5_SPELL_CONTAIN)
+ else if (flags & TR_SPELL_CONTAIN)
{
o_ptr->pval2 = -1;
}
@@ -408,7 +391,7 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name)
}
-bool_ artifact_scroll(void)
+bool_ artifact_scroll()
{
bool_ okay = FALSE;
@@ -466,7 +449,7 @@ bool_ artifact_scroll(void)
if (!okay)
{
/* Flush */
- if (flush_failure) flush();
+ flush_on_failure();
/* Message */
msg_print("The enchantment failed.");
diff --git a/src/randart.hpp b/src/randart.hpp
index 31b70f08..6f91f36d 100644
--- a/src/randart.hpp
+++ b/src/randart.hpp
@@ -3,7 +3,6 @@
#include "h-basic.h"
#include "object_type_fwd.hpp"
-extern int get_activation_power(void);
-extern void build_prob(cptr learn);
-extern bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name);
-extern bool_ artifact_scroll(void);
+void build_prob(cptr learn);
+bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name);
+bool_ artifact_scroll();
diff --git a/src/randart_gen_type_fwd.hpp b/src/randart_gen_type_fwd.hpp
deleted file mode 100644
index eba3e84e..00000000
--- a/src/randart_gen_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct randart_gen_type;
diff --git a/src/randart_part_type.hpp b/src/randart_part_type.hpp
index c2fa5386..5a4ca329 100644
--- a/src/randart_part_type.hpp
+++ b/src/randart_part_type.hpp
@@ -1,43 +1,44 @@
#pragma once
+#include "ego_flag_set.hpp"
#include "h-basic.h"
+#include "object_flag_set.hpp"
+
+#include <vector>
/**
* Random artifact part descriptor.
*/
struct randart_part_type
{
- byte tval[20];
- byte min_sval[20];
- byte max_sval[20];
-
- byte level; /* Minimum level */
- byte rarity; /* Object rarity */
- byte mrarity; /* Object rarity */
-
- s16b max_to_h; /* Maximum to-hit bonus */
- s16b max_to_d; /* Maximum to-dam bonus */
- s16b max_to_a; /* Maximum to-ac bonus */
-
- s32b max_pval; /* Maximum pval */
-
- s32b value; /* power value */
- s16b max; /* Number of time it can appear on a single item */
-
- u32b flags1; /* Ego-Item Flags, set 1 */
- u32b flags2; /* Ego-Item Flags, set 2 */
- u32b flags3; /* Ego-Item Flags, set 3 */
- u32b flags4; /* Ego-Item Flags, set 4 */
- u32b flags5; /* Ego-Item Flags, set 5 */
- u32b esp; /* ESP flags */
- u32b fego; /* ego flags */
-
- u32b aflags1; /* Ego-Item Flags, set 1 */
- u32b aflags2; /* Ego-Item Flags, set 2 */
- u32b aflags3; /* Ego-Item Flags, set 3 */
- u32b aflags4; /* Ego-Item Flags, set 4 */
- u32b aflags5; /* Ego-Item Flags, set 5 */
- u32b aesp; /* ESP flags */
-
- s16b power; /* Power granted(if any) */
+public:
+ struct kind_filter_t {
+ byte tval;
+ byte min_sval;
+ byte max_sval;
+ };
+
+ std::vector<kind_filter_t> kind_filter;
+
+ byte level = 0; /* Minimum level */
+ byte rarity = 0; /* Object rarity */
+ byte mrarity = 0; /* Object rarity */
+
+ s16b max_to_h = 0; /* Maximum to-hit bonus */
+ s16b max_to_d = 0; /* Maximum to-dam bonus */
+ s16b max_to_a = 0; /* Maximum to-ac bonus */
+
+ s32b max_pval = 0; /* Maximum pval */
+
+ s32b value = 0; /* power value */
+ s16b max = 0; /* Number of time it can appear on a single item */
+
+ object_flag_set flags; /* Ego item flags */
+
+ ego_flag_set fego; /* Ego flags */
+
+ object_flag_set aflags; /* Antagonistic ego item flags */
+
+ s16b power = -1; /* Power granted(if any) */
+
};
diff --git a/src/randart_part_type_fwd.hpp b/src/randart_part_type_fwd.hpp
deleted file mode 100644
index 979fd72c..00000000
--- a/src/randart_part_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct randart_part_type;
diff --git a/src/random_artifact.hpp b/src/random_artifact.hpp
index a3fc1c66..618f1102 100644
--- a/src/random_artifact.hpp
+++ b/src/random_artifact.hpp
@@ -2,13 +2,15 @@
#include "h-basic.h"
+#include <string>
+
/**
* Random artifact descriptor.
*/
struct random_artifact
{
- char name_full[80]; /* Full name for the artifact */
- char name_short[80]; /* Un-Id'd name */
+ std::string name_full; /* Full name for the artifact */
+ std::string name_short; /* Un-Id'd name */
byte level; /* Level of the artifact */
byte attr; /* Color that is used on the screen */
u32b cost; /* Object's value */
diff --git a/src/random_quest.hpp b/src/random_quest.hpp
index 11ebe797..9e3c6e10 100644
--- a/src/random_quest.hpp
+++ b/src/random_quest.hpp
@@ -6,5 +6,5 @@ struct random_quest
{
byte type; /* Type/number of monsters to kill(0 = no quest) */
s16b r_idx; /* Monsters to crush */
- bool_ done; /* Done ? */
+ bool done; /* Done? */
};
diff --git a/src/random_spell.hpp b/src/random_spell.hpp
index 01b5ba5e..f02b9848 100644
--- a/src/random_spell.hpp
+++ b/src/random_spell.hpp
@@ -1,21 +1,20 @@
#pragma once
#include "h-basic.h"
+#include <string>
/**
* A structure to describe the random spells of the Power Mages
*/
struct random_spell
{
- char desc[30]; /* Desc of the spell */
- char name[30]; /* Name of the spell */
- s16b mana; /* Mana cost */
- s16b fail; /* Failure rate */
- u32b proj_flags; /* Project function flags */
- byte GF; /* Type of the projection */
- byte radius;
- byte dam_sides;
- byte dam_dice;
- byte level; /* Level needed */
- bool_ untried; /* Is the spell was tried? */
+ s16b mana = 0; /* Mana cost */
+ s16b fail = 0; /* Failure rate */
+ u32b proj_flags = 0; /* Project function flags */
+ byte GF = 0; /* Type of the projection */
+ byte radius = 0;
+ byte dam_sides = 0;
+ byte dam_dice = 0;
+ byte level = 0; /* Level needed */
+ bool untried = true; /* Is the spell was tried? */
};
diff --git a/src/random_spell_fwd.hpp b/src/random_spell_fwd.hpp
new file mode 100644
index 00000000..ee559c31
--- /dev/null
+++ b/src/random_spell_fwd.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+struct random_spell;
diff --git a/src/rule_type.hpp b/src/rule_type.hpp
index a8b35ffa..b88ce7bf 100644
--- a/src/rule_type.hpp
+++ b/src/rule_type.hpp
@@ -1,22 +1,17 @@
#pragma once
#include "h-basic.h"
+#include "monster_race_flag_set.hpp"
+#include "monster_spell_flag_set.hpp"
/* Define monster generation rules */
struct rule_type
{
- byte mode; /* Mode of combination of the monster flags */
- byte percent; /* Percent of monsters affected by the rule */
+ byte mode = 0; /* Mode of combination of the monster flags */
+ byte percent = 0; /* Percent of monsters affected by the rule */
- u32b mflags1; /* The monster flags that are allowed */
- u32b mflags2;
- u32b mflags3;
- u32b mflags4;
- u32b mflags5;
- u32b mflags6;
- u32b mflags7;
- u32b mflags8;
- u32b mflags9;
+ monster_race_flag_set mflags; /* The monster flags that are allowed */
+ monster_spell_flag_set mspells; /* Monster spells the are allowed */
- char r_char[5]; /* Monster race allowed */
+ char r_char[5] = { 0 }; /* Monster race allowed */
};
diff --git a/src/rune_spell.hpp b/src/rune_spell.hpp
deleted file mode 100644
index d04a8dc4..00000000
--- a/src/rune_spell.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-
-/**
- * Runecrafter prefered spells
- */
-struct rune_spell
-{
- char name[30]; /* name */
-
- s16b type; /* Type of the spell(GF) */
- s16b rune2; /* Modifiers */
- s16b mana; /* Mana involved */
-};
diff --git a/src/rune_spell_fwd.hpp b/src/rune_spell_fwd.hpp
deleted file mode 100644
index eb540a2a..00000000
--- a/src/rune_spell_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct rune_spell;
diff --git a/src/script.cc b/src/script.cc
deleted file mode 100644
index 84f7c3e4..00000000
--- a/src/script.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2001 Dark God
- *
- * This software may be copied and distributed for educational, research, and
- * not for profit purposes provided that this copyright and statement are
- * included in all such copies.
- */
-
-#include "script.h"
-
-#include "init2.hpp"
-#include "q_library.hpp"
-#include "spells4.hpp"
-#include "spells5.hpp"
-#include "spells6.hpp"
-
-
-void init_lua_init()
-{
- /* Initialize schooled spells */
- schools_init();
- school_spells_init();
- init_school_books();
-
- /* Post-spell creation initialization */
- initialize_bookable_spells();
-
- /* Finish up the corruptions */
- init_corruptions();
-}
diff --git a/src/script.h b/src/script.h
deleted file mode 100644
index 3d1a0840..00000000
--- a/src/script.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-// C linkage required for these functions since main-* code uses them.
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void init_lua_init(void);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
diff --git a/src/seed.cc b/src/seed.cc
new file mode 100644
index 00000000..0550c769
--- /dev/null
+++ b/src/seed.cc
@@ -0,0 +1,53 @@
+#include "seed.hpp"
+
+#include <random>
+
+seed_t seed_t::system()
+{
+ seed_t seed;
+ // Use system's random device for seeding.
+ std::random_device random_device;
+ std::uniform_int_distribution<std::uint8_t> distribution;
+ // Extract the number of bytes we need.
+ for (std::size_t i = 0; i < n_bytes; i++)
+ {
+ seed.m_data[i] = distribution(random_device);
+ }
+ // Done
+ return seed;
+}
+
+seed_t seed_t::from_bytes(std::uint8_t bytes[n_bytes])
+{
+ seed_t seed;
+ // Copy
+ for (std::size_t i = 0; i < n_bytes; i++)
+ {
+ seed.m_data[i] = bytes[i];
+ }
+ // Done
+ return seed;
+}
+
+void seed_t::to_bytes(std::uint8_t bytes[n_bytes]) const
+{
+ // Copy
+ for (std::size_t i = 0; i < n_bytes; i++)
+ {
+ bytes[i] = m_data[i];
+ }
+}
+void seed_t::to_uint32(std::uint32_t seed_seq_data[n_uint32]) const
+{
+ for (std::size_t i = 0; i < n_uint32; i++)
+ {
+ // Position in the byte-oriented data.
+ std::size_t p = 4 * i;
+ // Pack m_data[p + 0], ..., m_data[p + 3] into a single uint32_t
+ seed_seq_data[i] = 0;
+ seed_seq_data[i] |= (uint32_t(m_data[p + 0]) << (0 * 8));
+ seed_seq_data[i] |= (uint32_t(m_data[p + 1]) << (1 * 8));
+ seed_seq_data[i] |= (uint32_t(m_data[p + 2]) << (2 * 8));
+ seed_seq_data[i] |= (uint32_t(m_data[p + 3]) << (3 * 8));
+ }
+}
diff --git a/src/seed.hpp b/src/seed.hpp
new file mode 100644
index 00000000..91ec7eba
--- /dev/null
+++ b/src/seed.hpp
@@ -0,0 +1,51 @@
+#pragma once
+
+#include <array>
+#include <cstdint>
+
+class seed_t {
+
+public:
+ // Number of seed bytes.
+ static constexpr std::size_t n_bytes = 64;
+
+ // Sanity check; we're relying on converting to uint32_t elsewhere,
+ // so let's just keep it as easy as possible.
+ static_assert(n_bytes % 4 == 0, "n_bytes must be multiple of 4");
+
+ // Number of uint32_t's required to store the seed.
+ static constexpr std::size_t n_uint32 = n_bytes / 4;
+
+private:
+ std::array<std::uint8_t, n_bytes> m_data;
+
+ // Default constructor is private. Use the static
+ // factory functions instead.
+ seed_t()
+ {
+ // Factory functions do explicit initialization.
+ };
+
+public:
+
+ /**
+ * Create a seed from system entropy.
+ */
+ static seed_t system();
+
+ /**
+ * Create a seed from the given bytes.
+ */
+ static seed_t from_bytes(std::uint8_t bytes[n_bytes]);
+
+ /**
+ * Convert seed to bytes.
+ */
+ void to_bytes(std::uint8_t bytes[n_bytes]) const;
+
+ /**
+ * Convert seed to uint32_t's suitable for seed_seq.
+ */
+ void to_uint32(std::uint32_t seed_seq_data[n_uint32]) const;
+
+};
diff --git a/src/seed_fwd.hpp b/src/seed_fwd.hpp
new file mode 100644
index 00000000..291a6063
--- /dev/null
+++ b/src/seed_fwd.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+class seed_t;
diff --git a/src/set_component.hpp b/src/set_component.hpp
new file mode 100644
index 00000000..18dc4d57
--- /dev/null
+++ b/src/set_component.hpp
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "h-basic.h"
+#include "object_flag_set.hpp"
+
+#include <array>
+#include <cstdint>
+
+constexpr std::size_t SET_MAX_SIZE = 6;
+
+struct set_component {
+ bool_ present = FALSE; /* Is it being worn? */
+ s16b a_idx = 0; /* What artifact? */
+ std::array<s16b , SET_MAX_SIZE> pval; /* Pval for each combination */
+ std::array<object_flag_set, SET_MAX_SIZE> flags; /* Flags */
+};
diff --git a/src/set_type.hpp b/src/set_type.hpp
index 827c23ac..bf13c932 100644
--- a/src/set_type.hpp
+++ b/src/set_type.hpp
@@ -1,28 +1,20 @@
#pragma once
-#include "h-basic.h"
+#include <array>
+#include <string>
+
+#include "set_component.hpp"
/**
* Item set descriptor and runtime information.
*/
struct set_type
{
- const char *name; /* Name */
- char *desc; /* Desc */
+ std::string name; /* Name */
+ std::string desc; /* Desc */
- byte num; /* Number of artifacts used */
- byte num_use; /* Number actually wore */
+ byte num = 0; /* Number of artifacts used */
+ byte num_use = 0; /* Number actually worn */
- struct /* the various items */
- {
- bool_ present; /* Is it actually wore ? */
- s16b a_idx; /* What artifact ? */
- s16b pval[6]; /* Pval for each combination */
- u32b flags1[6]; /* Flags */
- u32b flags2[6]; /* Flags */
- u32b flags3[6]; /* Flags */
- u32b flags4[6]; /* Flags */
- u32b flags5[6]; /* Flags */
- u32b esp[6]; /* Flags */
- } arts[6];
+ std::array<set_component, SET_MAX_SIZE> arts;
};
diff --git a/src/set_type_fwd.hpp b/src/set_type_fwd.hpp
deleted file mode 100644
index 3b311808..00000000
--- a/src/set_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct set_type;
diff --git a/src/skill_descriptor.hpp b/src/skill_descriptor.hpp
new file mode 100644
index 00000000..8d9de004
--- /dev/null
+++ b/src/skill_descriptor.hpp
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "h-basic.h"
+#include "skill_flag_set.hpp"
+#include "skills_defs.hpp"
+
+#include <vector>
+#include <tuple>
+
+/**
+ * Skill descriptor.
+ */
+struct skill_descriptor {
+
+ std::string name; /* Name */
+ std::string desc; /* Description */
+
+ std::string action_desc; /* Action Description */
+ s16b action_mkey = 0; /* Action do to */
+
+ std::vector<std::size_t> excludes; /* List of skills that this skill excludes;
+ any skill points assigned completely nullify
+ the listed skills */
+
+ std::vector<std::tuple<std::size_t, int>> increases;
+ /* List of skills the this skill increases,
+ along with the modifier that gets applied.
+ The first tuple element is the skill index. */
+
+ s16b father = 0; /* Father in the skill tree */
+ s16b order = 0; /* Order in the tree */
+
+ byte random_gain_chance = 100; /* Chance to gain from Lost Sword quest; if applicable */
+
+ skill_flag_set flags; /* Skill flags */
+
+};
diff --git a/src/skill_flag.hpp b/src/skill_flag.hpp
new file mode 100644
index 00000000..15c6de9c
--- /dev/null
+++ b/src/skill_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "skill_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define SKF(tier, index, name) \
+ DECLARE_FLAG(skill_flag_set, BOOST_PP_CAT(SKF_,name), tier, index)
+#include "skill_flag_list.hpp"
+#undef SKF
diff --git a/src/skill_flag_list.hpp b/src/skill_flag_list.hpp
new file mode 100644
index 00000000..49cdc045
--- /dev/null
+++ b/src/skill_flag_list.hpp
@@ -0,0 +1,9 @@
+/**
+ * X-macro list of all the skill flags
+ */
+
+/* SKF(<tier>, <index>, <name>) */
+
+SKF(1, 0, HIDDEN ) /* Starts hidden */
+SKF(1, 1, AUTO_HIDE ) /* Tries to rehide at calc_bonus */
+SKF(1, 2, RANDOM_GAIN) /* Can be gained through Lost Sword quest */
diff --git a/src/skill_flag_set.hpp b/src/skill_flag_set.hpp
new file mode 100644
index 00000000..a2768b70
--- /dev/null
+++ b/src/skill_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t SKF_MAX_TIERS = 1;
+
+typedef flag_set<SKF_MAX_TIERS> skill_flag_set;
diff --git a/src/skill_modifier.hpp b/src/skill_modifier.hpp
new file mode 100644
index 00000000..e4bf4ce9
--- /dev/null
+++ b/src/skill_modifier.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "h-basic.h"
+
+struct skill_modifier {
+
+ char basem = '\0';
+ u32b base = 0;
+ char modm = '\0';
+ s16b mod = 0;
+
+};
diff --git a/src/skill_modifiers.hpp b/src/skill_modifiers.hpp
new file mode 100644
index 00000000..5e90b000
--- /dev/null
+++ b/src/skill_modifiers.hpp
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "h-basic.h"
+#include "skills_defs.hpp"
+#include "skill_modifier.hpp"
+
+#include <vector>
+
+struct skill_modifiers
+{
+ /**
+ * Skill modifiers indexed by skill. Note that this vector
+ * may be shorter than the s_descriptors vector.
+ */
+ std::vector<skill_modifier> modifiers;
+
+};
diff --git a/src/skill_modifiers_fwd.hpp b/src/skill_modifiers_fwd.hpp
new file mode 100644
index 00000000..18f692bd
--- /dev/null
+++ b/src/skill_modifiers_fwd.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+struct skill_modifiers;
diff --git a/src/skill_type.hpp b/src/skill_type.hpp
index c6de1dc1..c26d8649 100644
--- a/src/skill_type.hpp
+++ b/src/skill_type.hpp
@@ -1,37 +1,32 @@
#pragma once
#include "h-basic.h"
+#include "skill_flag_set.hpp"
#include "skills_defs.hpp"
+#include "skill_descriptor.hpp"
/**
- * Skill descriptors and runtime data.
+ * Skill runtime data.
*/
struct skill_type
{
- const char *name; /* Name */
- char *desc; /* Description */
-
- const char *action_desc; /* Action Description */
-
- s16b action_mkey; /* Action do to */
-
- s32b i_value; /* Actual value */
- s32b i_mod; /* Modifier(1 skill point = modifier skill) */
-
- s32b value; /* Actual value */
- s32b mod; /* Modifier(1 skill point = modifier skill) */
- s16b rate; /* Modifier decreasing rate */
-
- u32b uses; /* Number of times used */
-
- s16b action[MAX_SKILLS]; /* List of actions against other skills */
-
- s16b father; /* Father in the skill tree */
- bool_ dev; /* Is the branch developped ? */
- s16b order; /* Order in the tree */
- bool_ hidden; /* Innactive */
-
- byte random_gain_chance; /* random gain chance, still needs the flag */
-
- u32b flags1; /* Skill flags */
+ /**
+ * Current value.
+ */
+ s32b value = 0;
+
+ /**
+ * Current modifier, i.e. how much value 1 skill point gives.
+ */
+ s32b mod = 0;
+
+ /**
+ * Is the branch developed?
+ */
+ bool dev = false;
+
+ /**
+ * Is the skill hidden?
+ */
+ bool hidden = false;
};
diff --git a/src/skill_type_fwd.hpp b/src/skill_type_fwd.hpp
deleted file mode 100644
index 0a06dadb..00000000
--- a/src/skill_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct skill_type;
diff --git a/src/skills.cc b/src/skills.cc
index 3a14a6ce..af5e46c7 100644
--- a/src/skills.cc
+++ b/src/skills.cc
@@ -14,6 +14,7 @@
#include "cmd3.hpp"
#include "cmd5.hpp"
#include "cmd7.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "help.hpp"
#include "hooks.hpp"
@@ -27,11 +28,11 @@
#include "player_race_mod.hpp"
#include "player_spec.hpp"
#include "player_type.hpp"
+#include "skill_flag.hpp"
#include "skill_type.hpp"
#include "spells1.hpp"
#include "spells4.hpp"
#include "tables.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -43,6 +44,7 @@
#include <boost/algorithm/string/predicate.hpp>
#include <cassert>
#include <cmath>
+#include <fmt/format.h>
#include <memory>
#include <vector>
#include <tuple>
@@ -55,6 +57,8 @@ using boost::algorithm::iequals;
*/
static void increase_skill(int i, s16b *invest)
{
+ auto &s_info = game->s_info;
+
s32b max_skill_overage;
/* No skill points to be allocated */
@@ -70,15 +74,11 @@ static void increase_skill(int i, s16b *invest)
max_skill_overage = modules[game_module_idx].skills.max_skill_overage;
if (((s_info[i].value + s_info[i].mod) / SKILL_STEP) >= (p_ptr->lev + max_skill_overage + 1))
{
- int hgt, wid;
- char buf[256];
-
- sprintf(buf,
- "Cannot raise a skill value above " FMTs32b " + player level.",
- max_skill_overage);
-
- Term_get_size(&wid, &hgt);
- msg_box(buf, hgt / 2, wid / 2);
+ msg_box_auto(
+ fmt::format(
+ "Cannot raise a skill value above {} + player level.",
+ max_skill_overage
+ ));
return;
}
@@ -97,6 +97,8 @@ static void increase_skill(int i, s16b *invest)
*/
static void decrease_skill(int i, s16b *invest)
{
+ auto &s_info = game->s_info;
+
/* Cannot decrease more */
if (!invest[i]) return;
@@ -119,31 +121,33 @@ static void decrease_skill(int i, s16b *invest)
* Given the name of a skill, returns skill index or -1 if no
* such skill is found
*/
-s16b find_skill(cptr name)
+s16b find_skill(cptr needle)
{
- u16b i;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
/* Scan skill list */
- for (i = 1; i < max_s_idx; i++)
+ for (std::size_t i = 1; i < s_descriptors.size(); i++)
{
- if (s_info[i].name && streq(s_info[i].name, name))
+ auto const &name = s_descriptors[i].name;
+ if (!name.empty() && (name == needle))
{
- return (i);
+ return i;
}
}
/* No match found */
- return ( -1);
+ return -1;
}
-s16b find_skill_i(cptr name)
+
+s16b find_skill_i(cptr needle)
{
- u16b i;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
/* Scan skill list */
- for (i = 1; i < max_s_idx; i++)
+ for (std::size_t i = 1; i < s_descriptors.size(); i++)
{
- /* The name matches */
- if (s_info[i].name && iequals(s_info[i].name, name))
+ auto const &name = s_descriptors[i].name;
+ if (!name.empty() && iequals(name, needle))
{
return (i);
}
@@ -159,6 +163,8 @@ s16b find_skill_i(cptr name)
*/
s16b get_skill(int skill)
{
+ auto const &s_info = game->s_info;
+
return (s_info[skill].value / SKILL_STEP);
}
@@ -169,7 +175,7 @@ s16b get_skill(int skill)
*/
s16b get_skill_scale(int skill, u32b scale)
{
- s32b temp;
+ auto const &s_info = game->s_info;
/*
* SKILL_STEP shouldn't matter here because the second parameter is
@@ -181,32 +187,38 @@ s16b get_skill_scale(int skill, u32b scale)
* formula given above, I verified this works the same by using a tiny
* scheme program... -- pelpel
*/
- temp = scale * s_info[skill].value;
+ s32b temp = scale * s_info[skill].value;
return (temp / SKILL_MAX);
}
-static int get_idx(int i)
+static std::size_t get_idx(int i)
{
- for (int j = 1; j < max_s_idx; j++)
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+
+ for (std::size_t j = 1; j < s_descriptors.size(); j++)
{
- if (s_info[j].order == i)
- return (j);
+ if (s_descriptors[j].order == i)
+ {
+ return j;
+ }
}
- return (0);
+
+ return 0;
}
static bool_ is_known(int s_idx)
{
- int i;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto const &s_info = game->s_info;
if (wizard) return TRUE;
if (s_info[s_idx].value || s_info[s_idx].mod) return TRUE;
- for (i = 0; i < max_s_idx; i++)
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
/* It is our child, if we don't know it we continue to search, if we know it it is enough*/
- if (s_info[i].father == s_idx)
+ if (s_descriptors[i].father == s_idx)
{
if (is_known(i))
return TRUE;
@@ -217,38 +229,59 @@ static bool_ is_known(int s_idx)
return FALSE;
}
-static void init_table_aux(int table[MAX_SKILLS][2], int *idx, int father, int lev, bool_ full)
+namespace { // anonymous
+
+struct skill_entry {
+ std::size_t skill_idx;
+ int indent_level;
+};
+
+}
+
+static void init_table_aux(std::vector<skill_entry> *table, int father, int lev, bool_ full)
{
- for (int j = 1; j < max_s_idx; j++)
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto const &s_info = game->s_info;
+
+ for (std::size_t j = 1; j < s_descriptors.size(); j++)
{
- int i = get_idx(j);
- if (s_info[i].father != father) continue;
+ std::size_t i = get_idx(j);
+
+ if (s_descriptors[i].father != father) continue;
if (s_info[i].hidden) continue;
if (!is_known(i)) continue;
- table[*idx][0] = i;
- table[*idx][1] = lev;
- (*idx)++;
- if (s_info[i].dev || full) init_table_aux(table, idx, i, lev + 1, full);
+ skill_entry entry;
+ entry.skill_idx = i;
+ entry.indent_level = lev;
+ table->emplace_back(entry);
+
+ if (s_info[i].dev || full)
+ {
+ init_table_aux(table, i, lev + 1, full);
+ }
}
}
-static void init_table(int table[MAX_SKILLS][2], int *max, bool_ full)
+static void init_table(std::vector<skill_entry> *table, bool_ full)
{
- *max = 0;
- init_table_aux(table, max, -1, 0, full);
+ table->clear();
+ init_table_aux(table, -1, 0, full);
}
-static bool_ has_child(int sel)
+static bool has_child(int sel)
{
- int i;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
- for (i = 1; i < max_s_idx; i++)
+ for (std::size_t i = 1; i < s_descriptors.size(); i++)
{
- if ((s_info[i].father == sel) && (is_known(i)))
- return (TRUE);
+ if ((s_descriptors[i].father == sel) && is_known(i))
+ {
+ return true;
+ }
}
- return (FALSE);
+
+ return false;
}
@@ -257,42 +290,51 @@ static bool_ has_child(int sel)
*/
void dump_skills(FILE *fff)
{
- int i, j, max = 0;
- int table[MAX_SKILLS][2];
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto const &s_info = game->s_info;
+
char buf[80];
- init_table(table, &max, TRUE);
+ std::vector<skill_entry> table;
+ table.reserve(s_descriptors.size());
+ init_table(&table, TRUE);
fprintf(fff, "\nSkills (points left: %d)", p_ptr->skill_points);
- for (j = 0; j < max; j++)
+ for (auto const &entry: table)
{
- int z;
-
- i = table[j][0];
+ std::size_t i = entry.skill_idx;
+ auto const &skill = s_info[i];
+ auto const &skill_name = s_descriptors[i].name;
- if ((s_info[i].value == 0) && (i != SKILL_MISC))
+ if ((skill.value == 0) && (i != SKILL_MISC))
{
- if (s_info[i].mod == 0) continue;
+ if (skill.mod == 0)
+ {
+ continue;
+ }
}
sprintf(buf, "\n");
- for (z = 0; z < table[j][1]; z++) strcat(buf, " ");
+ for (int z = 0; z < entry.indent_level; z++)
+ {
+ strcat(buf, " ");
+ }
if (!has_child(i))
{
- strcat(buf, format(" . %s", s_info[i].name));
+ strcat(buf, format(" . %s", skill_name.c_str()));
}
else
{
- strcat(buf, format(" - %s", s_info[i].name));
+ strcat(buf, format(" - %s", skill_name.c_str()));
}
fprintf(fff, "%-49s%s%06.3f [%05.3f]",
- buf, s_info[i].value < 0 ? "-" : " ",
- static_cast<double>(ABS(s_info[i].value)) / SKILL_STEP,
- static_cast<double>(s_info[i].mod) / 1000);
+ buf, skill.value < 0 ? "-" : " ",
+ static_cast<double>(ABS(skill.value)) / SKILL_STEP,
+ static_cast<double>(skill.mod) / 1000);
}
fprintf(fff, "\n");
@@ -302,9 +344,12 @@ void dump_skills(FILE *fff)
/*
* Draw the skill tree
*/
-void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start)
+static void print_skills(std::vector<skill_entry> const &table, int sel, int start)
{
- int i, j;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto const &s_info = game->s_info;
+
+ int j;
int wid, hgt;
cptr keys;
@@ -316,52 +361,73 @@ void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start)
display_message(0, 1, strlen(keys), TERM_WHITE, keys);
c_prt((p_ptr->skill_points) ? TERM_L_BLUE : TERM_L_RED,
format("Skill points left: %d", p_ptr->skill_points), 2, 0);
- print_desc_aux(s_info[table[sel][0]].desc, 3, 0);
+ print_desc_aux(s_descriptors[table[sel].skill_idx].desc.c_str(), 3, 0);
for (j = start; j < start + (hgt - 7); j++)
{
byte color = TERM_WHITE;
char deb = ' ', end = ' ';
- if (j >= max) break;
+ if (j >= static_cast<int>(table.size()))
+ {
+ break;
+ }
+
+ std::size_t i = table[j].skill_idx;
+ auto const &name = s_descriptors[i].name;
+ auto const &skill = s_info[i];
- i = table[j][0];
+ if ((skill.value == 0) && (i != SKILL_MISC))
+ {
+ if (skill.mod == 0)
+ {
+ color = TERM_L_DARK;
+ }
+ else
+ {
+ color = TERM_ORANGE;
+ }
+ }
+ else if (skill.value == SKILL_MAX)
+ {
+ color = TERM_L_BLUE;
+ }
- if ((s_info[i].value == 0) && (i != SKILL_MISC))
+ if (skill.hidden)
{
- if (s_info[i].mod == 0) color = TERM_L_DARK;
- else color = TERM_ORANGE;
+ color = TERM_L_RED;
}
- else if (s_info[i].value == SKILL_MAX) color = TERM_L_BLUE;
- if (s_info[i].hidden) color = TERM_L_RED;
+
if (j == sel)
{
color = TERM_L_GREEN;
deb = '[';
end = ']';
}
+
if (!has_child(i))
{
- c_prt(color, format("%c.%c%s", deb, end, s_info[i].name),
- j + 7 - start, table[j][1] * 4);
+ c_prt(color, format("%c.%c%s", deb, end, name.c_str()),
+ j + 7 - start, table[j].indent_level * 4);
}
- else if (s_info[i].dev)
+ else if (skill.dev)
{
- c_prt(color, format("%c-%c%s", deb, end, s_info[i].name),
- j + 7 - start, table[j][1] * 4);
+ c_prt(color, format("%c-%c%s", deb, end, name.c_str()),
+ j + 7 - start, table[j].indent_level * 4);
}
else
{
- c_prt(color, format("%c+%c%s", deb, end, s_info[i].name),
- j + 7 - start, table[j][1] * 4);
+ c_prt(color, format("%c+%c%s", deb, end, name.c_str()),
+ j + 7 - start, table[j].indent_level * 4);
}
+
c_prt(color,
format("%s%02ld.%03ld [%01d.%03d]",
- s_info[i].value < 0 ? "-" : " ",
- ABS(s_info[i].value) / SKILL_STEP,
- ABS(s_info[i].value) % SKILL_STEP,
- ABS(s_info[i].mod) / 1000,
- ABS(s_info[i].mod) % 1000),
+ skill.value < 0 ? "-" : " ",
+ ABS(skill.value) / SKILL_STEP,
+ ABS(skill.value) % SKILL_STEP,
+ ABS(skill.mod) / 1000,
+ ABS(skill.mod) % 1000),
j + 7 - start, 60);
}
}
@@ -371,6 +437,8 @@ void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start)
*/
void recalc_skills(bool_ init)
{
+ auto const &s_info = game->s_info;
+
static int thaum_level = 0;
/* TODO: This should be a hook in ToME's lua */
@@ -380,16 +448,19 @@ void recalc_skills(bool_ init)
}
else
{
+ auto const &random_spells = p_ptr->random_spells;
+
int thaum_gain = 0;
- /* Gain thaum spells */
- while (thaum_level < get_skill_scale(SKILL_THAUMATURGY, 100))
+ /* Gain thaum spells while there's more to be gained */
+ while ((thaum_level < get_skill_scale(SKILL_THAUMATURGY, 100)) &&
+ (random_spells.size() < MAX_SPELLS))
{
- if (spell_num == MAX_SPELLS) break;
thaum_level++;
generate_spell((thaum_level + 1) / 2);
thaum_gain++;
}
+
if (thaum_gain)
{
if (thaum_gain == 1)
@@ -420,49 +491,64 @@ void recalc_skills(bool_ init)
/*
* Recalc the skill value
*/
-static void recalc_skills_theory(s16b *invest, s32b *base_val, s32b *base_mod, s32b *bonus)
+static void recalc_skills_theory(
+ std::vector<s16b> &invest,
+ std::vector<s32b> const &base_val,
+ std::vector<s32b> const &base_mod,
+ std::vector<s32b> const &bonus)
{
- int i, j;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto &s_info = game->s_info;
/* First we assign the normal points */
- for (i = 0; i < max_s_idx; i++)
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
/* Calc the base */
s_info[i].value = base_val[i] + (base_mod[i] * invest[i]) + bonus[i];
/* It cannot exceed SKILL_MAX */
- if (s_info[i].value > SKILL_MAX) s_info[i].value = SKILL_MAX;
+ if (s_info[i].value > SKILL_MAX)
+ {
+ s_info[i].value = SKILL_MAX;
+ }
}
/* Then we modify related skills */
- for (i = 0; i < max_s_idx; i++)
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
- for (j = 1; j < max_s_idx; j++)
- {
- /* Ignore self */
- if (j == i) continue;
+ auto const &s_descriptor = s_descriptors[i];
- /* Exclusive skills */
- if ((s_info[i].action[j] == SKILL_EXCLUSIVE) && invest[i])
+ // Process all exlusions
+ if (invest[i])
+ {
+ for (auto exclude_si: s_descriptor.excludes)
{
- /* Turn it off */
- p_ptr->skill_points += invest[j];
- invest[j] = 0;
- s_info[j].value = 0;
+ // Give back skill points invested during this "session"
+ p_ptr->skill_points += invest[exclude_si];
+ invest[exclude_si] = 0;
+
+ // Turn it off
+ s_info[exclude_si].value = 0;
}
+ }
- /* Non-exclusive skills */
- else if (s_info[i].action[j])
- {
- /* Increase / decrease with a % */
- s32b val = s_info[j].value + (invest[i] * s_info[j].mod * s_info[i].action[j] / 100);
+ // Add any bonuses
+ for (auto const &increase: s_descriptor.increases)
+ {
+ auto increase_si = std::get<0>(increase);
+ auto increase_pct = std::get<1>(increase);
- /* It cannot exceed SKILL_MAX */
- if (val > SKILL_MAX) val = SKILL_MAX;
+ /* Increase/decrease by percentage */
+ s32b val = s_info[increase_si].value + (invest[i] * s_info[increase_si].mod * increase_pct / 100);
- /* Save the modified value */
- s_info[j].value = val;
+ /* It cannot exceed SKILL_MAX */
+ if (val > SKILL_MAX)
+ {
+ val = SKILL_MAX;
}
+
+ /* Save the modified value */
+ s_info[increase_si].value = val;
}
}
}
@@ -472,10 +558,11 @@ static void recalc_skills_theory(s16b *invest, s32b *base_val, s32b *base_mod, s
*/
void do_cmd_skill()
{
- int sel = 0, start = 0, max;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto &s_info = game->s_info;
+
+ int sel = 0, start = 0;
char c;
- int table[MAX_SKILLS][2];
- int i;
int wid, hgt;
s16b skill_points_save;
@@ -484,41 +571,38 @@ void do_cmd_skill()
/* Save the screen */
screen_save();
- /* Allocate arrays to save skill values */
- std::unique_ptr<s32b[]> skill_values_save(new s32b[MAX_SKILLS]);
- std::unique_ptr<s32b[]> skill_mods_save(new s32b[MAX_SKILLS]);
- std::unique_ptr<s16b[]> skill_rates_save(new s16b[MAX_SKILLS]);
- std::unique_ptr<s16b[]> skill_invest(new s16b[MAX_SKILLS]);
- std::unique_ptr<s32b[]> skill_bonus(new s32b[MAX_SKILLS]);
+ /* Allocate arrays to save skill values and track assigned points */
+ std::vector<s32b> skill_values_save; skill_values_save.resize(s_descriptors.size(), 0);
+ std::vector<s32b> skill_mods_save; skill_mods_save.resize(s_descriptors.size(), 0);
+ std::vector<s16b> skill_invest; skill_invest.resize(s_descriptors.size(), 0);
+ std::vector<s32b> skill_bonus; skill_bonus.resize(s_descriptors.size(), 0);
/* Save skill points */
skill_points_save = p_ptr->skill_points;
/* Save skill values */
- for (i = 0; i < max_s_idx; i++)
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
- skill_type *s_ptr = &s_info[i];
-
+ auto s_ptr = &s_info[i];
skill_values_save[i] = s_ptr->value;
skill_mods_save[i] = s_ptr->mod;
- skill_rates_save[i] = s_ptr->rate;
- skill_invest[i] = 0;
- skill_bonus[i] = 0;
}
/* Clear the screen */
Term_clear();
/* Initialise the skill list */
- init_table(table, &max, FALSE);
+ std::vector<skill_entry> table;
+ table.reserve(s_descriptors.size());
+ init_table(&table, FALSE);
while (TRUE)
{
Term_get_size(&wid, &hgt);
/* Display list of skills */
- recalc_skills_theory(skill_invest.get(), skill_values_save.get(), skill_mods_save.get(), skill_bonus.get());
- print_skills(table, max, sel, start);
+ recalc_skills_theory(skill_invest, skill_values_save, skill_mods_save, skill_bonus);
+ print_skills(table, sel, start);
/* Wait for user input */
c = inkey();
@@ -529,16 +613,21 @@ void do_cmd_skill()
/* Expand / collapse list of skills */
else if (c == '\r')
{
- if (s_info[table[sel][0]].dev) s_info[table[sel][0]].dev = FALSE;
- else s_info[table[sel][0]].dev = TRUE;
- init_table(table, &max, FALSE);
+ // Toggle the selected skill
+ s_info[table[sel].skill_idx].dev = !s_info[table[sel].skill_idx].dev;
+ // Re-populate table
+ init_table(&table, FALSE);
}
/* Next page */
else if (c == 'n')
{
sel += (hgt - 7);
- if (sel >= max) sel = max - 1;
+
+ if (sel >= static_cast<int>(table.size()))
+ {
+ sel = table.size() - 1;
+ }
}
/* Previous page */
@@ -563,31 +652,31 @@ void do_cmd_skill()
if (dir == 8) sel--;
/* Miscellaneous skills cannot be increased/decreased as a group */
- if ((sel >= 0) && (sel < max) && table[sel][0] == SKILL_MISC) continue;
+ if ((sel >= 0) && (sel < static_cast<int>(table.size())) && table[sel].skill_idx == SKILL_MISC) continue;
/* Increase the current skill */
- if (dir == 6) increase_skill(table[sel][0], skill_invest.get());
+ if (dir == 6) increase_skill(table[sel].skill_idx, skill_invest.data());
/* Decrease the current skill */
- if (dir == 4) decrease_skill(table[sel][0], skill_invest.get());
+ if (dir == 4) decrease_skill(table[sel].skill_idx, skill_invest.data());
/* XXX XXX XXX Wizard mode commands outside of wizard2.c */
/* Increase the skill */
- if (wizard && (c == '+')) skill_bonus[table[sel][0]] += SKILL_STEP;
+ if (wizard && (c == '+')) skill_bonus[table[sel].skill_idx] += SKILL_STEP;
/* Decrease the skill */
- if (wizard && (c == '-')) skill_bonus[table[sel][0]] -= SKILL_STEP;
+ if (wizard && (c == '-')) skill_bonus[table[sel].skill_idx] -= SKILL_STEP;
/* Contextual help */
if (c == '?')
{
- help_skill(s_info[table[sel][0]].name);
+ help_skill(s_descriptors[table[sel].skill_idx].name);
}
/* Handle boundaries and scrolling */
- if (sel < 0) sel = max - 1;
- if (sel >= max) sel = 0;
+ if (sel < 0) sel = table.size() - 1;
+ if (sel >= static_cast<int>(table.size())) sel = 0;
if (sel < start) start = sel;
if (sel >= start + (hgt - 7)) start = sel - (hgt - 7) + 1;
}
@@ -601,7 +690,7 @@ void do_cmd_skill()
flush();
/* Ask we can commit the change */
- if (msg_box("Save and use these skill values? (y/n)", hgt / 2, wid / 2) != 'y')
+ if (msg_box_auto("Save and use these skill values? (y/n)") != 'y')
{
/* User declines -- restore the skill values before exiting */
@@ -609,13 +698,11 @@ void do_cmd_skill()
p_ptr->skill_points = skill_points_save;
/* Restore skill values */
- for (i = 0; i < max_s_idx; i++)
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
- skill_type *s_ptr = &s_info[i];
-
+ auto s_ptr = &s_info[i];
s_ptr->value = skill_values_save[i];
s_ptr->mod = skill_mods_save[i];
- s_ptr->rate = skill_rates_save[i];
}
}
}
@@ -665,9 +752,11 @@ cptr get_melee_name()
s16b get_melee_skills()
{
- int i, j = 0;
+ auto const &s_info = game->s_info;
- for (i = 0; i < MAX_MELEE; i++)
+ int j = 0;
+
+ for (std::size_t i = 0; i < MAX_MELEE; i++)
{
if ((s_info[melee_skills[i]].value > 0) && (!s_info[melee_skills[i]].hidden))
{
@@ -778,7 +867,7 @@ void select_default_melee()
/*
* Print a batch of skills.
*/
-static void print_skill_batch(const std::vector<std::tuple<cptr, int>> &p, int start)
+static void print_skill_batch(const std::vector<std::tuple<std::string, int>> &p, int start)
{
char buff[80];
int j = 0;
@@ -794,7 +883,7 @@ static void print_skill_batch(const std::vector<std::tuple<cptr, int>> &p, int s
sprintf(buff, " %c - %d) %-30s", I2A(j),
std::get<1>(p[i]),
- std::get<0>(p[i]));
+ std::get<0>(p[i]).c_str());
prt(buff, 2 + j, 20);
j++;
@@ -805,11 +894,15 @@ static void print_skill_batch(const std::vector<std::tuple<cptr, int>> &p, int s
static int do_cmd_activate_skill_aux()
{
+ auto const &ab_info = game->edit_data.ab_info;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto const &s_info = game->s_info;
+
char which;
int start = 0;
int ret;
- std::vector<std::tuple<cptr,int>> p;
+ std::vector<std::tuple<std::string,int>> p;
/* More than 1 melee skill ? */
if (get_melee_skills() > 1)
@@ -817,16 +910,16 @@ static int do_cmd_activate_skill_aux()
p.push_back(std::make_tuple("Change melee mode", 0));
}
- for (size_t i = 1; i < max_s_idx; i++)
+ for (size_t i = 1; i < s_descriptors.size(); i++)
{
- if (s_info[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN)))
+ if (s_descriptors[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN)))
{
bool_ next = FALSE;
/* Already got it ? */
for (size_t j = 0; j < p.size(); j++)
{
- if (s_info[i].action_mkey == std::get<1>(p[j]))
+ if (s_descriptors[i].action_mkey == std::get<1>(p[j]))
{
next = TRUE;
break;
@@ -834,14 +927,14 @@ static int do_cmd_activate_skill_aux()
}
if (next) continue;
- p.push_back(std::make_tuple(s_info[i].action_desc,
- s_info[i].action_mkey));
+ p.push_back(std::make_tuple(s_descriptors[i].action_desc,
+ s_descriptors[i].action_mkey));
}
}
- for (size_t i = 0; i < max_ab_idx; i++)
+ for (size_t i = 0; i < ab_info.size(); i++)
{
- if (ab_info[i].action_mkey && ab_info[i].acquired)
+ if (ab_info[i].action_mkey && p_ptr->has_ability(i))
{
bool_ next = FALSE;
@@ -912,8 +1005,10 @@ static int do_cmd_activate_skill_aux()
size_t i = 0;
for (; i < p.size(); i++)
{
- if (!strcmp(buf, std::get<0>(p[i])))
+ if (std::get<0>(p[i]) == buf)
+ {
break;
+ }
}
if (i < p.size())
@@ -949,6 +1044,10 @@ static int do_cmd_activate_skill_aux()
/* Ask & execute a skill */
void do_cmd_activate_skill()
{
+ auto const &ab_info = game->edit_data.ab_info;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto const &s_info = game->s_info;
+
int x_idx;
bool_ push = TRUE;
@@ -957,26 +1056,34 @@ void do_cmd_activate_skill()
{
push = FALSE;
}
- else if (!command_arg) x_idx = do_cmd_activate_skill_aux();
+ else if (!command_arg)
+ {
+ x_idx = do_cmd_activate_skill_aux();
+ }
else
{
- int i, j;
-
x_idx = command_arg;
/* Check validity */
- for (i = 1; i < max_s_idx; i++)
+ std::size_t i;
+ for (i = 1; i < s_descriptors.size(); i++)
{
- if (s_info[i].value && (s_info[i].action_mkey == x_idx))
+ if (s_info[i].value && (s_descriptors[i].action_mkey == x_idx))
+ {
break;
+ }
}
- for (j = 0; j < max_ab_idx; j++)
+
+ std::size_t j;
+ for (j = 0; j < ab_info.size(); j++)
{
- if (ab_info[j].acquired && (ab_info[j].action_mkey == x_idx))
+ if (p_ptr->has_ability(j) && (ab_info[j].action_mkey == x_idx))
+ {
break;
+ }
}
- if ((j == max_ab_idx) && (i == max_s_idx))
+ if ((j == ab_info.size()) && (i == s_descriptors.size()))
{
msg_print("Uh?");
return;
@@ -1017,9 +1124,6 @@ void do_cmd_activate_skill()
case MKEY_POWER_MAGE:
do_cmd_powermage();
break;
- case MKEY_RUNE:
- do_cmd_runecrafter();
- break;
case MKEY_FORGING:
do_cmd_archer();
break;
@@ -1035,9 +1139,6 @@ void do_cmd_activate_skill()
case MKEY_SYMBIOTIC:
do_cmd_symbiotic();
break;
- case MKEY_TRAP:
- do_cmd_set_trap();
- break;
case MKEY_STEAL:
do_cmd_steal();
break;
@@ -1114,7 +1215,7 @@ void do_cmd_activate_skill()
int dir, dy, dx, targetx, targety, max_blows, flags;
o_ptr = get_object(INVEN_WIELD);
- if (o_ptr->tval == TV_POLEARM)
+ if (o_ptr->tval != TV_POLEARM)
{
msg_print("You will need a long polearm for this!");
return;
@@ -1179,76 +1280,47 @@ bool_ forbid_non_blessed()
/*
- * Gets the base value of a skill, given a race/class/...
+ * Augment skill value/modifier with the given skill_modifiers
*/
-void compute_skills(s32b *v, s32b *m, int i)
+static void augment_skills(s32b *v, s32b *m, std::vector<skill_modifier> const &modifiers, std::size_t i)
{
- s32b value, mod;
-
- /***** general skills *****/
-
- /* If the skill correspond to the magic school lets pump them a bit */
- value = gen_skill_base[i];
- mod = gen_skill_mod[i];
-
- *v = modify_aux(*v,
- value, gen_skill_basem[i]);
- *m = modify_aux(*m,
- mod, gen_skill_modm[i]);
-
- /***** race skills *****/
-
- value = rp_ptr->skill_base[i];
- mod = rp_ptr->skill_mod[i];
-
- *v = modify_aux(*v,
- value, rp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, rp_ptr->skill_modm[i]);
-
- /***** race mod skills *****/
-
- value = rmp_ptr->skill_base[i];
- mod = rmp_ptr->skill_mod[i];
-
- *v = modify_aux(*v,
- value, rmp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, rmp_ptr->skill_modm[i]);
-
- /***** class skills *****/
-
- value = cp_ptr->skill_base[i];
- mod = cp_ptr->skill_mod[i];
-
- *v = modify_aux(*v,
- value, cp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, cp_ptr->skill_modm[i]);
+ if (i < modifiers.size()) // Ignore if the skill has no modifiers.
+ {
+ auto const &s = modifiers[i];
+ *v = modify_aux(*v, s.base, s.basem);
+ *m = modify_aux(*m, s.mod, s.modm);
+ }
+}
- /***** class spec skills *****/
- value = spp_ptr->skill_base[i];
- mod = spp_ptr->skill_mod[i];
+/*
+ * Gets the base value of a skill, given a race/class/...
+ */
+void compute_skills(s32b *v, s32b *m, std::size_t i)
+{
+ auto const &gen_skill = game->edit_data.gen_skill;
- *v = modify_aux(*v,
- value, spp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, spp_ptr->skill_modm[i]);
+ augment_skills(v, m, gen_skill.modifiers, i);
+ augment_skills(v, m, rp_ptr->skill_modifiers.modifiers, i);
+ augment_skills(v, m, rmp_ptr->skill_modifiers.modifiers, i);
+ augment_skills(v, m, cp_ptr->skill_modifiers.modifiers, i);
+ augment_skills(v, m, spp_ptr->skill_modifiers.modifiers, i);
}
/*
* Initialize a skill with given values
*/
-void init_skill(s32b value, s32b mod, int i)
+void init_skill(s32b value, s32b mod, std::size_t i)
{
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto &s_info = game->s_info;
+
s_info[i].value = value;
s_info[i].mod = mod;
-
- if (s_info[i].flags1 & SKF1_HIDDEN)
- s_info[i].hidden = TRUE;
- else
- s_info[i].hidden = FALSE;
+ s_info[i].hidden = (s_descriptors[i].flags & SKF_HIDDEN)
+ ? true
+ : false
+ ;
}
/*
@@ -1310,39 +1382,42 @@ static std::vector<size_t> wrs(const std::vector<s32b> &unscaled_weights)
void do_get_new_skill()
{
- std::vector<std::string> items;
- int skl[LOST_SWORD_NSKILLS];
- s32b val[LOST_SWORD_NSKILLS], mod[LOST_SWORD_NSKILLS];
- int available_skills[MAX_SKILLS];
- int max_a = 0, res, i;
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto &s_info = game->s_info;
/* Check if some skills didn't influence other stuff */
recalc_skills(TRUE);
/* Grab the ones we can gain */
- max_a = 0;
- for (i = 0; i < max_s_idx; i++)
+ std::vector<size_t> available_skills;
+ available_skills.reserve(s_descriptors.size());
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
- if (s_info[i].flags1 & SKF1_RANDOM_GAIN) {
- available_skills[max_a] = i;
- max_a++;
+ if (s_descriptors[i].flags & SKF_RANDOM_GAIN)
+ {
+ available_skills.push_back(i);
}
}
/* Perform the selection */
std::vector<s32b> weights;
- for (i = 0; i < max_a; i++) {
- weights.push_back(s_info[available_skills[i]].random_gain_chance);
+ for (std::size_t i = 0; i < available_skills.size(); i++)
+ {
+ weights.push_back(s_descriptors[available_skills[i]].random_gain_chance);
}
std::vector<size_t> indexes = wrs(weights);
assert(indexes.size() >= LOST_SWORD_NSKILLS);
/* Extract the information needed from the skills */
- for (i = 0; i < LOST_SWORD_NSKILLS; i++)
+ int skl[LOST_SWORD_NSKILLS];
+ s32b val[LOST_SWORD_NSKILLS];
+ s32b mod[LOST_SWORD_NSKILLS];
+ std::vector<std::string> items;
+ for (std::size_t i = 0; i < LOST_SWORD_NSKILLS; i++)
{
s32b s_idx = available_skills[indexes[i]];
- skill_type *s_ptr = &s_info[s_idx];
+ auto s_ptr = &s_info[s_idx];
if (s_ptr->mod)
{
@@ -1356,7 +1431,9 @@ void do_get_new_skill()
val[i] = s_ptr->mod * 1;
mod[i] = 100;
if (mod[i] + s_ptr->mod > 500)
+ {
mod[i] = 500 - s_ptr->mod;
+ }
}
else
{
@@ -1370,42 +1447,56 @@ void do_get_new_skill()
val[i] = 1000;
}
- if (s_ptr->value + val[i] > SKILL_MAX) {
+ if (s_ptr->value + val[i] > SKILL_MAX)
+ {
val[i] = SKILL_MAX - s_ptr->value;
}
skl[i] = s_idx;
items.push_back(format("%-40s: +%02ld.%03ld value, +%01d.%03d modifier",
- s_ptr->name,
+ s_descriptors[s_idx].name.c_str(),
val[i] / SKILL_STEP,
val[i] % SKILL_STEP,
mod[i] / SKILL_STEP,
mod[i] % SKILL_STEP));
}
+ // Ask for a skill
while (TRUE)
{
char last = 'a' + (LOST_SWORD_NSKILLS-1);
char buf[80];
- sprintf(buf, "Choose a skill to learn(a-%c to choose, ESC to cancel)?", last);
- res = ask_menu(buf, items);
+ sprintf(buf, "Choose a skill to learn (a-%c to choose, ESC to cancel)?", last);
+ int res = ask_menu(buf, items);
/* Ok ? lets learn ! */
if (res > -1)
{
- skill_type *s_ptr;
+ std::size_t chosen_skill = skl[res];
+
bool_ oppose = FALSE;
int oppose_skill = -1;
- /* Check we don't oppose an existing skill */
- for (i = 0; i < max_s_idx; i++)
+ /* Check we don't oppose a skill the player already has */
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
- if ((s_info[i].action[skl[res]] == SKILL_EXCLUSIVE) &&
- (s_info[i].value != 0))
+ auto const &s_descriptor = s_descriptors[i];
+
+ // Only bother if player has skill
+ if (s_info[i].value)
{
- oppose = TRUE;
- oppose_skill = i;
- break;
+ // Check if i'th skill opposes the chosen one.
+ auto found = std::find(
+ s_descriptor.excludes.begin(),
+ s_descriptor.excludes.end(),
+ chosen_skill);
+
+ if (found != s_descriptor.excludes.end())
+ {
+ oppose = TRUE;
+ oppose_skill = i;
+ break;
+ }
}
}
@@ -1423,25 +1514,32 @@ void do_get_new_skill()
/* Prepare prompt */
msg = format("This skill is mutually exclusive with "
"at least %s, continue?",
- s_info[oppose_skill].name);
+ s_descriptors[oppose_skill].name.c_str());
- /* The player rejected the choice */
- if (!get_check(msg)) continue;
+ /* The player rejected the choice; go back to prompt */
+ if (!get_check(msg))
+ {
+ continue;
+ }
}
- s_ptr = &s_info[skl[res]];
+ auto const s_desc = &s_descriptors[chosen_skill];
+ auto const s_ptr = &s_info[chosen_skill];
+
s_ptr->value += val[res];
s_ptr->mod += mod[res];
+
if (mod[res])
{
msg_format("You can now learn the %s skill.",
- s_ptr->name);
+ s_desc->name.c_str());
}
else
{
msg_format("Your knowledge of the %s skill increases.",
- s_ptr->name);
+ s_desc->name.c_str());
}
+
break;
}
}
@@ -1461,12 +1559,13 @@ void do_get_new_skill()
*/
s16b find_ability(cptr name)
{
- u16b i;
+ auto const &ab_info = game->edit_data.ab_info;
- /* Scan ability list */
- for (i = 0; i < max_ab_idx; i++)
+ for (std::size_t i = 0; i < ab_info.size(); i++)
{
- if (ab_info[i].name && streq(ab_info[i].name, name))
+ auto const &ab_name = ab_info[i].name;
+
+ if ((!ab_name.empty()) && (ab_name == name))
{
return (i);
}
@@ -1476,51 +1575,40 @@ s16b find_ability(cptr name)
return ( -1);
}
-/*
- * Do the player have the ability
- */
-bool_ has_ability(int ab)
+/* Do we meet the requirements? */
+static bool can_learn_ability(int ab)
{
- return ab_info[ab].acquired;
-}
+ auto const &ab_info = game->edit_data.ab_info;
-/* Do we meet the requirements */
-static bool_ can_learn_ability(int ab)
-{
- ability_type *ab_ptr = &ab_info[ab];
- int i;
+ auto ab_ptr = &ab_info[ab];
- if (ab_ptr->acquired)
+ if (p_ptr->has_ability(ab))
+ {
return FALSE;
+ }
if (p_ptr->skill_points < ab_info[ab].cost)
+ {
return FALSE;
+ }
- for (i = 0; i < 10; i++)
+ for (auto const &need_skill: ab_ptr->need_skills)
{
- /* Must have skill level */
- if (ab_ptr->skills[i] > -1)
- {
- if (get_skill(ab_ptr->skills[i]) < ab_ptr->skill_levels[i])
- return FALSE;
- }
-
- /* Must have ability */
- if (ab_ptr->need_abilities[i] > -1)
+ if (get_skill(need_skill.skill_idx) < need_skill.level)
{
- if (!ab_info[ab_ptr->need_abilities[i]].acquired)
- return FALSE;
+ return FALSE;
}
+ }
- /* Must not have ability */
- if (ab_ptr->forbid_abilities[i] > -1)
+ for (auto const &need_ability: ab_ptr->need_abilities)
+ {
+ if (!p_ptr->has_ability(need_ability))
{
- if (ab_info[ab_ptr->forbid_abilities[i]].acquired)
- return FALSE;
+ return FALSE;
}
}
- for (i = 0; i < 6; i++)
+ for (std::size_t i = 0; i < 6; i++)
{
/* Must have stat */
if (ab_ptr->stat[i] > -1)
@@ -1536,12 +1624,11 @@ static bool_ can_learn_ability(int ab)
/* Learn an ability */
static void gain_ability(int ab)
{
- int wid, hgt;
- Term_get_size(&wid, &hgt);
+ auto const &ab_info = game->edit_data.ab_info;
if (!can_learn_ability(ab))
{
- msg_box("You cannot learn this ability.", hgt / 2, wid / 2);
+ msg_box_auto("You cannot learn this ability.");
return;
}
@@ -1549,18 +1636,20 @@ static void gain_ability(int ab)
flush();
/* Ask we can commit the change */
- if (msg_box("Learn this ability(this is permanent)? (y/n)", hgt / 2, wid / 2) != 'y')
+ if (msg_box_auto("Learn this ability (this is permanent)? (y/n)") != 'y')
{
return;
}
- ab_info[ab].acquired = TRUE;
+ p_ptr->gain_ability(ab);
p_ptr->skill_points -= ab_info[ab].cost;
}
-static bool compare_abilities(const int ab_idx1, const int ab_idx2)
+static bool compare_abilities(std::size_t ab_idx1, std::size_t ab_idx2)
{
- return strcmp(ab_info[ab_idx1].name, ab_info[ab_idx2].name) < 0;
+ auto const &ab_info = game->edit_data.ab_info;
+
+ return ab_info[ab_idx1].name < ab_info[ab_idx2].name;
}
/*
@@ -1568,13 +1657,13 @@ static bool compare_abilities(const int ab_idx1, const int ab_idx2)
*/
void dump_abilities(FILE *fff)
{
- int i;
+ auto const &ab_info = game->edit_data.ab_info;
// Find all abilities that the player has.
- std::vector<int> table;
- for (i = 0; i < max_ab_idx; i++)
+ std::vector<std::size_t> table;
+ for (std::size_t i = 0; i < ab_info.size(); i++)
{
- if (ab_info[i].name && has_ability(i))
+ if ((!ab_info[i].name.empty()) && p_ptr->has_ability(i))
{
table.push_back(i);
}
@@ -1592,7 +1681,7 @@ void dump_abilities(FILE *fff)
for (int i : table)
{
- fprintf(fff, "\n * %s", ab_info[i].name);
+ fprintf(fff, "\n * %s", ab_info[i].name.c_str());
}
fprintf(fff, "\n");
@@ -1602,8 +1691,10 @@ void dump_abilities(FILE *fff)
/*
* Draw the abilities list
*/
-static void print_abilities(const std::vector<int> &table, int sel, int start)
+static void print_abilities(const std::vector<std::size_t> &table, int sel, int start)
{
+ auto const &ab_info = game->edit_data.ab_info;
+
int i, j;
int wid, hgt;
cptr keys;
@@ -1617,7 +1708,7 @@ static void print_abilities(const std::vector<int> &table, int sel, int start)
c_prt((p_ptr->skill_points) ? TERM_L_BLUE : TERM_L_RED,
format("Skill points left: %d", p_ptr->skill_points), 2, 0);
- print_desc_aux(ab_info[table[sel]].desc, 3, 0);
+ print_desc_aux(ab_info[table[sel]].desc.c_str(), 3, 0);
for (j = start; j < start + (hgt - 7); j++)
{
@@ -1632,12 +1723,18 @@ static void print_abilities(const std::vector<int> &table, int sel, int start)
i = table[j];
- if (ab_info[i].acquired)
+ if (p_ptr->has_ability(i))
+ {
color = TERM_L_BLUE;
+ }
else if (can_learn_ability(i))
+ {
color = TERM_WHITE;
+ }
else
+ {
color = TERM_L_DARK;
+ }
if (j == sel)
@@ -1647,10 +1744,10 @@ static void print_abilities(const std::vector<int> &table, int sel, int start)
end = ']';
}
- c_prt(color, format("%c.%c%s", deb, end, ab_info[i].name),
+ c_prt(color, format("%c.%c%s", deb, end, ab_info[i].name.c_str()),
j + 7 - start, 0);
- if (!ab_info[i].acquired)
+ if (!p_ptr->has_ability(i))
{
c_prt(color, format("%d", ab_info[i].cost), j + 7 - start, 60);
}
@@ -1662,13 +1759,14 @@ static void print_abilities(const std::vector<int> &table, int sel, int start)
}
/*
- * Interreact with abilitiess
+ * Interreact with abilities
*/
void do_cmd_ability()
{
+ auto const &ab_info = game->edit_data.ab_info;
+
int sel = 0, start = 0;
char c;
- int i;
int wid, hgt;
/* Save the screen */
@@ -1678,10 +1776,10 @@ void do_cmd_ability()
Term_clear();
/* Initialise the abilities list */
- std::vector<int> table;
- for (i = 0; i < max_ab_idx; i++)
+ std::vector<std::size_t> table;
+ for (std::size_t i = 0; i < ab_info.size(); i++)
{
- if (ab_info[i].name)
+ if (!ab_info[i].name.empty())
{
table.push_back(i);
}
@@ -1742,10 +1840,16 @@ void do_cmd_ability()
/* gain ability */
if (dir == 6) gain_ability(table[sel]);
- /* XXX XXX XXX Wizard mode commands outside of wizard2.c */
+ /* Wizard mode allows any ability */
+ if (wizard && (c == '+'))
+ {
+ p_ptr->gain_ability(table[sel]);
+ }
- if (wizard && (c == '+')) ab_info[table[sel]].acquired = TRUE;
- if (wizard && (c == '-')) ab_info[table[sel]].acquired = FALSE;
+ if (wizard && (c == '-'))
+ {
+ p_ptr->lose_ability(table[sel]);
+ }
/* Contextual help */
if (c == '?')
@@ -1789,41 +1893,26 @@ void do_cmd_ability()
*/
void apply_level_abilities(int level)
{
- int i;
-
- for (i = 0; i < 10; i++)
+ auto apply = [level](std::vector<player_race_ability_type> const &abilities) -> void
{
- if (cp_ptr->abilities[i].level == level)
- {
- if ((level > 1) && (!ab_info[cp_ptr->abilities[i].ability].acquired))
- {
- cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[cp_ptr->abilities[i].ability].name);
- }
- ab_info[cp_ptr->abilities[i].ability].acquired = TRUE;
- }
- if (spp_ptr->abilities[i].level == level)
- {
- if ((level > 1) && (!ab_info[spp_ptr->abilities[i].ability].acquired))
- {
- cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[spp_ptr->abilities[i].ability].name);
- }
- ab_info[spp_ptr->abilities[i].ability].acquired = TRUE;
- }
- if (rp_ptr->abilities[i].level == level)
- {
- if ((level > 1) && (!ab_info[rp_ptr->abilities[i].ability].acquired))
- {
- cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[rp_ptr->abilities[i].ability].name);
- }
- ab_info[rp_ptr->abilities[i].ability].acquired = TRUE;
- }
- if (rmp_ptr->abilities[i].level == level)
+ auto const &ab_info = game->edit_data.ab_info;
+
+ for (auto const &a: abilities)
{
- if ((level > 1) && (!ab_info[rmp_ptr->abilities[i].ability].acquired))
+ if (a.level == level)
{
- cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[rmp_ptr->abilities[i].ability].name);
+ if ((level > 1) && (!p_ptr->has_ability(a.ability)))
+ {
+ cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[a.ability].name.c_str());
+ }
+
+ p_ptr->gain_ability(a.ability);
}
- ab_info[rmp_ptr->abilities[i].ability].acquired = TRUE;
}
- }
+ };
+
+ apply(cp_ptr->abilities);
+ apply(spp_ptr->abilities);
+ apply(rp_ptr->abilities);
+ apply(rmp_ptr->abilities);
}
diff --git a/src/skills.hpp b/src/skills.hpp
index 6c1880a6..8b1437d9 100644
--- a/src/skills.hpp
+++ b/src/skills.hpp
@@ -2,26 +2,27 @@
#include "h-basic.h"
+#include <cstddef>
+
/* Skill functions */
-extern void dump_skills(FILE *fff);
-extern s16b find_skill(cptr name);
-extern s16b find_skill_i(cptr name);
-extern s16b get_skill(int skill);
-extern s16b get_skill_scale(int skill, u32b scale);
-extern void do_cmd_skill(void);
-extern void do_cmd_activate_skill(void);
-extern cptr get_melee_name();
-extern s16b get_melee_skills(void);
-extern s16b get_melee_skill(void);
-extern bool_ forbid_gloves(void);
-extern bool_ forbid_non_blessed(void);
-extern void compute_skills(s32b *v, s32b *m, int i);
-extern void select_default_melee(void);
-extern void do_get_new_skill(void);
-extern void init_skill(s32b value, s32b mod, int i);
-extern s16b find_ability(cptr name);
-extern void dump_abilities(FILE *fff);
-extern void do_cmd_ability(void);
-extern bool_ has_ability(int ab);
-extern void apply_level_abilities(int level);
-extern void recalc_skills(bool_ init);
+void dump_skills(FILE *fff);
+s16b find_skill(cptr name);
+s16b find_skill_i(cptr name);
+s16b get_skill(int skill);
+s16b get_skill_scale(int skill, u32b scale);
+void do_cmd_skill();
+void do_cmd_activate_skill();
+cptr get_melee_name();
+s16b get_melee_skills();
+s16b get_melee_skill();
+bool_ forbid_gloves();
+bool_ forbid_non_blessed();
+void compute_skills(s32b *v, s32b *m, std::size_t i);
+void select_default_melee();
+void do_get_new_skill();
+void init_skill(s32b value, s32b mod, std::size_t i);
+s16b find_ability(cptr name);
+void dump_abilities(FILE *fff);
+void do_cmd_ability();
+void apply_level_abilities(int level);
+void recalc_skills(bool_ init);
diff --git a/src/skills_defs.hpp b/src/skills_defs.hpp
index 1dbdee9f..9bf3c9ce 100644
--- a/src/skills_defs.hpp
+++ b/src/skills_defs.hpp
@@ -36,10 +36,9 @@
#define SKILL_NECROMANCY 31
#define SKILL_MIMICRY 32
#define SKILL_ANTIMAGIC 33
-#define SKILL_RUNECRAFT 34
-#define SKILL_SNEAK 35
+/* XXX */
#define SKILL_STEALTH 36
-#define SKILL_DISARMING 37
+/* XXX */
#define SKILL_STEALING 40
#define SKILL_SORCERY 41
#define SKILL_HAND 42
@@ -60,4 +59,3 @@
#define SKILL_STUN 57
#define SKILL_BOULDER 58
#define SKILL_GEOMANCY 59
-#define MAX_SKILLS 200
diff --git a/src/spellbinder.hpp b/src/spellbinder.hpp
new file mode 100644
index 00000000..078d9eac
--- /dev/null
+++ b/src/spellbinder.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+#include "h-basic.h"
+#include <vector>
+
+/**
+ * Spellbinder state
+ */
+struct spellbinder {
+
+ /**
+ * Bound spells.
+ */
+ std::vector<u32b> spell_idxs;
+
+ /**
+ * Trigger condition.
+ */
+ byte trigger = 0;
+
+};
diff --git a/src/spells1.cc b/src/spells1.cc
index 5d6722af..4df1a7c6 100644
--- a/src/spells1.cc
+++ b/src/spells1.cc
@@ -13,17 +13,23 @@
#include "cmd1.hpp"
#include "cmd3.hpp"
#include "cmd5.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
#include "files.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "melee2.hpp"
#include "monster2.hpp"
#include "monster3.hpp"
-#include "monster_type.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
+#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_type.hpp"
@@ -35,8 +41,6 @@
#include "squeltch.hpp"
#include "stats.hpp"
#include "tables.hpp"
-#include "traps.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.hpp"
@@ -46,6 +50,7 @@
#include "z-rand.hpp"
#include <chrono>
+#include <fmt/format.h>
#include <thread>
using std::this_thread::sleep_for;
@@ -86,12 +91,14 @@ using std::chrono::milliseconds;
*/
s16b poly_r_idx(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
int i, r;
/* Hack -- Uniques never polymorph */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
return (r_idx);
/* Pick a (possibly new) non-unique race */
@@ -107,7 +114,7 @@ s16b poly_r_idx(int r_idx)
r_ptr = &r_info[r];
/* Ignore unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) continue;
+ if (r_ptr->flags & RF_UNIQUE) continue;
/* Use that index */
r_idx = r;
@@ -215,9 +222,6 @@ void teleport_player_directed(int rad, int dir)
}
- /* Sound */
- sound(SOUND_TELEPORT);
-
/* Move player */
teleport_player_to(y, x);
@@ -230,7 +234,7 @@ void teleport_player_directed(int rad, int dir)
if (c_ptr->feat == FEAT_SHOP)
{
/* Disturb */
- disturb(0);
+ disturb();
/* Hack -- enter store */
command_new = '_';
@@ -325,9 +329,6 @@ void teleport_away(int m_idx, int dis)
if (tries > MAX_TRIES) return;
}
- /* Sound */
- sound(SOUND_TPOTHER);
-
/* Update the new location */
cave[ny][nx].m_idx = m_idx;
last_teleportation_y = ny;
@@ -351,7 +352,7 @@ void teleport_away(int m_idx, int dis)
/* Update monster light */
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags9 & RF9_HAS_LITE)
+ if (r_ptr->flags & RF_HAS_LITE)
{
p_ptr->update |= (PU_MON_LITE);
}
@@ -444,9 +445,6 @@ static void teleport_to_player(int m_idx)
if (attempts < 1) return;
- /* Sound */
- sound(SOUND_TPOTHER);
-
/* Update the new location */
cave[ny][nx].m_idx = m_idx;
last_teleportation_y = ny;
@@ -469,7 +467,7 @@ static void teleport_to_player(int m_idx)
lite_spot(ny, nx);
/* Update monster light */
- if (r_ptr->flags9 & RF9_HAS_LITE) p_ptr->update |= (PU_MON_LITE);
+ if (r_ptr->flags & RF_HAS_LITE) p_ptr->update |= (PU_MON_LITE);
}
@@ -508,7 +506,7 @@ void teleport_player(int dis)
return;
}
- if ((dungeon_flags2 & DF2_NO_TELEPORT) && (!teleport_player_bypass))
+ if ((dungeon_flags & DF_NO_TELEPORT) && (!teleport_player_bypass))
{
msg_print("No teleport on special levels...");
return;
@@ -566,9 +564,6 @@ void teleport_player(int dis)
if (tries > MAX_TRIES) return;
}
- /* Sound */
- sound(SOUND_TELEPORT);
-
/* Save the old location */
oy = p_ptr->py;
ox = p_ptr->px;
@@ -598,7 +593,7 @@ void teleport_player(int dis)
{
auto const r_ptr = m_list[cave[oy + yy][ox + xx].m_idx].race();
- if ((r_ptr->flags6 & RF6_TPORT) && !(r_ptr->flags3 & RF3_RES_TELE))
+ if ((r_ptr->spells & SF_TPORT) && !(r_ptr->flags & RF_RES_TELE))
/*
* The latter limitation is to avoid
* totally unkillable suckers...
@@ -626,8 +621,6 @@ void teleport_player(int dis)
/* Update the monsters */
p_ptr->update |= (PU_DISTANCE);
- /* Redraw trap detection status */
- p_ptr->redraw |= (PR_FRAME);
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD);
@@ -749,9 +742,6 @@ void teleport_monster_to(int m_idx, int ny, int nx)
}
}
- /* Sound */
- sound(SOUND_TPOTHER);
-
/* Save the old position */
oy = m_ptr->fy;
ox = m_ptr->fx;
@@ -797,7 +787,7 @@ void teleport_player_to(int ny, int nx)
return;
}
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels...");
return;
@@ -828,9 +818,6 @@ void teleport_player_to(int ny, int nx)
}
}
- /* Sound */
- sound(SOUND_TELEPORT);
-
/* Save the old location */
oy = p_ptr->py;
ox = p_ptr->px;
@@ -856,9 +843,6 @@ void teleport_player_to(int ny, int nx)
/* Update the monsters */
p_ptr->update |= (PU_DISTANCE);
- /* Redraw trap detection status */
- p_ptr->redraw |= (PR_FRAME);
-
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD);
@@ -871,7 +855,7 @@ void teleport_player_to(int ny, int nx)
/*
* Teleport the player one level up or down (random when legal)
*/
-void teleport_player_level(void)
+void teleport_player_level()
{
/* No effect in arena or quest */
if (p_ptr->inside_quest)
@@ -879,14 +863,14 @@ void teleport_player_level(void)
msg_print("There is no effect.");
return;
}
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("No teleport on special levels...");
return;
}
- if (dungeon_flags2 & DF2_NO_EASY_MOVE)
+ if (dungeon_flags & DF_NO_EASY_MOVE)
{
- msg_print("Some powerfull force prevents your from teleporting.");
+ msg_print("Some powerful force prevents your from teleporting.");
return;
}
@@ -956,9 +940,6 @@ void teleport_player_level(void)
/* Leaving */
p_ptr->leaving = TRUE;
}
-
- /* Sound */
- sound(SOUND_TPLEVEL);
}
@@ -1219,16 +1200,18 @@ static u16b bolt_pict(int y, int x, int ny, int nx, int typ)
*/
void spellbinder_trigger()
{
- int i;
+ auto spellbinder = &p_ptr->spellbinder;
cmsg_print(TERM_L_GREEN, "The spellbinder is triggered!");
- for (i = 0; i < p_ptr->spellbinder_num; i++)
+
+ for (auto spell_idx: spellbinder->spell_idxs)
{
- msg_format("Triggering spell %s.", spell_type_name(spell_at(p_ptr->spellbinder[i])));
- lua_cast_school_spell(p_ptr->spellbinder[i], TRUE);
+ msg_format("Triggering spell %s.", spell_type_name(spell_at(spell_idx)));
+ lua_cast_school_spell(spell_idx, TRUE);
}
- p_ptr->spellbinder_num = 0;
- p_ptr->spellbinder_trigger = 0;
+
+ spellbinder->spell_idxs.clear();
+ spellbinder->trigger = 0;
}
@@ -1251,14 +1234,14 @@ void take_hit(int damage, cptr hit_from)
char death_message[80];
- int warning = (p_ptr->mhp * hitpoint_warn / 10);
+ int warning = (p_ptr->mhp * options->hitpoint_warn / 10);
int percent;
/* Paranoia */
if (death) return;
/* Disturb */
- disturb(1);
+ disturb();
/* Apply "invulnerability" */
if (p_ptr->invuln && (damage < 9000))
@@ -1295,13 +1278,13 @@ void take_hit(int damage, cptr hit_from)
/* Hurt the wielded monster if any */
if ((o_ptr->k_idx) && (magik(5 + get_skill(SKILL_SYMBIOTIC))) && (!carried_monster_hit))
{
- cptr sym_name = symbiote_name(TRUE);
+ auto sym_name = symbiote_name(true);
if (o_ptr->pval2 - damage <= 0)
{
cmsg_format(TERM_L_RED,
"%s dies from protecting you, you feel very sad...",
- sym_name);
+ sym_name.c_str());
inc_stack_size_ex(INVEN_CARRY, -1, OPTIMIZE, NO_DESCRIBE);
damage -= o_ptr->pval2;
o_ptr->pval2 = 0;
@@ -1309,7 +1292,7 @@ void take_hit(int damage, cptr hit_from)
}
else
{
- msg_format("%s takes the damage instead of you.", sym_name);
+ msg_format("%s takes the damage instead of you.", sym_name.c_str());
o_ptr->pval2 -= damage;
monster_take = TRUE;
}
@@ -1336,27 +1319,26 @@ void take_hit(int damage, cptr hit_from)
if (p_ptr->chp < 0)
{
/* Necromancers get a special treatment */
- if (((!has_ability(AB_UNDEAD_FORM)) || ((p_ptr->necro_extra & CLASS_UNDEAD))))
+ if (((!p_ptr->has_ability(AB_UNDEAD_FORM)) || ((p_ptr->necro_extra & CLASS_UNDEAD))))
{
- /* Sound */
- sound(SOUND_DEATH);
-
/* Hack -- Note death */
- if (!last_words)
+ if (!options->last_words)
{
cmsg_print(TERM_RED, "You die.");
msg_print(NULL);
}
else
{
- (void)get_rnd_line("death.txt", death_message);
+ get_rnd_line("death.txt", death_message);
cmsg_print(TERM_RED, death_message);
}
/* Note cause of death */
- (void)strcpy(died_from, hit_from);
-
- if (p_ptr->image) strcat(died_from, "(?)");
+ game->died_from = hit_from;
+ if (p_ptr->image)
+ {
+ game->died_from = "(?)";
+ }
/* Leaving */
p_ptr->leaving = TRUE;
@@ -1405,9 +1387,10 @@ void take_hit(int damage, cptr hit_from)
if (p_ptr->chp < warning)
{
/* Hack -- bell on first notice */
- if (alert_hitpoint && (old_chp > warning)) bell();
-
- sound(SOUND_WARN);
+ if (old_chp > warning)
+ {
+ bell();
+ }
/* Message */
if (p_ptr->necro_extra & CLASS_UNDEAD)
@@ -1421,23 +1404,28 @@ void take_hit(int damage, cptr hit_from)
percent = p_ptr->chp * 100 / p_ptr->mhp;
/* Check the spellbinder trigger */
- if (p_ptr->spellbinder_trigger == SPELLBINDER_HP75)
- {
- /* Trigger ?! */
- if (percent <= 75)
- spellbinder_trigger();
- }
- else if (p_ptr->spellbinder_trigger == SPELLBINDER_HP50)
+ switch (p_ptr->spellbinder.trigger)
{
- /* Trigger ?! */
- if (percent <= 50)
- spellbinder_trigger();
- }
- else if (p_ptr->spellbinder_trigger == SPELLBINDER_HP25)
- {
- /* Trigger ?! */
- if (percent <= 25)
- spellbinder_trigger();
+ case SPELLBINDER_HP75:
+ if (percent <= 75)
+ {
+ spellbinder_trigger();
+ }
+ break;
+
+ case SPELLBINDER_HP50:
+ if (percent <= 50)
+ {
+ spellbinder_trigger();
+ }
+ break;
+
+ case SPELLBINDER_HP25:
+ if (percent <= 25)
+ {
+ spellbinder_trigger();
+ }
+ break;
}
/* Melkor acn summon to help you */
@@ -1472,8 +1460,10 @@ void take_hit(int damage, cptr hit_from)
}
}
- if (player_char_health)
+ if (options->player_char_health)
+ {
lite_spot(p_ptr->py, p_ptr->px);
+ }
}
@@ -1484,14 +1474,14 @@ void take_sanity_hit(int damage, cptr hit_from)
char death_message[80];
- int warning = (p_ptr->msane * hitpoint_warn / 10);
+ int warning = (p_ptr->msane * options->hitpoint_warn / 10);
/* Paranoia */
if (death) return;
/* Disturb */
- disturb(1);
+ disturb();
/* Hurt the player */
@@ -1506,26 +1496,25 @@ void take_sanity_hit(int damage, cptr hit_from)
/* Dead player */
if (p_ptr->csane < 0)
{
- /* Sound */
- sound(SOUND_DEATH);
-
/* Hack -- Note death */
cmsg_print(TERM_VIOLET, "You turn into an unthinking vegetable.");
- if (!last_words)
+ if (!options->last_words)
{
cmsg_print(TERM_RED, "You die.");
msg_print(NULL);
}
else
{
- (void)get_rnd_line("death.txt", death_message);
+ get_rnd_line("death.txt", death_message);
cmsg_print(TERM_RED, death_message);
}
/* Note cause of death */
- (void)strcpy(died_from, hit_from);
-
- if (p_ptr->image) strcat(died_from, "(?)");
+ game->died_from = hit_from;
+ if (p_ptr->image)
+ {
+ game->died_from = "(?)";
+ }
/* Leaving */
p_ptr->leaving = TRUE;
@@ -1546,9 +1535,10 @@ void take_sanity_hit(int damage, cptr hit_from)
if (p_ptr->csane < warning)
{
/* Hack -- bell on first notice */
- if (alert_hitpoint && (old_csane > warning)) bell();
-
- sound(SOUND_WARN);
+ if (old_csane > warning)
+ {
+ bell();
+ }
/* Message */
cmsg_print(TERM_RED, "*** LOW SANITY WARNING! ***");
@@ -1727,12 +1717,10 @@ static bool_ hates_cold(object_type *o_ptr)
*/
static int set_acid_destroy(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
if (!hates_acid(o_ptr)) return (FALSE);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f3 & (TR3_IGNORE_ACID)) return (FALSE);
+ auto const f = object_flags(o_ptr);
+ if (f & TR_IGNORE_ACID) return (FALSE);
return (TRUE);
}
@@ -1742,12 +1730,10 @@ static int set_acid_destroy(object_type *o_ptr)
*/
static int set_elec_destroy(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
if (!hates_elec(o_ptr)) return (FALSE);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f3 & (TR3_IGNORE_ELEC)) return (FALSE);
+ auto const f = object_flags(o_ptr);
+ if (f & TR_IGNORE_ELEC) return (FALSE);
return (TRUE);
}
@@ -1757,12 +1743,10 @@ static int set_elec_destroy(object_type *o_ptr)
*/
static int set_fire_destroy(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
if (!hates_fire(o_ptr)) return (FALSE);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f3 & (TR3_IGNORE_FIRE)) return (FALSE);
+ auto const f = object_flags(o_ptr);
+ if (f & TR_IGNORE_FIRE) return (FALSE);
return (TRUE);
}
@@ -1772,12 +1756,10 @@ static int set_fire_destroy(object_type *o_ptr)
*/
static int set_cold_destroy(object_type *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
-
if (!hates_cold(o_ptr)) return (FALSE);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f3 & (TR3_IGNORE_COLD)) return (FALSE);
+ auto const f = object_flags(o_ptr);
+ if (f & (TR_IGNORE_COLD)) return (FALSE);
return (TRUE);
}
@@ -1797,6 +1779,8 @@ typedef int (*inven_func)(object_type *);
*/
static int inven_damage(inven_func typ, int perc)
{
+ auto const &k_info = game->edit_data.k_info;
+
int i, j, k, amt;
object_type *o_ptr;
@@ -1816,7 +1800,7 @@ static int inven_damage(inven_func typ, int perc)
if (!o_ptr->k_idx) continue;
/* Hack -- for now, skip artifacts */
- if (artifact_p(o_ptr) || o_ptr->art_name) continue;
+ if (artifact_p(o_ptr)) continue;
/* Give this item slot a shot at death */
if ((*typ)(o_ptr))
@@ -1843,8 +1827,8 @@ static int inven_damage(inven_func typ, int perc)
/* Potions smash open */
if (k_info[o_ptr->k_idx].tval == TV_POTION)
- {
- (void)potion_smash_effect(0, p_ptr->py, p_ptr->px, o_ptr->sval);
+ {
+ potion_smash_effect(0, p_ptr->py, p_ptr->px, o_ptr->sval);
}
/*
@@ -1881,12 +1865,10 @@ static int inven_damage(inven_func typ, int perc)
*
* If any armor is damaged (or resists), the player takes less damage.
*/
-static int minus_ac(void)
+static int minus_ac()
{
object_type *o_ptr = NULL;
- u32b f1, f2, f3, f4, f5, esp;
-
char o_name[80];
@@ -1924,10 +1906,10 @@ static int minus_ac(void)
object_desc(o_name, o_ptr, FALSE, 0);
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Object resists */
- if (f3 & (TR3_IGNORE_ACID))
+ if (flags & TR_IGNORE_ACID)
{
msg_format("Your %s is unaffected!", o_name);
@@ -1967,7 +1949,7 @@ void acid_dam(int dam, cptr kb_str)
if ((!(p_ptr->oppose_acid || p_ptr->resist_acid)) &&
randint(HURT_CHANCE) == 1)
- (void) do_dec_stat(A_CHR, STAT_DEC_NORMAL);
+ do_dec_stat(A_CHR, STAT_DEC_NORMAL);
/* If any armor gets hit, defend the player */
if (minus_ac()) dam = (dam + 1) / 2;
@@ -1997,7 +1979,7 @@ void elec_dam(int dam, cptr kb_str)
if ((!(p_ptr->oppose_elec || p_ptr->resist_elec)) &&
randint(HURT_CHANCE) == 1)
- (void) do_dec_stat(A_DEX, STAT_DEC_NORMAL);
+ do_dec_stat(A_DEX, STAT_DEC_NORMAL);
/* Take damage */
take_hit(dam, kb_str);
@@ -2027,7 +2009,7 @@ void fire_dam(int dam, cptr kb_str)
if ((!(p_ptr->oppose_fire || p_ptr->resist_fire)) &&
randint(HURT_CHANCE) == 1)
- (void) do_dec_stat(A_STR, STAT_DEC_NORMAL);
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
/* Take damage */
@@ -2055,7 +2037,7 @@ void cold_dam(int dam, cptr kb_str)
if ((!(p_ptr->oppose_cold || p_ptr->resist_cold)) &&
randint(HURT_CHANCE) == 1)
- (void) do_dec_stat(A_STR, STAT_DEC_NORMAL);
+ do_dec_stat(A_STR, STAT_DEC_NORMAL);
/* Take damage */
take_hit(dam, kb_str);
@@ -2334,7 +2316,7 @@ bool_ apply_disenchant(int mode)
/* Artifacts have 71% chance to resist */
- if ((artifact_p(o_ptr) || o_ptr->art_name) && (rand_int(100) < 71))
+ if (artifact_p(o_ptr) && (rand_int(100) < 71))
{
/* Message */
msg_format("Your %s (%c) resist%s disenchantment!",
@@ -2374,7 +2356,7 @@ bool_ apply_disenchant(int mode)
}
-void corrupt_player(void)
+void corrupt_player()
{
int max1, cur1, max2, cur2, ii, jj;
@@ -2403,7 +2385,7 @@ static void apply_nexus(monster_type *m_ptr)
{
if (m_ptr == NULL) return;
- if (!(dungeon_flags2 & DF2_NO_TELEPORT))
+ if (!(dungeon_flags & DF_NO_TELEPORT))
{
switch (randint(7))
{
@@ -2924,6 +2906,7 @@ static int project_m_y;
static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
{
cave_type *c_ptr = &cave[y][x];
+ auto const &f_info = game->edit_data.f_info;
bool_ obvious = FALSE;
@@ -2993,12 +2976,12 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
* the conditional... -- pelpel
*/
if (!cave_plain_floor_bold(y, x) ||
- (f_info[cave[y][x].feat].flags1 & FF1_PERMANENT)) break;
+ (f_info[cave[y][x].feat].flags & FF_PERMANENT)) break;
/* Destination shouldn't be "interesting" either */
while (tries &&
(!cave_plain_floor_bold(y2, x2) ||
- (f_info[cave[y2][x2].feat].flags1 & FF1_PERMANENT)))
+ (f_info[cave[y2][x2].feat].flags & FF_PERMANENT)))
{
y2 = y1 = randint(cur_hgt) - 1;
x2 = x1 = randint(cur_wid) - 1;
@@ -3039,7 +3022,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
case GF_HELL_FIRE:
{
/* "Permanent" features will stay */
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
/* Trees *will* burn */
if (c_ptr->feat == FEAT_TREES)
@@ -3078,7 +3061,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
}
/* Floors can become ash or lava (chance == 25%) */
- else if (f_info[c_ptr->feat].flags1 & FF1_FLOOR)
+ else if (f_info[c_ptr->feat].flags & FF_FLOOR)
{
int k = rand_int(100);
@@ -3125,7 +3108,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
int k;
/* "Permanent" features will stay */
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
/* Needs more than 30 damage */
if (dam < 30) break;
@@ -3194,7 +3177,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
case GF_NUKE:
{
/* "Permanent" features will stay */
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
if ((c_ptr->feat == FEAT_TREES) ||
(c_ptr->feat == FEAT_SMALL_TREES))
@@ -3214,11 +3197,11 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
case GF_DISINTEGRATE:
{
/* "Permanent" features will stay */
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
if (((c_ptr->feat == FEAT_TREES) ||
(c_ptr->feat == FEAT_SMALL_TREES) ||
- (f_info[c_ptr->feat].flags1 & FF1_FLOOR)) &&
+ (f_info[c_ptr->feat].flags & FF_FLOOR)) &&
(rand_int(100) < 30))
{
/* Flow change */
@@ -3239,71 +3222,12 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
break;
}
- /* Destroy Traps (and Locks) */
- case GF_KILL_TRAP:
- {
- /* Destroy normal traps and disarm monster traps */
- if ((c_ptr->t_idx != 0) || (c_ptr->feat == FEAT_MON_TRAP))
- {
- /* Check line of sight */
- if (player_has_los_bold(y, x))
- {
- msg_print("There is a bright flash of light!");
- obvious = TRUE;
- }
-
- /* Forget the trap */
- c_ptr->info &= ~(CAVE_MARK | CAVE_TRDT);
-
- /* Destroy normal traps */
- c_ptr->t_idx = 0;
-
- /* Disarm monster traps */
- if (c_ptr->feat == FEAT_MON_TRAP)
- {
- c_ptr->special = c_ptr->special2 = 0;
-
- /* Remove the feature */
- if (!(f_info[c_ptr->feat].flags1 & FF1_PERMANENT))
- place_floor_convert_glass(y, x);
- }
-
- /* Hack -- Force redraw */
- note_spot(y, x);
- lite_spot(y, x);
- }
-
- /* Secret / Locked doors are found and unlocked */
- else if ((c_ptr->feat == FEAT_SECRET) ||
- ((c_ptr->feat >= FEAT_DOOR_HEAD + 0x01) &&
- (c_ptr->feat <= FEAT_DOOR_HEAD + 0x07)))
- {
-
- /* Check line of sound */
- if (player_has_los_bold(y, x))
- {
- msg_print("Click!");
- obvious = TRUE;
- }
-
- /* Remove feature mimic */
- cave[y][x].mimic = 0;
-
- /* Unlock the door */
- cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00);
- }
-
- break;
- }
-
- /* Destroy Doors (and traps) */
+ /* Destroy Doors */
case GF_KILL_DOOR:
{
- /* Destroy all doors and traps, and disarm monster traps */
+ /* Destroy all doors */
if ((c_ptr->feat == FEAT_OPEN) ||
(c_ptr->feat == FEAT_BROKEN) ||
- (c_ptr->t_idx != 0) ||
- (c_ptr->feat == FEAT_MON_TRAP) ||
((c_ptr->feat >= FEAT_DOOR_HEAD) &&
(c_ptr->feat <= FEAT_DOOR_TAIL)))
{
@@ -3324,17 +3248,10 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
}
/* Forget the door */
- c_ptr->info &= ~(CAVE_MARK | CAVE_TRDT);
-
- /* Remove normal traps */
- c_ptr->t_idx = 0;
-
- /* Disarm monster traps */
- if (c_ptr->feat == FEAT_MON_TRAP)
- c_ptr->special = c_ptr->special2 = 0;
+ c_ptr->info &= ~(CAVE_MARK);
/* Remove the feature */
- if (!(f_info[c_ptr->feat].flags1 & FF1_PERMANENT))
+ if (!(f_info[c_ptr->feat].flags & FF_PERMANENT))
place_floor_convert_glass(y, x);
/* Hack -- Force redraw */
@@ -3375,7 +3292,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
if (cave_floor_bold(y, x)) break;
/* "Permanent" features will stay */
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
/* Granite -- How about other wall types? */
if ((c_ptr->feat >= FEAT_WALL_EXTRA) &&
@@ -3503,7 +3420,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
/* Require a "naked" floor grid */
if (!cave_clean_bold(y, x)) break;
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
/* Create a closed door */
cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00);
@@ -3517,25 +3434,12 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
break;
}
- /* Make traps */
- case GF_MAKE_TRAP:
- {
- /* Require a "naked" floor grid */
- if (!cave_clean_bold(y, x)) break;
-
- /* Place a trap */
- place_trap(y, x);
-
- break;
- }
-
-
case GF_MAKE_GLYPH:
{
/* Require a "naked" floor grid */
if (!cave_clean_bold(y, x)) break;
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
cave_set_feat(y, x, FEAT_GLYPH);
@@ -3551,8 +3455,8 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
/* Require a "naked" floor grid */
if (!cave_clean_bold(y, x)) break;
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
- if (!(f_info[c_ptr->feat].flags1 & FF1_FLOOR)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
+ if (!(f_info[c_ptr->feat].flags & FF_FLOOR)) break;
/* Place a wall */
cave_set_feat(y, x, FEAT_WALL_EXTRA);
@@ -3595,7 +3499,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
case GF_LAVA_FLOW:
{
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
/* Shallow Lava */
if (dam == 1)
@@ -3709,7 +3613,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
/* Delete the monster (if any) */
delete_monster(y, x);
- if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break;
+ if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break;
/* Destroy "valid" grids */
if (cave_valid_bold(y, x))
@@ -3788,7 +3692,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
if (!p_ptr->resist_blind && !p_ptr->resist_lite)
{
/* Become blind */
- (void)set_blind(p_ptr->blind + 10 + randint(10));
+ set_blind(p_ptr->blind + 10 + randint(10));
}
}
@@ -3832,12 +3736,13 @@ static int raise_ego[MAX_RAISE] =
*/
static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
+ auto const &r_info = game->edit_data.r_info;
+ auto const &k_info = game->edit_data.k_info;
+
cave_type *c_ptr = &cave[y][x];
bool_ obvious = FALSE;
- u32b f1, f2, f3, f4, f5, esp;
-
char o_name[80];
int o_sval = 0;
@@ -3870,13 +3775,13 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
object_type * o_ptr = &o_list[this_o_idx];
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Get the "plural"-ness */
if (o_ptr->number > 1) plural = TRUE;
/* Check for artifact */
- if ((artifact_p(o_ptr) || o_ptr->art_name)) is_art = TRUE;
+ if (artifact_p(o_ptr)) is_art = TRUE;
/* Analyze the type */
switch (typ)
@@ -3886,10 +3791,11 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
if (o_ptr->tval == TV_CORPSE)
{
- monster_race *r_ptr = &r_info[o_ptr->pval2];
- s32b dama, radius = 7;
+ auto r_ptr = &r_info[o_ptr->pval2];
+ s32b radius = 7;
+ s32b dama;
- if (r_ptr->flags1 & RF1_FORCE_MAXHP)
+ if (r_ptr->flags & RF_FORCE_MAXHP)
dama = maxroll(r_ptr->hdice, r_ptr->hside);
else
dama = damroll(r_ptr->hdice, r_ptr->hside);
@@ -3914,7 +3820,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
do_kill = TRUE;
note_kill = (plural ? " melt!" : " melts!");
- if (f3 & (TR3_IGNORE_ACID)) ignore = TRUE;
+ if (flags & TR_IGNORE_ACID) ignore = TRUE;
}
break;
}
@@ -3926,7 +3832,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
do_kill = TRUE;
note_kill = (plural ? " are destroyed!" : " is destroyed!");
- if (f3 & (TR3_IGNORE_ELEC)) ignore = TRUE;
+ if (flags & TR_IGNORE_ELEC) ignore = TRUE;
}
break;
}
@@ -3938,7 +3844,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
do_kill = TRUE;
note_kill = (plural ? " burn up!" : " burns up!");
- if (f3 & (TR3_IGNORE_FIRE)) ignore = TRUE;
+ if (flags & TR_IGNORE_FIRE) ignore = TRUE;
}
break;
}
@@ -3950,7 +3856,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
note_kill = (plural ? " shatter!" : " shatters!");
do_kill = TRUE;
- if (f3 & (TR3_IGNORE_COLD)) ignore = TRUE;
+ if (flags & TR_IGNORE_COLD) ignore = TRUE;
}
break;
}
@@ -3962,14 +3868,14 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
do_kill = TRUE;
note_kill = (plural ? " burn up!" : " burns up!");
- if (f3 & (TR3_IGNORE_FIRE)) ignore = TRUE;
+ if (flags & TR_IGNORE_FIRE) ignore = TRUE;
}
if (hates_elec(o_ptr))
{
ignore = FALSE;
do_kill = TRUE;
note_kill = (plural ? " are destroyed!" : " is destroyed!");
- if (f3 & (TR3_IGNORE_ELEC)) ignore = TRUE;
+ if (flags & TR_IGNORE_ELEC) ignore = TRUE;
}
break;
}
@@ -3981,14 +3887,14 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
do_kill = TRUE;
note_kill = (plural ? " burn up!" : " burns up!");
- if (f3 & (TR3_IGNORE_FIRE)) ignore = TRUE;
+ if (flags & TR_IGNORE_FIRE) ignore = TRUE;
}
if (hates_cold(o_ptr))
{
ignore = FALSE;
do_kill = TRUE;
note_kill = (plural ? " shatter!" : " shatters!");
- if (f3 & (TR3_IGNORE_COLD)) ignore = TRUE;
+ if (flags & TR_IGNORE_COLD) ignore = TRUE;
}
break;
}
@@ -4026,7 +3932,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
do_kill = TRUE;
note_kill = (plural ? " are destroyed!" : " is destroyed!");
- if (f2 & (TR2_RES_CHAOS)) ignore = TRUE;
+ if (flags & TR_RES_CHAOS) ignore = TRUE;
break;
}
@@ -4043,7 +3949,6 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
}
/* Unlock chests */
- case GF_KILL_TRAP:
case GF_KILL_DOOR:
{
/* Chests are noticed only if trapped or locked */
@@ -4086,19 +3991,6 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
break;
}
- case GF_IDENTIFY:
- {
- object_aware(o_ptr);
- object_known(o_ptr);
-
- /* Process the appropriate hooks */
- identify_hooks(0 - this_o_idx, o_ptr, IDENT_NORMAL);
-
- /* Squelch ! */
- squeltch_grid();
-
- break;
- }
case GF_RAISE:
{
get_pos_player(7, &y, &x);
@@ -4116,7 +4008,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
}
case GF_RAISE_DEMON:
{
- monster_race *r_ptr = &r_info[o_ptr->pval2];
+ auto r_ptr = &r_info[o_ptr->pval2];
cptr name;
if (o_ptr->tval != TV_CORPSE) break;
@@ -4188,7 +4080,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
/* Potions produce effects when 'shattered' */
if (is_potion)
{
- (void)potion_smash_effect(who, y, x, o_sval);
+ potion_smash_effect(who, y, x, o_sval);
}
@@ -4354,17 +4246,17 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
auto r_ptr = m_ptr->race();
/* Mega Gachk */
- if (r_ptr->flags2 & RF2_DEATH_ORB)
+ if (r_ptr->flags & RF_DEATH_ORB)
{
msg_format("%^s is immune to magic.", m_name);
return seen;
}
/* Some monsters get "destroyed" */
- if ((r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags2 & (RF2_STUPID)) ||
- (r_ptr->flags3 & (RF3_NONLIVING)) ||
+ if ((r_ptr->flags & RF_DEMON) ||
+ (r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_STUPID) ||
+ (r_ptr->flags & RF_NONLIVING) ||
(strchr("Evg", r_ptr->d_char)))
{
/* Special note at death */
@@ -4392,51 +4284,50 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_JAM_DOOR:
case GF_RAISE:
case GF_RAISE_DEMON:
- case GF_IDENTIFY:
break; /* none of the above anger */
case GF_TRAP_DEMONSOUL:
- if (r_ptr->flags3 & RF3_DEMON)
+ if (r_ptr->flags & RF_DEMON)
get_angry = TRUE;
break;
case GF_KILL_WALL:
- if (r_ptr->flags3 & (RF3_HURT_ROCK))
+ if (r_ptr->flags & RF_HURT_ROCK)
get_angry = TRUE;
break;
case GF_HOLY_FIRE:
- if (!(r_ptr->flags3 & (RF3_GOOD)))
+ if (!(r_ptr->flags & RF_GOOD))
get_angry = TRUE;
break;
case GF_TURN_UNDEAD:
case GF_DISP_UNDEAD:
- if (r_ptr->flags3 & RF3_UNDEAD)
+ if (r_ptr->flags & RF_UNDEAD)
get_angry = TRUE;
break;
case GF_TURN_EVIL:
case GF_DISP_EVIL:
- if (r_ptr->flags3 & RF3_EVIL)
+ if (r_ptr->flags & RF_EVIL)
get_angry = TRUE;
break;
case GF_DISP_GOOD:
- if (r_ptr->flags3 & RF3_GOOD)
+ if (r_ptr->flags & RF_GOOD)
get_angry = TRUE;
break;
case GF_DISP_DEMON:
- if (r_ptr->flags3 & RF3_DEMON)
+ if (r_ptr->flags & RF_DEMON)
get_angry = TRUE;
break;
case GF_DISP_LIVING:
case GF_UNBREATH:
- if (!(r_ptr->flags3 & (RF3_UNDEAD)) &&
- !(r_ptr->flags3 & (RF3_NONLIVING)))
+ if (!(r_ptr->flags & RF_UNDEAD) &&
+ !(r_ptr->flags & RF_NONLIVING))
get_angry = TRUE;
break;
case GF_PSI:
case GF_PSI_DRAIN:
- if (!(r_ptr->flags2 & (RF2_EMPTY_MIND)))
+ if (!(r_ptr->flags & RF_EMPTY_MIND))
get_angry = TRUE;
break;
case GF_DOMINATION:
- if (!(r_ptr->flags3 & (RF3_NO_CONF)))
+ if (!(r_ptr->flags & RF_NO_CONF))
get_angry = TRUE;
break;
case GF_OLD_POLY:
@@ -4446,7 +4337,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
break;
case GF_LITE:
case GF_LITE_WEAK:
- if (r_ptr->flags3 & RF3_HURT_LITE)
+ if (r_ptr->flags & RF_HURT_LITE)
get_angry = TRUE;
break;
case GF_INSTA_DEATH:
@@ -4490,23 +4381,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
break;
}
- case GF_IDENTIFY:
- {
- if (seen) obvious = TRUE;
-
- /* Probe */
- do_probe(c_ptr->m_idx);
-
- dam = 0;
- break;
- }
-
/* Death -- instant death */
case GF_DEATH:
{
if (seen) obvious = TRUE;
- if (r_ptr->r_flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
note = " resists.";
dam = 0;
@@ -4529,17 +4409,15 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_ACID:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags9 & (RF9_SUSCEP_ACID))
+ if (r_ptr->flags & RF_SUSCEP_ACID)
{
note = " is hit hard.";
dam *= 3;
- if (seen) r_ptr->r_flags9 |= (RF9_SUSCEP_ACID);
}
- if (r_ptr->flags3 & (RF3_IM_ACID))
+ if (r_ptr->flags & RF_IM_ACID)
{
note = " resists a lot.";
dam /= 9;
- if (seen) r_ptr->r_flags3 |= (RF3_IM_ACID);
}
break;
}
@@ -4548,17 +4426,15 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_ELEC:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags9 & (RF9_SUSCEP_ELEC))
+ if (r_ptr->flags & RF_SUSCEP_ELEC)
{
note = " is hit hard.";
dam *= 3;
- if (seen) r_ptr->r_flags9 |= (RF9_SUSCEP_ELEC);
}
- if (r_ptr->flags3 & (RF3_IM_ELEC))
+ if (r_ptr->flags & RF_IM_ELEC)
{
note = " resists a lot.";
dam /= 9;
- if (seen) r_ptr->r_flags3 |= (RF3_IM_ELEC);
}
break;
}
@@ -4567,17 +4443,15 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_FIRE:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_SUSCEP_FIRE))
+ if (r_ptr->flags & RF_SUSCEP_FIRE)
{
note = " is hit hard.";
dam *= 3;
- if (seen) r_ptr->r_flags3 |= (RF3_SUSCEP_FIRE);
}
- if (r_ptr->flags3 & (RF3_IM_FIRE))
+ if (r_ptr->flags & RF_IM_FIRE)
{
note = " resists a lot.";
dam /= 9;
- if (seen) r_ptr->r_flags3 |= (RF3_IM_FIRE);
}
break;
}
@@ -4586,17 +4460,15 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_COLD:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_SUSCEP_COLD))
+ if (r_ptr->flags & RF_SUSCEP_COLD)
{
note = " is hit hard.";
dam *= 3;
- if (seen) r_ptr->r_flags3 |= (RF3_SUSCEP_COLD);
}
- if (r_ptr->flags3 & (RF3_IM_COLD))
+ if (r_ptr->flags & RF_IM_COLD)
{
note = " resists a lot.";
dam /= 9;
- if (seen) r_ptr->r_flags3 |= (RF3_IM_COLD);
}
break;
}
@@ -4606,19 +4478,17 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
if (seen) obvious = TRUE;
if (magik(25)) do_pois = (10 + randint(11) + r) / (r + 1);
- if (r_ptr->flags9 & (RF9_SUSCEP_POIS))
+ if (r_ptr->flags & RF_SUSCEP_POIS)
{
note = " is hit hard.";
dam *= 3;
do_pois *= 2;
- if (seen) r_ptr->r_flags9 |= (RF9_SUSCEP_POIS);
}
- if (r_ptr->flags3 & (RF3_IM_POIS))
+ if (r_ptr->flags & RF_IM_POIS)
{
note = " resists a lot.";
dam /= 9;
do_pois = 0;
- if (seen) r_ptr->r_flags3 |= (RF3_IM_POIS);
}
break;
}
@@ -4629,7 +4499,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
if (seen) obvious = TRUE;
if (magik(15)) do_pois = (10 + randint(11) + r) / (r + 1);
- if ((r_ptr->flags3 & (RF3_NONLIVING)) || (r_ptr->flags3 & (RF3_UNDEAD)))
+ if ((r_ptr->flags & RF_NONLIVING) || (r_ptr->flags & RF_UNDEAD))
{
note = " is immune.";
dam = 0;
@@ -4643,12 +4513,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_IM_POIS))
+ if (r_ptr->flags & RF_IM_POIS)
{
note = " resists.";
dam *= 3;
dam /= (randint(6) + 6);
- if (seen) r_ptr->r_flags3 |= (RF3_IM_POIS);
}
else if (randint(3) == 1) do_poly = TRUE;
break;
@@ -4658,11 +4527,10 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_HELL_FIRE:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_EVIL))
+ if (r_ptr->flags & RF_EVIL)
{
dam *= 2;
note = " is hit hard.";
- if (seen) r_ptr->r_flags3 |= (RF3_EVIL);
}
break;
}
@@ -4671,17 +4539,15 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_HOLY_FIRE:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_GOOD))
+ if (r_ptr->flags & RF_GOOD)
{
dam = 0;
note = " is immune.";
- if (seen) r_ptr->r_flags3 |= (RF3_GOOD);
}
- else if (r_ptr->flags3 & (RF3_EVIL))
+ else if (r_ptr->flags & RF_EVIL)
{
dam *= 2;
note = " is hit hard.";
- if (seen) r_ptr->r_flags3 |= (RF3_EVIL);
}
else
{
@@ -4703,13 +4569,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_PLASMA:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_RES_PLAS))
+ if (r_ptr->flags & RF_RES_PLAS)
{
note = " resists.";
dam *= 3;
dam /= (randint(6) + 6);
- if (seen)
- r_ptr->r_flags3 |= (RF3_RES_PLAS);
}
break;
}
@@ -4718,25 +4582,21 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_NETHER:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_UNDEAD))
+ if (r_ptr->flags & RF_UNDEAD)
{
note = " is immune.";
dam = 0;
- if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD);
}
- else if (r_ptr->flags3 & (RF3_RES_NETH))
+ else if (r_ptr->flags & RF_RES_NETH)
{
note = " resists.";
dam *= 3;
dam /= (randint(6) + 6);
-
- if (seen) r_ptr->r_flags3 |= (RF3_RES_NETH);
}
- else if (r_ptr->flags3 & (RF3_EVIL))
+ else if (r_ptr->flags & RF_EVIL)
{
dam /= 2;
note = " resists somewhat.";
- if (seen) r_ptr->r_flags3 |= (RF3_EVIL);
}
break;
}
@@ -4752,12 +4612,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
note = " is immune.";
dam = 0;
}
- else if (r_ptr->flags3 & (RF3_RES_WATE))
+ else if (r_ptr->flags & RF_RES_WATE)
{
note = " resists.";
dam *= 3;
dam /= (randint(6) + 6);
- if (seen) r_ptr->r_flags3 |= (RF3_RES_WATE);
}
break;
}
@@ -4773,12 +4632,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
note = " is immune.";
dam = 0;
}
- else if (r_ptr->flags3 & (RF3_RES_WATE))
+ else if (r_ptr->flags & RF_RES_WATE)
{
note = " resists.";
dam *= 3;
dam /= (randint(6) + 6);
- if (seen) r_ptr->r_flags3 |= (RF3_RES_WATE);
}
if (who == 0)
@@ -4862,8 +4720,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
do_poly = TRUE;
do_conf = (5 + randint(11) + r) / (r + 1);
- if ((r_ptr->flags4 & (RF4_BR_CHAO)) ||
- ((r_ptr->flags3 & (RF3_DEMON)) && (randint(3) == 1)))
+ if ((r_ptr->spells & SF_BR_CHAO) ||
+ ((r_ptr->flags & RF_DEMON) && (randint(3) == 1)))
{
note = " resists.";
dam *= 3;
@@ -4878,7 +4736,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
if (seen) obvious = TRUE;
if (magik(33)) do_cut = (10 + randint(15) + r) / (r + 1);
- if (r_ptr->flags4 & (RF4_BR_SHAR))
+ if (r_ptr->spells & SF_BR_SHAR)
{
note = " resists.";
dam *= 3;
@@ -4894,7 +4752,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
if (magik(12)) do_cut = (10 + randint(15) + r) / (r + 1);
- if (r_ptr->flags4 & (RF4_BR_SHAR))
+ if (r_ptr->spells & SF_BR_SHAR)
{
note = " resists somewhat.";
dam /= 2;
@@ -4915,7 +4773,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
}
else
do_stun = (10 + randint(15) + r) / (r + 1);
- if (r_ptr->flags4 & (RF4_BR_SOUN))
+ if (r_ptr->spells & SF_BR_SOUN)
{
note = " resists.";
dam *= 2;
@@ -4929,13 +4787,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
if (seen) obvious = TRUE;
do_conf = (10 + randint(15) + r) / (r + 1);
- if (r_ptr->flags4 & (RF4_BR_CONF))
+ if (r_ptr->spells & SF_BR_CONF)
{
note = " resists.";
dam *= 2;
dam /= (randint(6) + 6);
}
- else if (r_ptr->flags3 & (RF3_NO_CONF))
+ else if (r_ptr->flags & RF_NO_CONF)
{
note = " resists somewhat.";
dam /= 2;
@@ -4947,12 +4805,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DISENCHANT:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_RES_DISE))
+ if (r_ptr->flags & RF_RES_DISE)
{
note = " resists.";
dam *= 3;
dam /= (randint(6) + 6);
- if (seen) r_ptr->r_flags3 |= (RF3_RES_DISE);
}
break;
}
@@ -4961,12 +4818,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_NEXUS:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_RES_NEXU))
+ if (r_ptr->flags & RF_RES_NEXU)
{
note = " resists.";
dam *= 3;
dam /= (randint(6) + 6);
- if (seen) r_ptr->r_flags3 |= (RF3_RES_NEXU);
}
break;
}
@@ -5059,7 +4915,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* --hack-- Only stun if a monster fired it */
else do_stun = (randint(15) + r) / (r + 1);
- if (r_ptr->flags4 & (RF4_BR_WALL))
+ if (r_ptr->spells & SF_BR_WALL)
{
note = " resists.";
dam *= 3;
@@ -5072,7 +4928,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_INERTIA:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags4 & (RF4_BR_INER))
+ if (r_ptr->spells & SF_BR_INER)
{
note = " resists.";
dam *= 3;
@@ -5099,7 +4955,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_TIME:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags4 & (RF4_BR_TIME))
+ if (r_ptr->spells & SF_BR_TIME)
{
note = " resists.";
dam *= 3;
@@ -5115,17 +4971,15 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_RES_TELE))
+ if (r_ptr->flags & RF_RES_TELE)
{
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " is unaffected!";
resist_tele = TRUE;
}
else if (m_ptr->level > randint(100))
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " resists!";
resist_tele = TRUE;
}
@@ -5134,7 +4988,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (!resist_tele) do_dist = 10;
else do_dist = 0;
- if (r_ptr->flags4 & (RF4_BR_GRAV))
+ if (r_ptr->spells & SF_BR_GRAV)
{
note = " resists.";
dam *= 3;
@@ -5145,7 +4999,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
/* 1. slowness */
/* Powerful monsters can resist */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
obvious = FALSE;
@@ -5161,7 +5015,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
/* Resist */
@@ -5186,15 +5040,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DISINTEGRATE:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags3 & (RF3_HURT_ROCK))
+ if (r_ptr->flags & RF_HURT_ROCK)
{
- if (seen) r_ptr->r_flags3 |= (RF3_HURT_ROCK);
note = " loses some skin!";
note_dies = " evaporates!";
dam *= 2;
}
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
if (rand_int(m_ptr->level + 10) > rand_int(p_ptr->lev))
{
@@ -5207,7 +5060,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_FEAR:
{
- if (r_ptr->flags3 & (RF3_NO_FEAR))
+ if (r_ptr->flags & RF_NO_FEAR)
note = " is unaffected.";
else
set_afraid(p_ptr->afraid + (dam / 2) + randint(dam / 2));
@@ -5220,14 +5073,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_PSI:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags2 & RF2_EMPTY_MIND)
+ if (r_ptr->flags & RF_EMPTY_MIND)
{
dam = 0;
note = " is immune!";
}
- else if ((r_ptr->flags2 & RF2_STUPID) ||
- (r_ptr->flags2 & RF2_WEIRD_MIND) ||
- (r_ptr->flags3 & RF3_ANIMAL) ||
+ else if ((r_ptr->flags & RF_STUPID) ||
+ (r_ptr->flags & RF_WEIRD_MIND) ||
+ (r_ptr->flags & RF_ANIMAL) ||
(m_ptr->level > randint(3 * dam)))
{
dam /= 3;
@@ -5235,8 +5088,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* Powerful demons & undead can turn a mindcrafter's
* attacks back on them */
- if (((r_ptr->flags3 & RF3_UNDEAD) ||
- (r_ptr->flags3 & RF3_DEMON)) &&
+ if (((r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_DEMON)) &&
(m_ptr->level > p_ptr->lev / 2) &&
(randint(2) == 1))
{
@@ -5265,7 +5118,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
break;
case 3:
{
- if (r_ptr->flags3 & (RF3_NO_FEAR))
+ if (r_ptr->flags & RF_NO_FEAR)
note = " is unaffected.";
else
set_afraid(p_ptr->afraid + 3 + randint(dam));
@@ -5273,7 +5126,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
}
default:
if (!p_ptr->free_act)
- (void)set_paralyzed(randint(dam));
+ set_paralyzed(randint(dam));
break;
}
}
@@ -5308,14 +5161,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_PSI_DRAIN:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags2 & RF2_EMPTY_MIND)
+ if (r_ptr->flags & RF_EMPTY_MIND)
{
dam = 0;
note = " is immune!";
}
- else if ((r_ptr->flags2 & RF2_STUPID) ||
- (r_ptr->flags2 & RF2_WEIRD_MIND) ||
- (r_ptr->flags3 & RF3_ANIMAL) ||
+ else if ((r_ptr->flags & RF_STUPID) ||
+ (r_ptr->flags & RF_WEIRD_MIND) ||
+ (r_ptr->flags & RF_ANIMAL) ||
(m_ptr->level > randint(3 * dam)))
{
dam /= 3;
@@ -5325,8 +5178,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
* Powerful demons & undead can turn a mindcrafter's
* attacks back on them
*/
- if (((r_ptr->flags3 & RF3_UNDEAD) ||
- (r_ptr->flags3 & RF3_DEMON)) &&
+ if (((r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_DEMON)) &&
(m_ptr->level > p_ptr->lev / 2) &&
(randint(2) == 1))
{
@@ -5372,7 +5225,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->level > 5 + randint(dam)))
{
/* Resist */
@@ -5396,16 +5249,10 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
- (r_ptr->flags3 & (RF3_NO_CONF)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
+ (r_ptr->flags & RF_NO_CONF) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
do_conf = 0;
@@ -5413,8 +5260,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
* Powerful demons & undead can turn a mindcrafter's
* attacks back on them
*/
- if (((r_ptr->flags3 & RF3_UNDEAD) ||
- (r_ptr->flags3 & RF3_DEMON)) &&
+ if (((r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_DEMON)) &&
(m_ptr->level > p_ptr->lev / 2) &&
(randint(2) == 1))
{
@@ -5439,7 +5286,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
break;
default:
{
- if (r_ptr->flags3 & (RF3_NO_FEAR))
+ if (r_ptr->flags & RF_NO_FEAR)
note = " is unaffected.";
else
set_afraid(p_ptr->afraid + dam);
@@ -5460,7 +5307,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
note = " is in your thrall!";
m_ptr->status = MSTATUS_PET;
- if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL)))
+ if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL)))
inc_piety(GOD_YAVANNA, m_ptr->level * 2);
}
else
@@ -5492,19 +5339,17 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
do_stun = (randint(15) + 1) / (r + 1);
if (magik(33)) do_cut = (10 + randint(15) + r) / (r + 1);
- if (r_ptr->flags3 & (RF3_SUSCEP_COLD))
+ if (r_ptr->flags & RF_SUSCEP_COLD)
{
note = " is hit hard.";
dam *= 3;
do_cut *= 2;
- if (seen) r_ptr->r_flags3 |= (RF3_SUSCEP_COLD);
}
- if (r_ptr->flags3 & (RF3_IM_COLD))
+ if (r_ptr->flags & RF_IM_COLD)
{
note = " resists a lot.";
dam /= 9;
do_cut = 0;
- if (seen) r_ptr->r_flags3 |= (RF3_IM_COLD);
}
break;
}
@@ -5515,20 +5360,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
if (seen) obvious = TRUE;
- if ((r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_NONLIVING)) ||
+ if ((r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_DEMON) ||
+ (r_ptr->flags & RF_NONLIVING) ||
(strchr("Egv", r_ptr->d_char)))
{
- if (r_ptr->flags3 & (RF3_UNDEAD))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD);
- }
- if (r_ptr->flags3 & (RF3_DEMON))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_DEMON);
- }
-
note = " is unaffected!";
obvious = FALSE;
dam = 0;
@@ -5541,19 +5377,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DEATH_RAY:
{
if (seen) obvious = TRUE;
- if ((r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags3 & (RF3_NONLIVING)))
+ if ((r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_NONLIVING))
{
- if (r_ptr->flags3 & (RF3_UNDEAD))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD);
- }
-
note = " is immune.";
obvious = FALSE;
dam = 0;
}
- else if (((r_ptr->flags1 & (RF1_UNIQUE)) &&
+ else if (((r_ptr->flags & RF_UNIQUE) &&
(randint(888) != 666)) ||
(((m_ptr->level + randint(20)) > randint((dam) + randint(10))) &&
randint(100) != 66 ))
@@ -5577,7 +5408,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_poly = TRUE;
/* Powerful monsters can resist */
- if ((r_ptr->flags1 & RF1_UNIQUE) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->mflag & MFLAG_QUEST) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
@@ -5668,7 +5499,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Powerful monsters can resist */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
note = " is unaffected!";
@@ -5694,15 +5525,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Attempt a saving throw */
- if ((r_ptr->flags3 & (RF3_NO_SLEEP)) ||
+ if ((r_ptr->flags & RF_NO_SLEEP) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_SLEEP))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_SLEEP);
- }
-
/* No obvious effect */
note = " is unaffected!";
obvious = FALSE;
@@ -5726,7 +5551,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
note = " is unaffected!";
@@ -5753,15 +5578,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* Attempt a saving throw */
if ((m_ptr->mflag & MFLAG_QUEST) ||
- (r_ptr->flags3 & RF3_NO_CONF) ||
+ (r_ptr->flags & RF_NO_CONF) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 5))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
/* No obvious effect */
note = " is unaffected!";
@@ -5777,7 +5596,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
note = " suddenly seems friendly!";
m_ptr->status = MSTATUS_FRIEND;
- if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL)))
+ if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL)))
inc_piety(GOD_YAVANNA, m_ptr->level * 2);
}
}
@@ -5796,15 +5615,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* Attempt a saving throw */
if ((m_ptr->mflag & MFLAG_QUEST) ||
- (r_ptr->flags3 & RF3_NO_CONF) ||
+ (r_ptr->flags & RF_NO_CONF) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 5))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
/* No obvious effect */
note = " is unaffected!";
@@ -5822,7 +5635,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (can_create_companion()) m_ptr->status = MSTATUS_COMPANION;
else m_ptr->status = MSTATUS_PET;
- if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL)))
+ if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL)))
inc_piety(GOD_YAVANNA, m_ptr->level * 2);
}
}
@@ -5838,9 +5651,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & RF1_UNIQUE) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->mflag & MFLAG_QUEST) ||
- (!(r_ptr->flags3 & RF3_UNDEAD)) ||
+ (!(r_ptr->flags & RF_UNDEAD)) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
/* Resist */
@@ -5869,9 +5682,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & RF1_UNIQUE) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->mflag & MFLAG_QUEST) ||
- (!(r_ptr->flags1 & RF1_NEVER_MOVE)) ||
+ (!(r_ptr->flags & RF_NEVER_MOVE)) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
/* Resist */
@@ -5900,18 +5713,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->mflag & MFLAG_QUEST) ||
- (!(r_ptr->flags3 & (RF3_ANIMAL))) ||
- (r_ptr->flags3 & (RF3_NO_CONF)) ||
+ (!(r_ptr->flags & RF_ANIMAL)) ||
+ (r_ptr->flags & RF_NO_CONF) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
/* No obvious effect */
note = " is unaffected!";
@@ -5939,17 +5746,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->mflag & MFLAG_QUEST) ||
- (!(r_ptr->flags3 & (RF3_DEMON))) ||
+ (!(r_ptr->flags & RF_DEMON)) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
/* No obvious effect */
note = " is unaffected!";
@@ -5979,15 +5780,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_conf = damroll(3, (dam / 2)) + 1;
/* Attempt a saving throw */
- if ((r_ptr->flags3 & (RF3_NO_CONF)) ||
+ if ((r_ptr->flags & RF_NO_CONF) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
do_conf = 0;
@@ -6032,15 +5827,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_conf = damroll(3, (dam / 2)) + 1;
/* Attempt a saving throw */
- if ((r_ptr->flags3 & (RF3_NO_CONF)) ||
+ if ((r_ptr->flags & RF_NO_CONF) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
do_conf = 0;
@@ -6078,7 +5867,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
/* Resist */
@@ -6090,7 +5879,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
}
/* Non_living resists */
- if (r_ptr->flags3 & (RF3_NONLIVING))
+ if (r_ptr->flags & RF_NONLIVING)
{
/* Resist */
do_stun = 0;
@@ -6112,15 +5901,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_conf = damroll(3, (dam / 2)) + 1;
/* Attempt a saving throw */
- if ((r_ptr->flags3 & (RF3_NO_CONF)) ||
+ if ((r_ptr->flags & RF_NO_CONF) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-
/* Resist */
do_conf = 0;
@@ -6149,14 +5932,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_LITE_WEAK:
{
/* Hurt by light */
- if (r_ptr->flags3 & (RF3_HURT_LITE))
+ if (r_ptr->flags & RF_HURT_LITE)
{
/* Obvious effect */
if (seen) obvious = TRUE;
- /* Memorize the effects */
- if (seen) r_ptr->r_flags3 |= (RF3_HURT_LITE);
-
/* Special effect */
note = " cringes from the light!";
note_dies = " shrivels away in the light!";
@@ -6178,15 +5958,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_LITE:
{
if (seen) obvious = TRUE;
- if (r_ptr->flags4 & (RF4_BR_LITE))
+ if (r_ptr->spells & SF_BR_LITE)
{
note = " resists.";
dam *= 2;
dam /= (randint(6) + 6);
}
- else if (r_ptr->flags3 & (RF3_HURT_LITE))
+ else if (r_ptr->flags & RF_HURT_LITE)
{
- if (seen) r_ptr->r_flags3 |= (RF3_HURT_LITE);
note = " cringes from the light!";
note_dies = " shrivels away in the light!";
dam *= 2;
@@ -6201,9 +5980,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Likes darkness... */
- if ((r_ptr->flags4 & (RF4_BR_DARK)) ||
- (r_ptr->flags3 & RF3_ORC) ||
- (r_ptr->flags3 & RF3_HURT_LITE))
+ if ((r_ptr->spells & SF_BR_DARK) ||
+ (r_ptr->flags & RF_ORC) ||
+ (r_ptr->flags & RF_HURT_LITE))
{
note = " resists.";
dam *= 2;
@@ -6217,14 +5996,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_KILL_WALL:
{
/* Hurt by rock remover */
- if (r_ptr->flags3 & (RF3_HURT_ROCK))
+ if (r_ptr->flags & RF_HURT_ROCK)
{
/* Notice effect */
if (seen) obvious = TRUE;
- /* Memorize the effects */
- if (seen) r_ptr->r_flags3 |= (RF3_HURT_ROCK);
-
/* Cute little message */
note = " loses some skin!";
note_dies = " dissolves!";
@@ -6245,23 +6021,21 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_AWAY_UNDEAD:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */
+ if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */
/* Only affect undead */
- if (r_ptr->flags3 & (RF3_UNDEAD))
+ if (r_ptr->flags & RF_UNDEAD)
{
bool_ resists_tele = FALSE;
- if (r_ptr->flags3 & (RF3_RES_TELE))
+ if (r_ptr->flags & RF_RES_TELE)
{
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " is unaffected!";
resists_tele = TRUE;
}
else if (m_ptr->level > randint(100))
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " resists!";
resists_tele = TRUE;
}
@@ -6270,7 +6044,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (!resists_tele)
{
if (seen) obvious = TRUE;
- if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD);
do_dist = dam;
}
}
@@ -6291,23 +6064,21 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* Teleport evil (Use "dam" as "power") */
case GF_AWAY_EVIL:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */
+ if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */
/* Only affect evil */
- if (r_ptr->flags3 & (RF3_EVIL))
+ if (r_ptr->flags & RF_EVIL)
{
bool_ resists_tele = FALSE;
- if (r_ptr->flags3 & (RF3_RES_TELE))
+ if (r_ptr->flags & RF_RES_TELE)
{
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " is unaffected!";
resists_tele = TRUE;
}
else if (m_ptr->level > randint(100))
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " resists!";
resists_tele = TRUE;
}
@@ -6316,7 +6087,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (!resists_tele)
{
if (seen) obvious = TRUE;
- if (seen) r_ptr->r_flags3 |= (RF3_EVIL);
do_dist = dam;
}
}
@@ -6339,18 +6109,16 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
bool_ resists_tele = FALSE;
- if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */
- if (r_ptr->flags3 & (RF3_RES_TELE))
+ if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */
+ if (r_ptr->flags & RF_RES_TELE)
{
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " is unaffected!";
resists_tele = TRUE;
}
else if (m_ptr->level > randint(100))
{
- if (seen) r_ptr->r_flags3 |= RF3_RES_TELE;
note = " resists!";
resists_tele = TRUE;
}
@@ -6375,11 +6143,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_TURN_UNDEAD:
{
/* Only affect undead */
- if (r_ptr->flags3 & (RF3_UNDEAD))
+ if (r_ptr->flags & RF_UNDEAD)
{
- /* Learn about type */
- if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD);
-
/* Obvious */
if (seen) obvious = TRUE;
@@ -6413,11 +6178,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_TURN_EVIL:
{
/* Only affect evil */
- if (r_ptr->flags3 & (RF3_EVIL))
+ if (r_ptr->flags & RF_EVIL)
{
- /* Learn about type */
- if (seen) r_ptr->r_flags3 |= (RF3_EVIL);
-
/* Obvious */
if (seen) obvious = TRUE;
@@ -6457,8 +6219,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_fear = damroll(3, (dam / 2)) + 1;
/* Attempt a saving throw */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
- (r_ptr->flags3 & (RF3_NO_FEAR)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
+ (r_ptr->flags & RF_NO_FEAR) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
/* No obvious effect */
@@ -6477,11 +6239,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DISP_UNDEAD:
{
/* Only affect undead */
- if (r_ptr->flags3 & (RF3_UNDEAD))
+ if (r_ptr->flags & RF_UNDEAD)
{
- /* Learn about type */
- if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD);
-
/* Obvious */
if (seen) obvious = TRUE;
@@ -6508,11 +6267,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DISP_EVIL:
{
/* Only affect evil */
- if (r_ptr->flags3 & (RF3_EVIL))
+ if (r_ptr->flags & RF_EVIL)
{
- /* Learn about type */
- if (seen) r_ptr->r_flags3 |= (RF3_EVIL);
-
/* Obvious */
if (seen) obvious = TRUE;
@@ -6538,11 +6294,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DISP_GOOD:
{
/* Only affect good */
- if (r_ptr->flags3 & (RF3_GOOD))
+ if (r_ptr->flags & RF_GOOD)
{
- /* Learn about type */
- if (seen) r_ptr->r_flags3 |= (RF3_GOOD);
-
/* Obvious */
if (seen) obvious = TRUE;
@@ -6568,8 +6321,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DISP_LIVING:
{
/* Only affect non-undead */
- if (!(r_ptr->flags3 & (RF3_UNDEAD)) &&
- !(r_ptr->flags3 & (RF3_NONLIVING)))
+ if (!(r_ptr->flags & RF_UNDEAD) &&
+ !(r_ptr->flags & RF_NONLIVING))
{
/* Obvious */
if (seen) obvious = TRUE;
@@ -6596,11 +6349,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_DISP_DEMON:
{
/* Only affect demons */
- if (r_ptr->flags3 & (RF3_DEMON))
+ if (r_ptr->flags & RF_DEMON)
{
- /* Learn about type */
- if (seen) r_ptr->r_flags3 |= (RF3_DEMON);
-
/* Obvious */
if (seen) obvious = TRUE;
@@ -6666,9 +6416,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if (seen) obvious = TRUE;
/* Check race */
- if ((r_ptr->flags1 & (RF1_UNIQUE)) ||
+ if ((r_ptr->flags & RF_UNIQUE) ||
(m_ptr->mflag & MFLAG_QUEST) ||
- (!(r_ptr->flags3 & (RF3_DEMON))))
+ (!(r_ptr->flags & RF_DEMON)))
{
/* No obvious effect */
note = " is unaffected!";
@@ -6685,7 +6435,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_CORPSE));
/* Unique corpses are unique */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
object_aware(i_ptr);
i_ptr->name1 = 201;
@@ -6712,7 +6462,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
case GF_INSTA_DEATH:
{
- if (magik(95) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags3 & RF3_UNDEAD) && !(r_ptr->flags3 & RF3_NONLIVING)) {
+ if (magik(95) && !(r_ptr->flags & RF_UNIQUE) && !(r_ptr->flags & RF_UNDEAD) && !(r_ptr->flags & RF_NONLIVING)) {
/* Kill outright, but reduce exp. */
m_ptr->level = m_ptr->level / 3;
dam = 32535; /* Should be enough */
@@ -6737,7 +6487,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* "Unique" monsters cannot be polymorphed */
- if (r_ptr->flags1 & (RF1_UNIQUE)) do_poly = FALSE;
+ if (r_ptr->flags & RF_UNIQUE) do_poly = FALSE;
/*
* "Quest" monsters cannot be polymorphed
@@ -6746,7 +6496,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
do_poly = FALSE;
/* "Unique" monsters can only be "killed" by the player unless they are player's friends */
- if ((r_ptr->flags1 & RF1_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P))
+ if ((r_ptr->flags & RF_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P))
{
/* Uniques may only be killed by the player */
if (who && (who != -2) && (dam > m_ptr->hp)) dam = m_ptr->hp;
@@ -6760,14 +6510,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
if ((who > 0) && (dam > m_ptr->hp)) dam = m_ptr->hp;
}
- if (do_pois && (!(r_ptr->flags3 & RF3_IM_POIS)) && (!(r_ptr->flags3 & RF4_BR_POIS)) && hurt_monster(m_ptr))
+ if (do_pois && (r_ptr->flags & RF_IM_POIS).empty() && (r_ptr->spells & SF_BR_POIS).empty() && hurt_monster(m_ptr))
{
if (m_ptr->poisoned) note = " is more poisoned.";
else note = " is poisoned.";
m_ptr->poisoned += do_pois;
}
- if (do_cut && (!(r_ptr->flags4 & RF4_BR_WALL)) && hurt_monster(m_ptr))
+ if (do_cut && (!(r_ptr->spells & SF_BR_WALL)) && hurt_monster(m_ptr))
{
if (m_ptr->bleeding) note = " bleeds more strongly.";
else note = " starts bleeding.";
@@ -6900,8 +6650,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* Sound and Impact breathers never stun */
else if (do_stun &&
- !(r_ptr->flags4 & (RF4_BR_SOUN)) &&
- !(r_ptr->flags4 & (RF4_BR_WALL)) && hurt_monster(m_ptr))
+ !(r_ptr->spells & SF_BR_SOUN) &&
+ !(r_ptr->spells & SF_BR_WALL) && hurt_monster(m_ptr))
{
/* Obvious */
if (seen) obvious = TRUE;
@@ -6924,9 +6674,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* Confusion and Chaos breathers (and sleepers) never confuse */
else if (do_conf &&
- !(r_ptr->flags3 & (RF3_NO_CONF)) &&
- !(r_ptr->flags4 & (RF4_BR_CONF)) &&
- !(r_ptr->flags4 & (RF4_BR_CHAO)) && hurt_monster(m_ptr))
+ !(r_ptr->flags & RF_NO_CONF) &&
+ !(r_ptr->spells & SF_BR_CONF) &&
+ !(r_ptr->spells & SF_BR_CHAO) && hurt_monster(m_ptr))
{
/* Obvious */
if (seen) obvious = TRUE;
@@ -7006,9 +6756,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
/* Take note */
if ((fear || do_fear) && (m_ptr->ml))
{
- /* Sound */
- sound(SOUND_FLEE);
-
/* Message */
msg_format("%^s flees in terror!", m_name);
}
@@ -7047,10 +6794,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ)
}
-/* Is the spell unsafe for the player ? */
-bool_ unsafe = FALSE;
-
-
/*
* Helper function for "project()" below.
*
@@ -7072,6 +6815,10 @@ bool_ unsafe = FALSE;
*/
static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto const &r_info = game->edit_data.r_info;
+ auto const &f_info = game->edit_data.f_info;
+
int k = 0, do_move = 0, a = 0, b = 0, x1 = 0, y1 = 0;
/* Hack -- assume obvious */
@@ -7100,7 +6847,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
if ((x != p_ptr->px) || (y != p_ptr->py)) return (FALSE);
/* Player cannot hurt himself */
- if ((!who) && (!unsafe)) return (FALSE);
+ if (!who) return (FALSE);
/* Bolt attack from a monster */
if ((!a_rad) && get_skill(SKILL_DODGE) && (who > 0))
@@ -7141,7 +6888,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
project(0, 0, t_y, t_x, dam, typ, (PROJECT_STOP | PROJECT_KILL));
- disturb(1);
+ disturb();
return TRUE;
}
@@ -7156,9 +6903,6 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
/* If the player is blind, be more descriptive */
if (blind) fuzzy = TRUE;
- /* If the player is hit by a trap, be more descritive */
- if (who == -2) fuzzy = TRUE;
-
/* Did ``God'' do it? */
if (who == -99)
{
@@ -7174,7 +6918,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
/* Did the dungeon do it? */
if (who == -100)
{
- sprintf(killer, "%s", d_info[dungeon_type].name);
+ sprintf(killer, "%s", d_info[dungeon_type].name.c_str());
}
if (who == -101)
{
@@ -7193,12 +6937,6 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
monster_desc(killer, m_ptr, 0x88);
}
- if (who == -2)
- {
- sprintf(killer, "%s",
- t_info[cave[p_ptr->py][p_ptr->px].t_idx].name);
- }
-
/* Analyze the damage */
switch (typ)
{
@@ -7331,7 +7069,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
if (!p_ptr->resist_sound)
{
int k = (randint((dam > 40) ? 35 : (dam * 3 / 4 + 5)));
- (void)set_stun(p_ptr->stun + k);
+ set_stun(p_ptr->stun + k);
}
if (!(p_ptr->resist_fire ||
@@ -7416,11 +7154,11 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
}
if (!p_ptr->resist_conf)
{
- (void)set_confused(p_ptr->confused + rand_int(20) + 10);
+ set_confused(p_ptr->confused + rand_int(20) + 10);
}
if (!p_ptr->resist_chaos)
{
- (void)set_image(p_ptr->image + randint(10));
+ set_image(p_ptr->image + randint(10));
}
if (!p_ptr->resist_neth && !p_ptr->resist_chaos)
{
@@ -7459,7 +7197,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
}
else
{
- (void)set_cut(p_ptr->cut + dam);
+ set_cut(p_ptr->cut + dam);
}
if ((!p_ptr->resist_shard) || (randint(13) == 1))
@@ -7483,7 +7221,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
else
{
int k = (randint((dam > 90) ? 35 : (dam / 3 + 5)));
- (void)set_stun(p_ptr->stun + k);
+ set_stun(p_ptr->stun + k);
}
if ((!p_ptr->resist_sound) || (randint(13) == 1))
@@ -7506,7 +7244,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
}
if (!p_ptr->resist_conf)
{
- (void)set_confused(p_ptr->confused + randint(20) + 10);
+ set_confused(p_ptr->confused + randint(20) + 10);
}
take_hit(dam, killer);
break;
@@ -7523,7 +7261,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
}
else
{
- (void)apply_disenchant(0);
+ apply_disenchant(0);
}
take_hit(dam, killer);
break;
@@ -7552,7 +7290,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
if (fuzzy) msg_print("You are hit by kinetic force!");
if (!p_ptr->resist_sound)
{
- (void)set_stun(p_ptr->stun + randint(20));
+ set_stun(p_ptr->stun + randint(20));
/*
* If fired by player, try pushing monster.
* First get vector from player to monster.
@@ -7642,7 +7380,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
if (fuzzy) msg_print("There is an explosion!");
if (!p_ptr->resist_sound)
{
- (void)set_stun(p_ptr->stun + randint(20));
+ set_stun(p_ptr->stun + randint(20));
}
if (p_ptr->resist_shard)
{
@@ -7650,7 +7388,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
}
else
{
- (void)set_cut(p_ptr-> cut + ( dam / 2) );
+ set_cut(p_ptr-> cut + ( dam / 2) );
}
if ((!p_ptr->resist_shard) || (randint(12) == 1))
@@ -7666,7 +7404,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
case GF_INERTIA:
{
if (fuzzy) msg_print("You are hit by something slow!");
- (void)set_slow(p_ptr->slow + rand_int(4) + 4);
+ set_slow(p_ptr->slow + rand_int(4) + 4);
take_hit(dam, killer);
break;
}
@@ -7682,7 +7420,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
}
else if (!blind && !p_ptr->resist_blind)
{
- (void)set_blind(p_ptr->blind + randint(5) + 2);
+ set_blind(p_ptr->blind + randint(5) + 2);
}
if (p_ptr->sensible_lite)
{
@@ -7717,7 +7455,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
}
else if (!blind && !p_ptr->resist_blind)
{
- (void)set_blind(p_ptr->blind + randint(5) + 2);
+ set_blind(p_ptr->blind + randint(5) + 2);
}
if (p_ptr->wraith_form) hp_player(dam);
else take_hit(dam, killer);
@@ -7812,33 +7550,29 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
/* Gravity -- stun plus slowness plus teleport */
case GF_GRAVITY:
{
- if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */
+ if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */
if (fuzzy) msg_print("You are hit by something heavy!");
msg_print("Gravity warps around you.");
- if (!unsafe)
- {
- teleport_player(5);
- if (!p_ptr->ffall)
- (void)set_slow(p_ptr->slow + rand_int(4) + 4);
- if (!(p_ptr->resist_sound || p_ptr->ffall))
- {
- int k = (randint((dam > 90) ? 35 : (dam / 3 + 5)));
- (void)set_stun(p_ptr->stun + k);
- }
- if (p_ptr->ffall)
- {
- dam = (dam * 2) / 3;
- }
- if ((!p_ptr->ffall) || (randint(13) == 1))
- {
- inven_damage(set_cold_destroy, 2);
- }
+ teleport_player(5);
+ if (!p_ptr->ffall)
+ set_slow(p_ptr->slow + rand_int(4) + 4);
+ if (!(p_ptr->resist_sound || p_ptr->ffall))
+ {
+ int k = (randint((dam > 90) ? 35 : (dam / 3 + 5)));
+ set_stun(p_ptr->stun + k);
+ }
+ if (p_ptr->ffall)
+ {
+ dam = (dam * 2) / 3;
+ }
- take_hit(dam, killer);
+ if ((!p_ptr->ffall) || (randint(13) == 1))
+ {
+ inven_damage(set_cold_destroy, 2);
}
- else
- teleport_player(dam);
+
+ take_hit(dam, killer);
break;
}
@@ -7853,7 +7587,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
case GF_OLD_HEAL:
{
if (fuzzy) msg_print("You are hit by something invigorating!");
- (void)hp_player(dam);
+ hp_player(dam);
dam = 0;
break;
}
@@ -7861,7 +7595,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
case GF_OLD_SPEED:
{
if (fuzzy) msg_print("You are hit by something!");
- (void)set_fast(p_ptr->fast + randint(5), 10);
+ set_fast(p_ptr->fast + randint(5), 10);
dam = 0;
break;
}
@@ -7869,7 +7603,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
case GF_OLD_SLOW:
{
if (fuzzy) msg_print("You are hit by something slow!");
- (void)set_slow(p_ptr->slow + rand_int(4) + 4);
+ set_slow(p_ptr->slow + rand_int(4) + 4);
break;
}
@@ -7911,11 +7645,11 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
cold_dam(dam, killer);
if (!p_ptr->resist_shard)
{
- (void)set_cut(p_ptr->cut + damroll(5, 8));
+ set_cut(p_ptr->cut + damroll(5, 8));
}
if (!p_ptr->resist_sound)
{
- (void)set_stun(p_ptr->stun + randint(15));
+ set_stun(p_ptr->stun + randint(15));
}
if ((!(p_ptr->resist_cold || p_ptr->oppose_cold)) || (randint(12) == 1))
@@ -7926,14 +7660,6 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
break;
}
- /* Knowledge */
- case GF_IDENTIFY:
- {
- if (fuzzy) msg_print("You are hit by pure knowledge!");
- self_knowledge(NULL);
- break;
- }
-
/* Psi -- ESP */
case GF_PSI:
{
@@ -8041,7 +7767,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad
/* Disturb */
- disturb(1);
+ disturb();
/* Return "Anything seen?" */
@@ -8204,7 +7930,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg)
int y_saver, x_saver; /* For reflecting monsters */
- int msec = delay_factor * delay_factor * delay_factor;
+ auto const msec = options->delay_factor_ms();
/* Assume the player sees nothing */
bool_ notice = FALSE;
@@ -8359,10 +8085,16 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg)
/* Visual effects */
print_rel(c, a, y, x);
move_cursor_relative(y, x);
- if (fresh_before) Term_fresh();
+ if (options->fresh_before)
+ {
+ Term_fresh();
+ }
sleep_for(milliseconds(msec));
lite_spot(y, x);
- if (fresh_before) Term_fresh();
+ if (options->fresh_before)
+ {
+ Term_fresh();
+ }
/* Display "beam" grids */
if (flg & (PROJECT_BEAM))
@@ -8499,7 +8231,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg)
move_cursor_relative(y2, x2);
/* Flush each "radius" seperately */
- if (fresh_before) Term_fresh();
+ if (options->fresh_before) Term_fresh();
/* Delay (efficiently) */
if (visual || drawn)
@@ -8529,7 +8261,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg)
move_cursor_relative(y2, x2);
/* Flush the explosion */
- if (fresh_before) Term_fresh();
+ if (options->fresh_before) Term_fresh();
}
}
@@ -8627,7 +8359,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg)
{
auto ref_ptr = m_list[cave[y][x].m_idx].race();
- if ((ref_ptr->flags2 & (RF2_REFLECTING)) && (randint(10) != 1)
+ if ((ref_ptr->flags & RF_REFLECTING) && (randint(10) != 1)
&& (dist_hack > 1))
{
int t_y, t_x;
@@ -8653,7 +8385,6 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg)
if (m_list[cave[y][x].m_idx].ml)
{
msg_print("The attack bounces!");
- ref_ptr->r_flags2 |= RF2_REFLECTING;
}
project(cave[y][x].m_idx, 0, t_y, t_x, dam, typ, flg);
@@ -8780,7 +8511,6 @@ bool_ potion_smash_effect(int who, int y, int x, int o_sval)
case SV_POTION_AUGMENTATION:
case SV_POTION_ENLIGHTENMENT:
case SV_POTION_STAR_ENLIGHTENMENT:
- case SV_POTION_SELF_KNOWLEDGE:
case SV_POTION_EXPERIENCE:
case SV_POTION_RESISTANCE:
case SV_POTION_INVULNERABILITY:
@@ -8871,12 +8601,12 @@ bool_ potion_smash_effect(int who, int y, int x, int o_sval)
;
}
- (void) project(who, radius, y, x, dam, dt,
+ project(who, radius, y, x, dam, dt,
(PROJECT_JUMP | PROJECT_ITEM | PROJECT_KILL));
// Silence warning. We may want to introuce an actual implementation
// and I want to preserve the original "ident" values if we do so.
- (void) ident;
+ ident;
/* XXX those potions that explode need to become "known" */
return angry;
@@ -9022,18 +8752,12 @@ static void describe_attack_fully(int type, char* r)
case GF_KILL_DOOR:
strcpy(r, "door destruction");
break;
- case GF_KILL_TRAP:
- strcpy(r, "trap destruction");
- break;
case GF_STONE_WALL:
strcpy(r, "wall creation");
break;
case GF_MAKE_DOOR:
strcpy(r, "door creation");
break;
- case GF_MAKE_TRAP:
- strcpy(r, "trap creation");
- break;
case GF_DESTRUCTION:
strcpy(r, "destruction");
break;
@@ -9048,8 +8772,7 @@ static void describe_attack_fully(int type, char* r)
* Give a randomly-generated spell a name.
* Note that it only describes the first effect!
*/
-
-static void name_spell(random_spell* s_ptr)
+std::string name_spell(random_spell const *s_ptr)
{
char buff[30];
cptr buff2 = "???";
@@ -9080,141 +8803,114 @@ static void name_spell(random_spell* s_ptr)
}
describe_attack_fully(s_ptr->GF, buff);
- strnfmt(s_ptr->name, 30, "%s - %s", buff2, buff);
+ return fmt::format("{:s} - {:s}", buff2, buff);
}
void generate_spell(int plev)
{
- random_spell* rspell;
- int dice, sides, chance, mana, power;
- bool_ destruc_gen = FALSE;
- bool_ simple_gen = TRUE;
- bool_ ball_desc = FALSE;
-
- if (spell_num == MAX_SPELLS) return;
-
- rspell = &random_spells[spell_num];
-
- power = rand_int(5);
-
- dice = plev / 2;
- sides = plev;
- mana = plev;
-
- /* Make the spell more or less powerful. */
- dice += power;
- sides += power;
- mana += (plev * power) / 15;
+ auto &random_spells = p_ptr->random_spells;
- /* Stay within reasonable bounds. */
- if (dice < 1) dice = 1;
+ assert(random_spells.size() < MAX_SPELLS);
- if (sides < 5) sides = 5;
+ bool destruc_gen = false;
+ bool simple_gen = true;
+ bool ball_desc = false;
- if (mana < 1) mana = 1;
+ // Calculate power, dice, etc.
+ int const power = rand_int(5);
+ int const dice = std::max(1, (plev / 2) + power);
+ int const sides = std::max(5, plev + power);
+ int const mana = std::max(1, plev + (plev * power) / 15);
- rspell->level = plev;
- rspell->mana = mana;
- rspell->untried = TRUE;
+ // Create spell
+ random_spell rspell;
+ rspell.level = plev;
+ rspell.mana = mana;
+ rspell.untried = true;
- /* Spells are always maximally destructive. */
- rspell->proj_flags = PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID;
+ // Spells are always maximally destructive
+ rspell.proj_flags = PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID;
- chance = randint(100);
+ // Roll the dice as to the "type" of spell
+ int chance = randint(100);
- /* Hack -- Always start with Magic Missile or derivative at lev. 1 */
+ // We always start with Magic Missile or derivative at level 1
if (plev == 1 || chance < 25)
{
- rspell->proj_flags |= PROJECT_STOP;
- /* Swap dice and sides for better damage */
- rspell->dam_dice = sides;
- rspell->dam_sides = dice;
- rspell->radius = 0;
+ // Swap dice and sides for better damage
+ rspell.proj_flags |= PROJECT_STOP;
+ rspell.dam_dice = sides;
+ rspell.dam_sides = dice;
+ rspell.radius = 0;
}
else if (chance < 50)
{
- rspell->proj_flags |= PROJECT_BEAM;
- rspell->dam_dice = dice;
- rspell->dam_sides = sides;
- rspell->radius = 0;
+ rspell.proj_flags |= PROJECT_BEAM;
+ rspell.dam_dice = dice;
+ rspell.dam_sides = sides;
+ rspell.radius = 0;
}
else if (chance < 76)
{
- rspell->proj_flags |= PROJECT_STOP;
- rspell->radius = dice / 3;
- rspell->dam_dice = dice;
- rspell->dam_sides = sides;
- ball_desc = TRUE;
+ rspell.proj_flags |= PROJECT_STOP;
+ rspell.radius = dice / 3;
+ rspell.dam_dice = dice;
+ rspell.dam_sides = sides;
+ ball_desc = true;
}
else if (chance < 83)
{
- rspell->proj_flags |= PROJECT_BLAST;
- rspell->radius = sides / 3;
- rspell->dam_dice = dice;
- rspell->dam_sides = sides;
+ rspell.proj_flags |= PROJECT_BLAST;
+ rspell.radius = sides / 3;
+ rspell.dam_dice = dice;
+ rspell.dam_sides = sides;
- destruc_gen = TRUE;
- simple_gen = FALSE;
+ destruc_gen = true;
+ simple_gen = false;
}
else if (chance < 90)
{
- rspell->proj_flags |= PROJECT_METEOR_SHOWER;
- /* Area effect spells do way less damage "per shot" */
- rspell->dam_dice = dice / 5;
- rspell->dam_sides = sides / 5;
- rspell->radius = sides / 3;
- if (rspell->radius < 4) rspell->radius = 4;
+ // Area effect spells do way less damage "per shot"
+ rspell.proj_flags |= PROJECT_METEOR_SHOWER;
+ rspell.dam_dice = dice / 5;
+ rspell.dam_sides = sides / 5;
+ rspell.radius = std::max(4, sides / 3);
- destruc_gen = TRUE;
+ destruc_gen = true;
}
else
{
- rspell->proj_flags |= PROJECT_VIEWABLE;
- /* View spells do less damage */
- rspell->dam_dice = dice;
- rspell->dam_sides = sides / 2;
+ // View spells do less damage
+ rspell.proj_flags |= PROJECT_VIEWABLE;
+ rspell.dam_dice = dice;
+ rspell.dam_sides = sides / 2;
}
- /* Both a destructive and a simple spell requested --
- * pick one or the other. */
+ // Both a destructive and a simple spell requested; pick one or the other
if (destruc_gen && simple_gen)
{
if (magik(25))
{
- simple_gen = FALSE;
+ simple_gen = false;
}
else
{
- destruc_gen = FALSE;
+ destruc_gen = false;
}
}
- /* Pick a simple spell */
+ // Choose the appropriate GF
if (simple_gen)
{
- rspell->GF = attack_types[rand_int(25)];
- }
- /* Pick a destructive spell */
- else
- {
- rspell->GF = destructive_attack_types[rand_int(10)];
- }
-
- /* Give the spell a name. */
- name_spell(rspell);
- if (ball_desc)
- {
- /* 30 character limit on the string! */
- sprintf(rspell->desc, "Dam: %d, Rad: %d, Pow: %d",
- sides, dice, power);
+ rspell.GF = attack_types[rand_int(25)];
}
else
{
- sprintf(rspell->desc, "Damage: %dd%d, Power: %d",
- dice, sides, power);
+ rspell.GF = destructive_attack_types[rand_int(10)];
}
- spell_num++;
+ // Add
+ random_spells.emplace_back(rspell);
}
/*
diff --git a/src/spells1.hpp b/src/spells1.hpp
index 5512063f..ec8f2cc9 100644
--- a/src/spells1.hpp
+++ b/src/spells1.hpp
@@ -1,32 +1,35 @@
#pragma once
+#include <string>
+
#include "h-basic.h"
+#include "random_spell_fwd.hpp"
-extern byte spell_color(int type);
-extern s16b poly_r_idx(int r_idx);
-extern void get_pos_player(int dis, int *ny, int *nx);
+byte spell_color(int type);
+s16b poly_r_idx(int r_idx);
+void get_pos_player(int dis, int *ny, int *nx);
extern bool_ teleport_player_bypass;
-extern void teleport_player_directed(int rad, int dir);
-extern void teleport_away(int m_idx, int dis);
-extern void teleport_player(int dis);
-extern void teleport_player_to(int ny, int nx);
-extern void teleport_monster_to(int m_idx, int ny, int nx);
-extern void teleport_player_level(void);
-extern void recall_player(int d, int f);
-extern void take_hit(int damage, cptr kb_str);
-extern void take_sanity_hit(int damage, cptr hit_from);
-extern void acid_dam(int dam, cptr kb_str);
-extern void elec_dam(int dam, cptr kb_str);
-extern void fire_dam(int dam, cptr kb_str);
-extern void cold_dam(int dam, cptr kb_str);
-extern bool_ dec_stat(int stat, int amount, int mode);
-extern bool_ res_stat(int stat, bool_ full);
-extern bool_ apply_disenchant(int mode);
-extern bool_ project_m(int who, int r, int y, int x, int dam, int typ);
-extern bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg);
-extern bool_ potion_smash_effect(int who, int y, int x, int o_sval);
-extern void do_poly_self(void);
-extern void corrupt_player(void);
-extern void generate_spell(int plev);
-extern bool_ unsafe;
-extern s16b do_poly_monster(int y, int x);
+void teleport_player_directed(int rad, int dir);
+void teleport_away(int m_idx, int dis);
+void teleport_player(int dis);
+void teleport_player_to(int ny, int nx);
+void teleport_monster_to(int m_idx, int ny, int nx);
+void teleport_player_level();
+void recall_player(int d, int f);
+void take_hit(int damage, cptr kb_str);
+void take_sanity_hit(int damage, cptr hit_from);
+void acid_dam(int dam, cptr kb_str);
+void elec_dam(int dam, cptr kb_str);
+void fire_dam(int dam, cptr kb_str);
+void cold_dam(int dam, cptr kb_str);
+bool_ dec_stat(int stat, int amount, int mode);
+bool_ res_stat(int stat, bool_ full);
+bool_ apply_disenchant(int mode);
+bool_ project_m(int who, int r, int y, int x, int dam, int typ);
+bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg);
+bool_ potion_smash_effect(int who, int y, int x, int o_sval);
+void do_poly_self();
+void corrupt_player();
+std::string name_spell(random_spell const *);
+void generate_spell(int plev);
+s16b do_poly_monster(int y, int x);
diff --git a/src/spells2.cc b/src/spells2.cc
index 08a643c9..c0d435ea 100644
--- a/src/spells2.cc
+++ b/src/spells2.cc
@@ -12,22 +12,29 @@
#include "cave_type.hpp"
#include "cmd1.hpp"
#include "cmd7.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hook_identify_in.hpp"
#include "hooks.hpp"
#include "melee2.hpp"
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
#include "monster_type.hpp"
#include "notes.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "object_type.hpp"
#include "options.hpp"
+#include "player_race_flag.hpp"
#include "player_type.hpp"
#include "skills.hpp"
#include "spells1.hpp"
@@ -72,8 +79,8 @@ void grow_things(s16b type, int rad)
for (a = 0; a < rad * rad + 11; a++)
{
- i = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2;
- j = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2;
+ i = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2;
+ j = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2;
if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue;
if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue;
@@ -90,17 +97,19 @@ void grow_things(s16b type, int rad)
*/
void grow_trees(int rad)
{
+ auto const &f_info = game->edit_data.f_info;
+
int a, i, j;
for (a = 0; a < rad * rad + 11; a++)
{
- i = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2;
- j = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2;
+ i = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2;
+ j = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2;
if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue;
if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue;
- if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_SUPPORT_GROWTH))
+ if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_SUPPORT_GROWTH))
{
cave_set_feat(p_ptr->py + j, p_ptr->px + i, FEAT_TREES);
}
@@ -112,17 +121,19 @@ void grow_trees(int rad)
*/
void grow_grass(int rad)
{
+ auto const &f_info = game->edit_data.f_info;
+
int a, i, j;
for (a = 0; a < rad * rad + 11; a++)
{
- i = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2;
- j = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2;
+ i = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2;
+ j = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2;
if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue;
if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue;
- if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_SUPPORT_GROWTH))
+ if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_SUPPORT_GROWTH))
{
cave_set_feat(p_ptr->py + j, p_ptr->px + i, FEAT_GRASS);
}
@@ -194,7 +205,7 @@ bool_ hp_player(int num)
/*
* Leave a "glyph of warding" which prevents monster movement
*/
-void warding_glyph(void)
+void warding_glyph()
{
/* XXX XXX XXX */
if (!cave_clean_bold(p_ptr->py, p_ptr->px))
@@ -207,7 +218,7 @@ void warding_glyph(void)
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_GLYPH);
}
-void explosive_rune(void)
+void explosive_rune()
{
/* XXX XXX XXX */
if (!cave_clean_bold(p_ptr->py, p_ptr->px))
@@ -465,7 +476,7 @@ void identify_hooks(int i, object_type *o_ptr, identify_mode mode)
* Identify everything being carried.
* Done by a potion of "self knowledge".
*/
-bool_ identify_pack(void)
+bool_ identify_pack()
{
int i;
@@ -507,7 +518,7 @@ static void make_item_fully_identified(object_type *o_ptr)
* Identify everything being carried.
* Done by a potion of "self knowledge".
*/
-void identify_pack_fully(void)
+void identify_pack_fully()
{
int i;
@@ -544,8 +555,6 @@ static int enchant_table[16] =
static bool_ remove_curse_object(object_type *o_ptr, bool_ all)
{
- u32b f1, f2, f3, f4, f5, esp;
-
/* Skip non-objects */
if (!o_ptr->k_idx) return FALSE;
@@ -553,13 +562,13 @@ static bool_ remove_curse_object(object_type *o_ptr, bool_ all)
if (!cursed_p(o_ptr)) return FALSE;
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Heavily Cursed Items need a special spell */
- if (!all && (f3 & (TR3_HEAVY_CURSE))) return FALSE;
+ if (!all && (flags & TR_HEAVY_CURSE)) return FALSE;
/* Perma-Cursed Items can NEVER be uncursed */
- if (f3 & (TR3_PERMA_CURSE)) return FALSE;
+ if (flags & TR_PERMA_CURSE) return FALSE;
/* Uncurse it */
o_ptr->ident &= ~(IDENT_CURSED);
@@ -567,11 +576,9 @@ static bool_ remove_curse_object(object_type *o_ptr, bool_ all)
/* Hack -- Assume felt */
o_ptr->ident |= (IDENT_SENSE);
- if (o_ptr->art_flags3 & (TR3_CURSED))
- o_ptr->art_flags3 &= ~(TR3_CURSED);
-
- if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE))
- o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
+ /* Strip curse flags */
+ o_ptr->art_flags &= ~TR_CURSED;
+ o_ptr->art_flags &= ~TR_HEAVY_CURSE;
/* Take note */
o_ptr->sense = SENSE_UNCURSED;
@@ -634,7 +641,7 @@ static int remove_curse_aux(int all)
/*
* Remove most curses
*/
-bool_ remove_curse(void)
+bool_ remove_curse()
{
return (remove_curse_aux(FALSE) ? TRUE : FALSE);
}
@@ -642,7 +649,7 @@ bool_ remove_curse(void)
/*
* Remove all curses
*/
-bool_ remove_all_curse(void)
+bool_ remove_all_curse()
{
return (remove_curse_aux(TRUE) ? TRUE : FALSE);
}
@@ -652,7 +659,7 @@ bool_ remove_all_curse(void)
/*
* Restores any drained experience
*/
-bool_ restore_level(void)
+bool_ restore_level()
{
/* Restore experience */
if (p_ptr->exp < p_ptr->max_exp)
@@ -675,7 +682,7 @@ bool_ restore_level(void)
}
-bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a shop */
+bool_ alchemy() /* Turns an object into gold, gain some of its value in a shop */
{
int item, amt = 1;
int old_number;
@@ -726,7 +733,7 @@ bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a sh
}
/* Artifacts cannot be destroyed */
- if (artifact_p(o_ptr) || o_ptr->art_name)
+ if (artifact_p(o_ptr))
{
byte feel = SENSE_SPECIAL;
@@ -782,1014 +789,6 @@ bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a sh
-
-/*
- * self-knowledge... idea from nethack. Useful for determining powers and
- * resistances of items. It saves the screen, clears it, then starts listing
- * attributes, a screenful at a time. (There are a LOT of attributes to
- * list. It will probably take 2 or 3 screens for a powerful character whose
- * using several artifacts...) -CFT
- *
- * It is now a lot more efficient. -BEN-
- *
- * See also "identify_fully()".
- *
- * XXX XXX XXX Use the "show_file()" method, perhaps.
- */
-void self_knowledge(FILE *fff)
-{
- int i = 0, j, k;
-
- u32b f1 = 0L, f2 = 0L, f3 = 0L, f4 = 0L, f5 = 0L, esp = 0L;
-
- int iter; /* Iterator for a loop */
-
- object_type *o_ptr;
-
- char Dummy[80];
-
- cptr info[200];
-
- strcpy (Dummy, "");
-
- /* Acquire item flags from equipment */
- for (k = INVEN_WIELD; k < INVEN_TOTAL; k++)
- {
- u32b t1, t2, t3, t4, t5, esp;
-
- o_ptr = &p_ptr->inventory[k];
-
- /* Skip non-objects */
- if (!o_ptr->k_idx) continue;
-
- /* Extract the flags */
- object_flags(o_ptr, &t1, &t2, &t3, &t4, &t5, &esp);
-
- /* Extract flags */
- f1 |= t1;
- f2 |= t2;
- f3 |= t3;
- }
-
- if (death)
- {
- static char buf[250];
-
- sprintf(buf, "You are dead, killed by %s %s.",
- died_from, describe_player_location());
- info[i++] = buf;
- }
-
- /* Racial powers... */
- if (p_ptr->body_monster != 0)
- {
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
-
- if (r_ptr->flags1 & RF1_CHAR_CLEAR ||
- r_ptr->flags1 & RF1_ATTR_CLEAR)
- info[i++] = "You are transparent.";
- if ((r_ptr->flags1 & RF1_CHAR_MULTI) ||
- (r_ptr->flags2 & RF2_SHAPECHANGER))
- info[i++] = "Your form constantly changes.";
- if (r_ptr->flags1 & RF1_ATTR_MULTI)
- info[i++] = "Your color constantly changes.";
- if (r_ptr->flags1 & RF1_NEVER_BLOW)
- info[i++] = "You do not have a physical weapon.";
- if (r_ptr->flags1 & RF1_NEVER_MOVE)
- info[i++] = "You cannot move.";
- if ((r_ptr->flags1 & RF1_RAND_25) &&
- (r_ptr->flags1 & RF1_RAND_50))
- info[i++] = "You move extremely erratically.";
- else if (r_ptr->flags1 & RF1_RAND_50)
- info[i++] = "You move somewhat erratically.";
- else if (r_ptr->flags1 & RF1_RAND_25)
- info[i++] = "You move a bit erratically.";
- if (r_ptr->flags2 & RF2_STUPID)
- info[i++] = "You are very stupid (INT -4).";
- if (r_ptr->flags2 & RF2_SMART)
- info[i++] = "You are very smart (INT +4).";
- /* Not implemented */
- if (r_ptr->flags2 & RF2_CAN_SPEAK)
- info[i++] = "You can speak.";
- else
- info[i++] = "You cannot speak.";
- /* Not implemented */
- if (r_ptr->flags2 & RF2_COLD_BLOOD)
- info[i++] = "You are cold blooded.";
- /* Not implemented */
- if (r_ptr->flags2 & RF2_EMPTY_MIND)
- info[i++] = "You have an empty mind.";
- if (r_ptr->flags2 & RF2_WEIRD_MIND)
- info[i++] = "You have a weird mind.";
- if (r_ptr->flags4 & RF4_MULTIPLY)
- info[i++] = "You can multiply.";
- if (r_ptr->flags2 & RF2_POWERFUL)
- info[i++] = "You have strong breath.";
- /* Not implemented */
- if (r_ptr->flags2 & RF2_ELDRITCH_HORROR)
- info[i++] = "You are an eldritch horror.";
- if (r_ptr->flags2 & RF2_OPEN_DOOR)
- info[i++] = "You can open doors.";
- else
- info[i++] = "You cannot open doors.";
- if (r_ptr->flags2 & RF2_BASH_DOOR)
- info[i++] = "You can bash doors.";
- else
- info[i++] = "You cannot bash doors.";
- if (r_ptr->flags2 & RF2_PASS_WALL)
- info[i++] = "You can pass walls.";
- if (r_ptr->flags2 & RF2_KILL_WALL)
- info[i++] = "You destroy walls.";
- /* Not implemented */
- if (r_ptr->flags2 & RF2_MOVE_BODY)
- info[i++] = "You can move monsters.";
- /* Not implemented */
- if (r_ptr->flags3 & RF3_ORC)
- info[i++] = "You have orc blood in your veins.";
- /* Not implemented */
- else if (r_ptr->flags3 & RF3_TROLL)
- info[i++] = "You have troll blood in your veins.";
- /* Not implemented */
- else if (r_ptr->flags3 & RF3_GIANT)
- info[i++] = "You have giant blood in your veins.";
- /* Not implemented */
- else if (r_ptr->flags3 & RF3_DRAGON)
- info[i++] = "You have dragon blood in your veins.";
- /* Not implemented */
- else if (r_ptr->flags3 & RF3_DEMON)
- info[i++] = "You have demon blood in your veins.";
- /* Not implemented */
- else if (r_ptr->flags3 & RF3_UNDEAD)
- info[i++] = "You are an undead.";
- /* Not implemented */
- else if (r_ptr->flags3 & RF3_ANIMAL)
- info[i++] = "You are an animal.";
- /* Not implemented */
- else if (r_ptr->flags3 & RF3_THUNDERLORD)
- info[i++] = "You have thunderlord blood in your veins.";
- if (r_ptr->flags3 & RF3_EVIL)
- info[i++] = "You are inherently evil.";
- else if (r_ptr->flags3 & RF3_GOOD)
- info[i++] = "You are inherently good.";
- if (r_ptr->flags3 & RF3_AURA_COLD)
- info[i++] = "You are surrounded by a chilly aura.";
- /* Not implemented */
- if (r_ptr->flags3 & RF3_NONLIVING)
- info[i++] = "You are not living.";
- /* Not implemented */
- if (r_ptr->flags3 & RF3_HURT_LITE)
- info[i++] = "Your eyes are vulnerable to bright light.";
- /* Not implemented */
- if (r_ptr->flags3 & RF3_HURT_ROCK)
- info[i++] = "You can be hurt by rock remover.";
- if (r_ptr->flags3 & RF3_SUSCEP_FIRE)
- info[i++] = "You are vulnerable to fire.";
- if (r_ptr->flags3 & RF3_SUSCEP_COLD)
- info[i++] = "You are vulnerable to cold.";
- if (r_ptr->flags3 & RF3_RES_TELE)
- info[i++] = "You are resistant to teleportation.";
- if (r_ptr->flags3 & RF3_RES_NETH)
- info[i++] = "You are resistant to nether.";
- if (r_ptr->flags3 & RF3_RES_WATE)
- info[i++] = "You are resistant to water.";
- if (r_ptr->flags3 & RF3_RES_PLAS)
- info[i++] = "You are resistant to plasma.";
- if (r_ptr->flags3 & RF3_RES_WATE)
- info[i++] = "You are resistant to nexus.";
- if (r_ptr->flags3 & RF3_RES_DISE)
- info[i++] = "You are resistant to disease.";
- /* Not implemented */
- if (r_ptr->flags3 & RF3_NO_SLEEP)
- info[i++] = "You cannot be slept.";
- /* Not implemented */
- if (r_ptr->flags3 & RF3_UNIQUE_4)
- info[i++] = "You are a Nazgul.";
- if (r_ptr->flags3 & RF3_NO_FEAR)
- info[i++] = "You are immune to fear.";
- if (r_ptr->flags3 & RF3_NO_STUN)
- info[i++] = "You are immune to stun.";
- if (r_ptr->flags3 & RF3_NO_CONF)
- info[i++] = "You are immune to confusion.";
- if (r_ptr->flags3 & RF3_NO_SLEEP)
- info[i++] = "You are immune to sleep.";
-
- if (r_ptr->flags4 & RF4_SHRIEK)
- info[i++] = "You can aggravate monsters.";
- if (r_ptr->flags4 & RF4_ROCKET)
- info[i++] = "You can fire a rocket.";
- if (r_ptr->flags4 & RF4_ARROW_1)
- info[i++] = "You can fire a light arrow.";
- if (r_ptr->flags4 & RF4_ARROW_2)
- info[i++] = "You can fire a heavy arrow.";
- if (r_ptr->flags4 & RF4_ARROW_3)
- info[i++] = "You can fire a light missile.";
- if (r_ptr->flags4 & RF4_ARROW_4)
- info[i++] = "You can fire a heavy missile.";
- if (r_ptr->flags4 & RF4_BR_ACID)
- info[i++] = "You can breathe acid.";
- if (r_ptr->flags4 & RF4_BR_ELEC)
- info[i++] = "You can breathe electricity.";
- if (r_ptr->flags4 & RF4_BR_FIRE)
- info[i++] = "You can breathe fire.";
- if (r_ptr->flags4 & RF4_BR_COLD)
- info[i++] = "You can breathe cold.";
- if (r_ptr->flags4 & RF4_BR_POIS)
- info[i++] = "You can breathe poison.";
- if (r_ptr->flags4 & RF4_BR_NETH)
- info[i++] = "You can breathe nether.";
- if (r_ptr->flags4 & RF4_BR_LITE)
- info[i++] = "You can breathe light.";
- if (r_ptr->flags4 & RF4_BR_DARK)
- info[i++] = "You can breathe darkness.";
- if (r_ptr->flags4 & RF4_BR_CONF)
- info[i++] = "You can breathe confusion.";
- if (r_ptr->flags4 & RF4_BR_SOUN)
- info[i++] = "You can breathe sound.";
- if (r_ptr->flags4 & RF4_BR_CHAO)
- info[i++] = "You can breathe chaos.";
- if (r_ptr->flags4 & RF4_BR_DISE)
- info[i++] = "You can breathe disenchantment.";
- if (r_ptr->flags4 & RF4_BR_NEXU)
- info[i++] = "You can breathe nexus.";
- if (r_ptr->flags4 & RF4_BR_TIME)
- info[i++] = "You can breathe time.";
- if (r_ptr->flags4 & RF4_BR_INER)
- info[i++] = "You can breathe inertia.";
- if (r_ptr->flags4 & RF4_BR_GRAV)
- info[i++] = "You can breathe gravity.";
- if (r_ptr->flags4 & RF4_BR_SHAR)
- info[i++] = "You can breathe shards.";
- if (r_ptr->flags4 & RF4_BR_PLAS)
- info[i++] = "You can breathe plasma.";
- if (r_ptr->flags4 & RF4_BR_WALL)
- info[i++] = "You can breathe force.";
- if (r_ptr->flags4 & RF4_BR_MANA)
- info[i++] = "You can breathe mana.";
- if (r_ptr->flags4 & RF4_BR_NUKE)
- info[i++] = "You can breathe nuke.";
- if (r_ptr->flags4 & RF4_BR_DISI)
- info[i++] = "You can breathe disintegration.";
- if (r_ptr->flags5 & RF5_BA_ACID)
- info[i++] = "You can cast a ball of acid.";
- if (r_ptr->flags5 & RF5_BA_ELEC)
- info[i++] = "You can cast a ball of electricity.";
- if (r_ptr->flags5 & RF5_BA_FIRE)
- info[i++] = "You can cast a ball of fire.";
- if (r_ptr->flags5 & RF5_BA_COLD)
- info[i++] = "You can cast a ball of cold.";
- if (r_ptr->flags5 & RF5_BA_POIS)
- info[i++] = "You can cast a ball of poison.";
- if (r_ptr->flags5 & RF5_BA_NETH)
- info[i++] = "You can cast a ball of nether.";
- if (r_ptr->flags5 & RF5_BA_WATE)
- info[i++] = "You can cast a ball of water.";
- /* Not implemented */
- if (r_ptr->flags5 & RF5_DRAIN_MANA)
- info[i++] = "You can drain mana.";
- if (r_ptr->flags5 & RF5_MIND_BLAST)
- info[i++] = "You can cause mind blasting.";
- if (r_ptr->flags5 & RF5_BRAIN_SMASH)
- info[i++] = "You can cause brain smashing.";
- if (r_ptr->flags5 & RF5_CAUSE_1)
- info[i++] = "You can cause light wounds.";
- if (r_ptr->flags5 & RF5_CAUSE_2)
- info[i++] = "You can cause serious wounds.";
- if (r_ptr->flags5 & RF5_CAUSE_3)
- info[i++] = "You can cause critical wounds.";
- if (r_ptr->flags5 & RF5_CAUSE_4)
- info[i++] = "You can cause mortal wounds.";
- if (r_ptr->flags5 & RF5_BO_ACID)
- info[i++] = "You can cast a bolt of acid.";
- if (r_ptr->flags5 & RF5_BO_ELEC)
- info[i++] = "You can cast a bolt of electricity.";
- if (r_ptr->flags5 & RF5_BO_FIRE)
- info[i++] = "You can cast a bolt of fire.";
- if (r_ptr->flags5 & RF5_BO_COLD)
- info[i++] = "You can cast a bolt of cold.";
- if (r_ptr->flags5 & RF5_BO_POIS)
- info[i++] = "You can cast a bolt of poison.";
- if (r_ptr->flags5 & RF5_BO_NETH)
- info[i++] = "You can cast a bolt of nether.";
- if (r_ptr->flags5 & RF5_BO_WATE)
- info[i++] = "You can cast a bolt of water.";
- if (r_ptr->flags5 & RF5_BO_MANA)
- info[i++] = "You can cast a bolt of mana.";
- if (r_ptr->flags5 & RF5_BO_PLAS)
- info[i++] = "You can cast a bolt of plasma.";
- if (r_ptr->flags5 & RF5_BO_ICEE)
- info[i++] = "You can cast a bolt of ice.";
- if (r_ptr->flags5 & RF5_MISSILE)
- info[i++] = "You can cast magic missile.";
- if (r_ptr->flags5 & RF5_SCARE)
- info[i++] = "You can terrify.";
- if (r_ptr->flags5 & RF5_BLIND)
- info[i++] = "You can blind.";
- if (r_ptr->flags5 & RF5_CONF)
- info[i++] = "You can use confusion.";
- if (r_ptr->flags5 & RF5_SLOW)
- info[i++] = "You can cast slow.";
- if (r_ptr->flags5 & RF5_HOLD)
- info[i++] = "You can touch to paralyze.";
- if (r_ptr->flags6 & RF6_HASTE)
- info[i++] = "You can haste yourself.";
- if (r_ptr->flags6 & RF6_HAND_DOOM)
- info[i++] = "You can invoke Hand of Doom.";
- if (r_ptr->flags6 & RF6_HEAL)
- info[i++] = "You can heal yourself.";
- if (r_ptr->flags6 & RF6_BLINK)
- info[i++] = "You can blink.";
- if (r_ptr->flags6 & RF6_TPORT)
- info[i++] = "You can teleport.";
- if (r_ptr->flags6 & RF6_TELE_TO)
- info[i++] = "You can go between places.";
- if (r_ptr->flags6 & RF6_TELE_AWAY)
- info[i++] = "You can teleport away.";
- if (r_ptr->flags6 & RF6_TELE_LEVEL)
- info[i++] = "You can teleport level.";
- if (r_ptr->flags6 & RF6_DARKNESS)
- info[i++] = "You can create darkness.";
- if (r_ptr->flags6 & RF6_TRAPS)
- info[i++] = "You can create traps.";
- /* Not implemented */
- if (r_ptr->flags6 & RF6_FORGET)
- info[i++] = "You can fade memories.";
- if (r_ptr->flags6 & RF6_RAISE_DEAD)
- info[i++] = "You can Raise the Dead.";
- if (r_ptr->flags6 & RF6_S_BUG)
- info[i++] = "You can magically summon a Software Bugs.";
- if (r_ptr->flags6 & RF6_S_RNG)
- info[i++] = "You can magically summon the RNG.";
- if (r_ptr->flags6 & RF6_S_THUNDERLORD)
- info[i++] = "You can magically summon some Thunderlords.";
- if (r_ptr->flags6 & RF6_S_KIN)
- info[i++] = "You can magically summon some Kins.";
- if (r_ptr->flags6 & RF6_S_HI_DEMON)
- info[i++] = "You can magically summon greater demons.";
- if (r_ptr->flags6 & RF6_S_MONSTER)
- info[i++] = "You can magically summon a monster.";
- if (r_ptr->flags6 & RF6_S_MONSTERS)
- info[i++] = "You can magically summon monsters.";
- if (r_ptr->flags6 & RF6_S_ANT)
- info[i++] = "You can magically summon ants.";
- if (r_ptr->flags6 & RF6_S_SPIDER)
- info[i++] = "You can magically summon spiders.";
- if (r_ptr->flags6 & RF6_S_HOUND)
- info[i++] = "You can magically summon hounds.";
- if (r_ptr->flags6 & RF6_S_HYDRA)
- info[i++] = "You can magically summon hydras.";
- if (r_ptr->flags6 & RF6_S_ANGEL)
- info[i++] = "You can magically summon an angel.";
- if (r_ptr->flags6 & RF6_S_DEMON)
- info[i++] = "You can magically summon a demon.";
- if (r_ptr->flags6 & RF6_S_UNDEAD)
- info[i++] = "You can magically summon an undead.";
- if (r_ptr->flags6 & RF6_S_DRAGON)
- info[i++] = "You can magically summon a dragon.";
- if (r_ptr->flags6 & RF6_S_HI_UNDEAD)
- info[i++] = "You can magically summon greater undead.";
- if (r_ptr->flags6 & RF6_S_HI_DRAGON)
- info[i++] = "You can magically summon greater dragons.";
- if (r_ptr->flags6 & RF6_S_WRAITH)
- info[i++] = "You can magically summon a wraith.";
- /* Not implemented */
- if (r_ptr->flags6 & RF6_S_UNIQUE)
- info[i++] = "You can magically summon an unique monster.";
- /* Not implemented */
- if (r_ptr->flags7 & RF7_AQUATIC)
- info[i++] = "You are aquatic.";
- /* Not implemented */
- if (r_ptr->flags7 & RF7_CAN_SWIM)
- info[i++] = "You can swim.";
- /* Not implemented */
- if (r_ptr->flags7 & RF7_CAN_FLY)
- info[i++] = "You can fly.";
- if ((r_ptr->flags7 & RF7_MORTAL) == 0)
- info[i++] = "You are immortal.";
- /* Not implemented */
- if (r_ptr->flags7 & RF7_NAZGUL)
- info[i++] = "You are a Nazgul.";
-
- if (r_ptr->flags7 & RF7_SPIDER)
- info[i++] = "You are a spider.";
-
- if (r_ptr->flags8 & RF8_WILD_TOWN)
- info[i++] = "You appear in towns.";
- if (r_ptr->flags8 & RF8_WILD_SHORE)
- info[i++] = "You appear on the shore.";
- if (r_ptr->flags8 & RF8_WILD_OCEAN)
- info[i++] = "You appear in the ocean.";
- if (r_ptr->flags8 & RF8_WILD_WASTE)
- info[i++] = "You appear in the waste.";
- if (r_ptr->flags8 & RF8_WILD_WOOD)
- info[i++] = "You appear in woods.";
- if (r_ptr->flags8 & RF8_WILD_VOLCANO)
- info[i++] = "You appear in volcanos.";
- if (r_ptr->flags8 & RF8_WILD_MOUNTAIN)
- info[i++] = "You appear in the mountains.";
- if (r_ptr->flags8 & RF8_WILD_GRASS)
- info[i++] = "You appear in grassy areas.";
-
- if (r_ptr->flags9 & RF9_SUSCEP_ACID)
- info[i++] = "You are vulnerable to acid.";
- if (r_ptr->flags9 & RF9_SUSCEP_ELEC)
- info[i++] = "You are vulnerable to electricity.";
- if (r_ptr->flags9 & RF9_SUSCEP_POIS)
- info[i++] = "You are vulnerable to poison.";
- if (r_ptr->flags9 & RF9_KILL_TREES)
- info[i++] = "You can eat trees.";
- if (r_ptr->flags9 & RF9_WYRM_PROTECT)
- info[i++] = "You are protected by great wyrms of power.";
- }
-
- /* List powers */
- for (iter = 0; iter < POWER_MAX; iter++)
- {
- if (p_ptr->powers[iter])
- {
- info[i++] = powers_type[iter].desc_text;
- }
- }
-
- if (p_ptr->allow_one_death)
- {
- info[i++] = "The Blood of Life flows through your veins.";
- }
- if (p_ptr->blind)
- {
- info[i++] = "You cannot see.";
- }
- if (p_ptr->confused)
- {
- info[i++] = "You are confused.";
- }
- if (p_ptr->afraid)
- {
- info[i++] = "You are terrified.";
- }
- if (p_ptr->cut)
- {
- info[i++] = "You are bleeding.";
- }
- if (p_ptr->stun)
- {
- info[i++] = "You are stunned.";
- }
- if (p_ptr->poisoned)
- {
- info[i++] = "You are poisoned.";
- }
- if (p_ptr->image)
- {
- info[i++] = "You are hallucinating.";
- }
- if (p_ptr->aggravate)
- {
- info[i++] = "You aggravate monsters.";
- }
- if (p_ptr->teleport)
- {
- info[i++] = "Your position is very uncertain.";
- }
- if (p_ptr->blessed)
- {
- info[i++] = "You feel righteous.";
- }
- if (p_ptr->hero)
- {
- info[i++] = "You feel heroic.";
- }
- if (p_ptr->shero)
- {
- info[i++] = "You are in a battle rage.";
- }
- if (p_ptr->protevil)
- {
- info[i++] = "You are protected from evil.";
- }
- if (p_ptr->protgood)
- {
- info[i++] = "You are protected from good.";
- }
- if (p_ptr->shield)
- {
- info[i++] = "You are protected by a mystic shield.";
- }
- if (p_ptr->invuln)
- {
- info[i++] = "You are temporarily invulnerable.";
- }
- if (p_ptr->confusing)
- {
- info[i++] = "Your hands are glowing dull red.";
- }
- if (p_ptr->searching)
- {
- info[i++] = "You are looking around very carefully.";
- }
- if (p_ptr->word_recall)
- {
- info[i++] = "You will soon be recalled.";
- }
- if (p_ptr->see_infra)
- {
- info[i++] = "Your eyes are sensitive to infrared light.";
- }
- if (p_ptr->see_inv)
- {
- info[i++] = "You can see invisible creatures.";
- }
- if (p_ptr->magical_breath)
- {
- info[i++] = "You can breathe without air.";
- }
- else if (p_ptr->water_breath)
- {
- info[i++] = "You can breathe underwater.";
- }
- if (p_ptr->ffall)
- {
- info[i++] = "You levitate just over the ground.";
- }
- if (p_ptr->climb)
- {
- info[i++] = "You can climb high mountains.";
- }
- if (p_ptr->free_act)
- {
- info[i++] = "You have free action.";
- }
- if (p_ptr->regenerate)
- {
- info[i++] = "You regenerate quickly.";
- }
- if (p_ptr->slow_digest)
- {
- info[i++] = "Your appetite is small.";
- }
- if (p_ptr->telepathy)
- {
- if (p_ptr->telepathy & ESP_ALL) info[i++] = "You have ESP.";
- else
- {
- if (p_ptr->telepathy & ESP_ORC) info[i++] = "You can sense the presence of orcs.";
- if (p_ptr->telepathy & ESP_TROLL) info[i++] = "You can sense the presence of trolls.";
- if (p_ptr->telepathy & ESP_DRAGON) info[i++] = "You can sense the presence of dragons.";
- if (p_ptr->telepathy & ESP_SPIDER) info[i++] = "You can sense the presence of spiders.";
- if (p_ptr->telepathy & ESP_GIANT) info[i++] = "You can sense the presence of giants.";
- if (p_ptr->telepathy & ESP_DEMON) info[i++] = "You can sense the presence of demons.";
- if (p_ptr->telepathy & ESP_UNDEAD) info[i++] = "You can sense presence of undead.";
- if (p_ptr->telepathy & ESP_EVIL) info[i++] = "You can sense the presence of evil beings.";
- if (p_ptr->telepathy & ESP_ANIMAL) info[i++] = "You can sense the presence of animals.";
- if (p_ptr->telepathy & ESP_THUNDERLORD) info[i++] = "You can sense the presence of thunderlords.";
- if (p_ptr->telepathy & ESP_GOOD) info[i++] = "You can sense the presence of good beings.";
- if (p_ptr->telepathy & ESP_NONLIVING) info[i++] = "You can sense the presence of non-living things.";
- if (p_ptr->telepathy & ESP_UNIQUE) info[i++] = "You can sense the presence of unique beings.";
- }
- }
- if (!luck( -100, 100))
- {
- info[i++] = "You have normal luck.";
- }
- else if (luck( -100, 100) < 0)
- {
- if (luck( -100, 100) < -90)
- {
- info[i++] = "You are incredibly unlucky.";
- }
- else if (luck( -100, 100) < -60)
- {
- info[i++] = "You are extremely unlucky.";
- }
- else if (luck( -100, 100) < -30)
- {
- info[i++] = "You are very unlucky.";
- }
- else
- {
- info[i++] = "You are unlucky.";
- }
- }
- else if (luck( -100, 100) > 0)
- {
- if (luck( -100, 100) > 90)
- {
- info[i++] = "You are incredibly lucky.";
- }
- else if (luck( -100, 100) > 60)
- {
- info[i++] = "You are extremely lucky.";
- }
- else if (luck( -100, 100) > 30)
- {
- info[i++] = "You are very lucky.";
- }
- else
- {
- info[i++] = "You are lucky.";
- }
- }
- if (p_ptr->auto_id)
- {
- info[i++] = "You know everything.";
- }
- if (p_ptr->hold_life)
- {
- info[i++] = "You have a firm hold on your life force.";
- }
- if (p_ptr->reflect)
- {
- info[i++] = "You reflect arrows and bolts.";
- }
- if (p_ptr->sh_fire)
- {
- info[i++] = "You are surrounded with a fiery aura.";
- }
- if (p_ptr->sh_elec)
- {
- info[i++] = "You are surrounded with electricity.";
- }
- if (p_ptr->antimagic)
- {
- info[i++] = "You are surrounded by an anti-magic field.";
- }
- if (p_ptr->anti_magic)
- {
- info[i++] = "You are surrounded by an anti-magic shell.";
- }
- if (p_ptr->wraith_form)
- {
- info[i++] = "You are incorporeal.";
- }
- if (p_ptr->anti_tele)
- {
- info[i++] = "You cannot teleport.";
- }
- if (p_ptr->lite)
- {
- info[i++] = "You are carrying a permanent light.";
- }
-
- if (p_ptr->immune_acid)
- {
- info[i++] = "You are completely immune to acid.";
- }
- else if ((p_ptr->resist_acid) && (p_ptr->oppose_acid))
- {
- info[i++] = "You resist acid exceptionally well.";
- }
- else if ((p_ptr->resist_acid) || (p_ptr->oppose_acid))
- {
- info[i++] = "You are resistant to acid.";
- }
-
- if (p_ptr->immune_elec)
- {
- info[i++] = "You are completely immune to lightning.";
- }
- else if ((p_ptr->resist_elec) && (p_ptr->oppose_elec))
- {
- info[i++] = "You resist lightning exceptionally well.";
- }
- else if ((p_ptr->resist_elec) || (p_ptr->oppose_elec))
- {
- info[i++] = "You are resistant to lightning.";
- }
-
- if (p_ptr->immune_fire)
- {
- info[i++] = "You are completely immune to fire.";
- }
- else if ((p_ptr->resist_fire) && (p_ptr->oppose_fire))
- {
- info[i++] = "You resist fire exceptionally well.";
- }
- else if ((p_ptr->resist_fire) || (p_ptr->oppose_fire))
- {
- info[i++] = "You are resistant to fire.";
- }
- else if (p_ptr->sensible_fire)
- {
- info[i++] = "You are very vulnerable to fire.";
- }
-
- if (p_ptr->immune_cold)
- {
- info[i++] = "You are completely immune to cold.";
- }
- else if ((p_ptr->resist_cold) && (p_ptr->oppose_cold))
- {
- info[i++] = "You resist cold exceptionally well.";
- }
- else if ((p_ptr->resist_cold) || (p_ptr->oppose_cold))
- {
- info[i++] = "You are resistant to cold.";
- }
-
- if ((p_ptr->resist_pois) && (p_ptr->oppose_pois))
- {
- info[i++] = "You resist poison exceptionally well.";
- }
- else if ((p_ptr->resist_pois) || (p_ptr->oppose_pois))
- {
- info[i++] = "You are resistant to poison.";
- }
-
- if (p_ptr->resist_lite)
- {
- info[i++] = "You are resistant to bright light.";
- }
- if (p_ptr->resist_dark)
- {
- info[i++] = "You are resistant to darkness.";
- }
- if (p_ptr->resist_conf)
- {
- info[i++] = "You are resistant to confusion.";
- }
- if (p_ptr->resist_sound)
- {
- info[i++] = "You are resistant to sonic attacks.";
- }
- if (p_ptr->resist_disen)
- {
- info[i++] = "You are resistant to disenchantment.";
- }
- if (p_ptr->resist_chaos)
- {
- info[i++] = "You are resistant to chaos.";
- }
- if (p_ptr->resist_shard)
- {
- info[i++] = "You are resistant to blasts of shards.";
- }
- if (p_ptr->resist_nexus)
- {
- info[i++] = "You are resistant to nexus attacks.";
- }
- if (p_ptr->immune_neth)
- {
- info[i++] = "You are immune to nether forces.";
- }
- else if (p_ptr->resist_neth)
- {
- info[i++] = "You are resistant to nether forces.";
- }
- if (p_ptr->resist_fear)
- {
- info[i++] = "You are completely fearless.";
- }
- if (p_ptr->resist_blind)
- {
- info[i++] = "Your eyes are resistant to blindness.";
- }
- if (p_ptr->resist_continuum)
- {
- info[i++] = "The space-time continuum cannot be disrupted near you.";
- }
-
- if (p_ptr->sustain_str)
- {
- info[i++] = "Your strength is sustained.";
- }
- if (p_ptr->sustain_int)
- {
- info[i++] = "Your intelligence is sustained.";
- }
- if (p_ptr->sustain_wis)
- {
- info[i++] = "Your wisdom is sustained.";
- }
- if (p_ptr->sustain_con)
- {
- info[i++] = "Your constitution is sustained.";
- }
- if (p_ptr->sustain_dex)
- {
- info[i++] = "Your dexterity is sustained.";
- }
- if (p_ptr->sustain_chr)
- {
- info[i++] = "Your charisma is sustained.";
- }
- if (p_ptr->black_breath)
- {
- info[i++] = "You suffer from Black Breath.";
- }
-
- if (f1 & (TR1_STR))
- {
- info[i++] = "Your strength is affected by your equipment.";
- }
- if (f1 & (TR1_INT))
- {
- info[i++] = "Your intelligence is affected by your equipment.";
- }
- if (f1 & (TR1_WIS))
- {
- info[i++] = "Your wisdom is affected by your equipment.";
- }
- if (f1 & (TR1_DEX))
- {
- info[i++] = "Your dexterity is affected by your equipment.";
- }
- if (f1 & (TR1_CON))
- {
- info[i++] = "Your constitution is affected by your equipment.";
- }
- if (f1 & (TR1_CHR))
- {
- info[i++] = "Your charisma is affected by your equipment.";
- }
-
- if (f1 & (TR1_STEALTH))
- {
- info[i++] = "Your stealth is affected by your equipment.";
- }
- if (f1 & (TR1_SEARCH))
- {
- info[i++] = "Your searching ability is affected by your equipment.";
- }
- if (f1 & (TR1_INFRA))
- {
- info[i++] = "Your infravision is affected by your equipment.";
- }
- if (f1 & (TR1_TUNNEL))
- {
- info[i++] = "Your digging ability is affected by your equipment.";
- }
- if (f1 & (TR1_SPEED))
- {
- info[i++] = "Your speed is affected by your equipment.";
- }
- if (f1 & (TR1_BLOWS))
- {
- info[i++] = "Your attack speed is affected by your equipment.";
- }
- if (f5 & (TR5_CRIT))
- {
- info[i++] = "Your ability to score critical hits is affected by your equipment.";
- }
-
-
- /* Access the current weapon */
- o_ptr = &p_ptr->inventory[INVEN_WIELD];
-
- /* Analyze the weapon */
- if (o_ptr->k_idx)
- {
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- /* Indicate Blessing */
- if (f3 & (TR3_BLESSED))
- {
- info[i++] = "Your weapon has been blessed by the gods.";
- }
-
- if (f1 & (TR1_CHAOTIC))
- {
- info[i++] = "Your weapon is branded with the Sign of Chaos.";
- }
-
- /* Hack */
- if (f1 & (TR1_IMPACT))
- {
- info[i++] = "The impact of your weapon can cause earthquakes.";
- }
-
- if (f1 & (TR1_VORPAL))
- {
- info[i++] = "Your weapon is very sharp.";
- }
-
- if (f1 & (TR1_VAMPIRIC))
- {
- info[i++] = "Your weapon drains life from your foes.";
- }
-
- /* Special "Attack Bonuses" */
- if (f1 & (TR1_BRAND_ACID))
- {
- info[i++] = "Your weapon melts your foes.";
- }
- if (f1 & (TR1_BRAND_ELEC))
- {
- info[i++] = "Your weapon shocks your foes.";
- }
- if (f1 & (TR1_BRAND_FIRE))
- {
- info[i++] = "Your weapon burns your foes.";
- }
- if (f1 & (TR1_BRAND_COLD))
- {
- info[i++] = "Your weapon freezes your foes.";
- }
- if (f1 & (TR1_BRAND_POIS))
- {
- info[i++] = "Your weapon poisons your foes.";
- }
-
- /* Special "slay" flags */
- if (f1 & (TR1_SLAY_ANIMAL))
- {
- info[i++] = "Your weapon strikes at animals with extra force.";
- }
- if (f1 & (TR1_SLAY_EVIL))
- {
- info[i++] = "Your weapon strikes at evil with extra force.";
- }
- if (f1 & (TR1_SLAY_UNDEAD))
- {
- info[i++] = "Your weapon strikes at undead with holy wrath.";
- }
- if (f1 & (TR1_SLAY_DEMON))
- {
- info[i++] = "Your weapon strikes at demons with holy wrath.";
- }
- if (f1 & (TR1_SLAY_ORC))
- {
- info[i++] = "Your weapon is especially deadly against orcs.";
- }
- if (f1 & (TR1_SLAY_TROLL))
- {
- info[i++] = "Your weapon is especially deadly against trolls.";
- }
- if (f1 & (TR1_SLAY_GIANT))
- {
- info[i++] = "Your weapon is especially deadly against giants.";
- }
- if (f1 & (TR1_SLAY_DRAGON))
- {
- info[i++] = "Your weapon is especially deadly against dragons.";
- }
-
- /* Special "kill" flags */
- if (f1 & (TR1_KILL_DRAGON))
- {
- info[i++] = "Your weapon is a great bane of dragons.";
- }
- /* Special "kill" flags */
- if (f5 & (TR5_KILL_DEMON))
- {
- info[i++] = "Your weapon is a great bane of demons.";
- }
- /* Special "kill" flags */
- if (f5 & (TR5_KILL_UNDEAD))
- {
- info[i++] = "Your weapon is a great bane of undeads.";
- }
- }
-
- /* Print on screen or in a file ? */
- if (fff == NULL)
- {
- /* Save the screen */
- character_icky = TRUE;
- Term_save();
-
- /* Erase the screen */
- for (k = 1; k < 24; k++) prt("", k, 13);
-
- /* Label the information */
- prt(" Your Attributes:", 1, 15);
-
- /* We will print on top of the map (column 13) */
- for (k = 2, j = 0; j < i; j++)
- {
- /* Show the info */
- prt(info[j], k++, 15);
-
- /* Every 20 entries (lines 2 to 21), start over */
- if ((k == 22) && (j + 1 < i))
- {
- prt("-- more --", k, 15);
- inkey();
- for (; k > 2; k--) prt("", k, 15);
- }
- }
-
- /* Pause */
- prt("[Press any key to continue]", k, 13);
- inkey();
-
- /* Restore the screen */
- Term_load();
- character_icky = FALSE;
- }
- else
- {
- /* Label the information */
- fprintf(fff, " Your Attributes:\n");
-
- /* We will print on top of the map (column 13) */
- for (j = 0; j < i; j ++)
- {
- /* Show the info */
- fprintf(fff, "%s\n", info[j]);
- }
- }
-}
-
-
static int report_magics_aux(int dur)
{
if (dur <= 5)
@@ -1835,7 +834,7 @@ static cptr report_magic_durations[] =
};
-void report_magics(void)
+void report_magics()
{
int i = 0, j, k;
@@ -1890,11 +889,6 @@ void report_magics(void)
info2[i] = report_magics_aux(p_ptr->protevil);
info[i++] = "You are protected from evil";
}
- if (p_ptr->protgood)
- {
- info2[i] = report_magics_aux(p_ptr->protgood);
- info[i++] = "You are protected from good";
- }
if (p_ptr->shield)
{
info2[i] = report_magics_aux(p_ptr->shield);
@@ -1987,7 +981,7 @@ void report_magics(void)
/*
* Forget everything
*/
-bool_ lose_all_info(void)
+bool_ lose_all_info()
{
int i;
@@ -2032,76 +1026,6 @@ bool_ lose_all_info(void)
}
-
-
-/*
- * Detect all traps on current panel
- */
-bool_ detect_traps(int rad)
-{
- int x, y;
- bool_ detect = FALSE;
- cave_type *c_ptr;
-
-
- /* Scan the current panel */
- for (y = p_ptr->py - rad; y <= p_ptr->py + rad; y++)
- {
- for (x = p_ptr->px - rad; x <= p_ptr->px + rad; x++)
- {
- /* Reject locations outside of dungeon */
- if (!in_bounds(y, x)) continue;
-
- /* Reject those out of radius */
- if (distance(p_ptr->py, p_ptr->px, y, x) > rad) continue;
-
- /* Access the grid */
- c_ptr = &cave[y][x];
-
- /* mark as detected */
- c_ptr->info |= CAVE_DETECT;
-
- /* Detect invisible traps */
- if (c_ptr->t_idx != 0)
- {
- /* Hack -- Remember detected traps */
- c_ptr->info |= (CAVE_MARK);
-
- /* Pick a trap */
- pick_trap(y, x);
-
- /* Obvious */
- detect = TRUE;
- }
- }
- }
-
- /* Describe */
- if (detect)
- {
- msg_print("You sense the presence of traps!");
- }
-
- /*
- * This reveals un-identified trap detection items,
- * but so does leaving/entering trap-detected areas...
- * There are a couple of possible solutions:
- * (1) Immediately self-id such items (i.e. always returns TRUE)
- * (2) add another parameter to function which tells if unaware
- * item is used for trap detection, and if it is the case,
- * do two-pass scanning, first scanning for traps if an unaware
- * item is used and return FALSE there are none,
- * followed by current implementation --pelpel
- */
- p_ptr->redraw |= (PR_FRAME);
-
- /* Result -- see my comment above -- pelpel */
- /* return (detect); */
- return (TRUE);
-}
-
-
-
/*
* Detect all doors on current panel
*/
@@ -2293,7 +1217,7 @@ bool_ detect_treasure(int rad)
* The "update function" is called exactly once if
* the predicate succeeds. The
*/
-template<typename P, typename U> static bool detect_monsters_fn(int radius, P p, U u) {
+template<typename P> static bool detect_monsters_fn(int radius, P p) {
bool flag = false;
/* Scan monsters */
for (int i = 1; i < m_max; i++)
@@ -2319,19 +1243,6 @@ template<typename P, typename U> static bool detect_monsters_fn(int radius, P p,
auto r_ptr = m_ptr->race();
if (p(r_ptr.get()))
{
- /* Update */
- u(r_ptr.get());
-
- /* We're assuming the update function does
- * *something*, so we'll need to update
- * the recall window if we're currently looking
- * at it.
- */
- if (monster_race_idx == m_ptr->r_idx)
- {
- p_ptr->window |= (PW_MONSTER);
- }
-
/* Repair visibility later */
repair_monsters = TRUE;
@@ -2360,11 +1271,9 @@ static bool_ detect_monsters_string(cptr chars, int rad)
auto predicate = [chars](monster_race *r_ptr) -> bool {
return strchr(chars, r_ptr->d_char);
};
- auto update = [](monster_race *) -> void {
- };
/* Describe */
- if (detect_monsters_fn(rad, predicate, update))
+ if (detect_monsters_fn(rad, predicate))
{
/* Describe result */
msg_print("You sense the presence of monsters!");
@@ -2402,7 +1311,7 @@ template <typename P> bool detect_objects_fn(int radius, const char *object_mess
monster_type *m_ptr = &m_list[o_ptr->held_m_idx];
auto const r_ptr = m_ptr->race();
- if (!(r_ptr->flags9 & RF9_MIMIC))
+ if (!(r_ptr->flags & RF_MIMIC))
{
continue; /* Skip mimics completely */
}
@@ -2498,13 +1407,11 @@ bool detect_objects_normal(int rad)
bool_ detect_monsters_normal(int rad)
{
auto predicate = [](monster_race *r_ptr) -> bool {
- return (!(r_ptr->flags2 & (RF2_INVISIBLE))) ||
+ return (!(r_ptr->flags & RF_INVISIBLE)) ||
p_ptr->see_inv || p_ptr->tim_invis;
};
- auto update = [](monster_race *) -> void {
- };
- if (detect_monsters_fn(rad, predicate, update))
+ if (detect_monsters_fn(rad, predicate))
{
/* Describe result */
msg_print("You sense the presence of monsters!");
@@ -2523,13 +1430,10 @@ bool_ detect_monsters_normal(int rad)
bool_ detect_monsters_invis(int rad)
{
auto predicate = [](monster_race *r_ptr) -> bool {
- return (r_ptr->flags2 & (RF2_INVISIBLE));
- };
- auto update = [](monster_race *r_ptr) -> void {
- r_ptr->r_flags2 |= (RF2_INVISIBLE);
+ return bool(r_ptr->flags & RF_INVISIBLE);
};
- if (detect_monsters_fn(rad, predicate, update))
+ if (detect_monsters_fn(rad, predicate))
{
/* Describe result */
msg_print("You sense the presence of invisible creatures!");
@@ -2544,44 +1448,17 @@ bool_ detect_monsters_invis(int rad)
/*
- * A "generic" detect monsters routine, tagged to flags3
+ * Detect orcs
*/
-bool_ detect_monsters_xxx(u32b match_flag, int rad)
+void detect_monsters_orcs(int rad)
{
- auto predicate = [match_flag](monster_race *r_ptr) -> bool {
- return (r_ptr->flags3 & match_flag);
- };
- auto update = [match_flag](monster_race *r_ptr) -> void {
- r_ptr->r_flags3 |= (match_flag);
+ auto predicate = [](monster_race *r_ptr) -> bool {
+ return bool(r_ptr->flags & RF_ORC);
};
- if (detect_monsters_fn(rad, predicate, update))
- {
- cptr desc_monsters = "weird monsters";
- switch (match_flag)
- {
- case RF3_DEMON:
- desc_monsters = "demons";
- break;
- case RF3_UNDEAD:
- desc_monsters = "the undead";
- break;
- case RF3_GOOD:
- desc_monsters = "good";
- break;
- case RF3_ORC:
- desc_monsters = "orcs";
- break;
- }
-
- /* Describe result */
- msg_format("You sense the presence of %s!", desc_monsters);
- msg_print(NULL);
- return TRUE;
- }
- else
+ if (detect_monsters_fn(rad, predicate))
{
- return FALSE;
+ msg_print("You sense the presence of orcs!");
}
}
@@ -2595,7 +1472,6 @@ bool_ detect_all(int rad)
bool_ detect = FALSE;
/* Detect everything */
- if (detect_traps(rad)) detect = TRUE;
if (detect_doors(rad)) detect = TRUE;
if (detect_stairs(rad)) detect = TRUE;
if (detect_treasure(rad)) detect = TRUE;
@@ -2613,7 +1489,7 @@ bool_ detect_all(int rad)
/*
* Create stairs at the player location
*/
-void stair_creation(void)
+void stair_creation()
{
/* XXX XXX XXX */
if (!cave_valid_bold(p_ptr->py, p_ptr->px))
@@ -2622,13 +1498,13 @@ void stair_creation(void)
return;
}
- if (dungeon_flags1 & DF1_FLAT)
+ if (dungeon_flags & DF_FLAT)
{
msg_print("No stair creation in non dungeons...");
return;
}
- if (dungeon_flags2 & DF2_SPECIAL)
+ if (dungeon_flags & DF_SPECIAL)
{
msg_print("No stair creation on special levels...");
return;
@@ -2757,12 +1633,28 @@ bool_ enchant(object_type *o_ptr, int n, int eflag)
{
int i, chance, prob;
bool_ res = FALSE;
- bool_ a = (artifact_p(o_ptr) || o_ptr->art_name);
- u32b f1, f2, f3, f4, f5, esp;
-
+ auto const a = artifact_p(o_ptr);
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
+
+ /* Break curse if item is cursed the curse isn't permanent */
+ auto maybe_break_curse = [o_ptr, &flags]()
+ {
+ if (cursed_p(o_ptr) && (!(flags & TR_PERMA_CURSE)))
+ {
+ msg_print("The curse is broken!");
+ o_ptr->ident &= ~(IDENT_CURSED);
+ o_ptr->ident |= (IDENT_SENSE);
+
+ if (o_ptr->art_flags & TR_CURSED)
+ o_ptr->art_flags &= ~TR_CURSED;
+ if (o_ptr->art_flags & TR_HEAVY_CURSE)
+ o_ptr->art_flags &= ~TR_HEAVY_CURSE;
+
+ o_ptr->sense = SENSE_UNCURSED;
+ }
+ };
/* Large piles resist enchantment */
prob = o_ptr->number * 100;
@@ -2793,21 +1685,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag)
o_ptr->to_h++;
res = TRUE;
- /* only when you get it above -1 -CFT */
- if (cursed_p(o_ptr) &&
- (!(f3 & (TR3_PERMA_CURSE))) &&
- (o_ptr->to_h >= 0) && (rand_int(100) < 25))
+ /* break curse? */
+ if ((o_ptr->to_h >= 0) && (rand_int(100) < 25))
{
- msg_print("The curse is broken!");
- o_ptr->ident &= ~(IDENT_CURSED);
- o_ptr->ident |= (IDENT_SENSE);
-
- if (o_ptr->art_flags3 & (TR3_CURSED))
- o_ptr->art_flags3 &= ~(TR3_CURSED);
- if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE))
- o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
-
- o_ptr->sense = SENSE_UNCURSED;
+ maybe_break_curse();
}
}
}
@@ -2824,21 +1705,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag)
o_ptr->to_d++;
res = TRUE;
- /* only when you get it above -1 -CFT */
- if (cursed_p(o_ptr) &&
- (!(f3 & (TR3_PERMA_CURSE))) &&
- (o_ptr->to_d >= 0) && (rand_int(100) < 25))
+ /* break curse? */
+ if ((o_ptr->to_d >= 0) && (rand_int(100) < 25))
{
- msg_print("The curse is broken!");
- o_ptr->ident &= ~(IDENT_CURSED);
- o_ptr->ident |= (IDENT_SENSE);
-
- if (o_ptr->art_flags3 & (TR3_CURSED))
- o_ptr->art_flags3 &= ~(TR3_CURSED);
- if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE))
- o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
-
- o_ptr->sense = SENSE_UNCURSED;
+ maybe_break_curse();
}
}
}
@@ -2856,21 +1726,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag)
o_ptr->pval++;
res = TRUE;
- /* only when you get it above -1 -CFT */
- if (cursed_p(o_ptr) &&
- (!(f3 & (TR3_PERMA_CURSE))) &&
- (o_ptr->pval >= 0) && (rand_int(100) < 25))
+ /* break curse? */
+ if ((o_ptr->pval >= 0) && (rand_int(100) < 25))
{
- msg_print("The curse is broken!");
- o_ptr->ident &= ~(IDENT_CURSED);
- o_ptr->ident |= (IDENT_SENSE);
-
- if (o_ptr->art_flags3 & (TR3_CURSED))
- o_ptr->art_flags3 &= ~(TR3_CURSED);
- if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE))
- o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
-
- o_ptr->sense = SENSE_UNCURSED;
+ maybe_break_curse();
}
}
}
@@ -2887,21 +1746,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag)
o_ptr->to_a++;
res = TRUE;
- /* only when you get it above -1 -CFT */
- if (cursed_p(o_ptr) &&
- (!(f3 & (TR3_PERMA_CURSE))) &&
- (o_ptr->to_a >= 0) && (rand_int(100) < 25))
+ /* break curse? */
+ if ((o_ptr->to_a >= 0) && (rand_int(100) < 25))
{
- msg_print("The curse is broken!");
- o_ptr->ident &= ~(IDENT_CURSED);
- o_ptr->ident |= (IDENT_SENSE);
-
- if (o_ptr->art_flags3 & (TR3_CURSED))
- o_ptr->art_flags3 &= ~(TR3_CURSED);
- if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE))
- o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
-
- o_ptr->sense = SENSE_UNCURSED;
+ maybe_break_curse();
}
}
}
@@ -2973,7 +1821,7 @@ bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval)
if (!okay)
{
/* Flush */
- if (flush_failure) flush();
+ flush_on_failure();
/* Message */
msg_print("The enchantment failed.");
@@ -2989,141 +1837,141 @@ void curse_artifact(object_type * o_ptr)
if (o_ptr->to_a) o_ptr->to_a = 0 - ((o_ptr->to_a) + randint(4));
if (o_ptr->to_h) o_ptr->to_h = 0 - ((o_ptr->to_h) + randint(4));
if (o_ptr->to_d) o_ptr->to_d = 0 - ((o_ptr->to_d) + randint(4));
- o_ptr->art_flags3 |= ( TR3_HEAVY_CURSE | TR3_CURSED );
- if (randint(3) == 1) o_ptr-> art_flags3 |= TR3_TY_CURSE;
- if (randint(2) == 1) o_ptr-> art_flags3 |= TR3_AGGRAVATE;
- if (randint(3) == 1) o_ptr-> art_flags3 |= TR3_DRAIN_EXP;
- if (randint(3) == 1) o_ptr-> art_flags4 |= TR4_BLACK_BREATH;
- if (randint(2) == 1) o_ptr-> art_flags3 |= TR3_TELEPORT;
- else if (randint(3) == 1) o_ptr->art_flags3 |= TR3_NO_TELE;
+ o_ptr->art_flags |= TR_HEAVY_CURSE | TR_CURSED;
+ if (randint(3) == 1) o_ptr-> art_flags |= TR_TY_CURSE;
+ if (randint(2) == 1) o_ptr-> art_flags |= TR_AGGRAVATE;
+ if (randint(3) == 1) o_ptr-> art_flags |= TR_DRAIN_EXP;
+ if (randint(3) == 1) o_ptr-> art_flags |= TR_BLACK_BREATH;
+ if (randint(2) == 1) o_ptr-> art_flags |= TR_TELEPORT;
+ else if (randint(3) == 1) o_ptr->art_flags |= TR_NO_TELE;
o_ptr->ident |= IDENT_CURSED;
}
-void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
+void random_resistance(object_type *o_ptr, int specific)
{
/* To avoid a number of possible bugs */
if (!specific)
{
if (artifact_bias == BIAS_ACID)
{
- if (!(o_ptr->art_flags2 & TR2_RES_ACID))
+ if (!(o_ptr->art_flags & TR_RES_ACID))
{
- o_ptr->art_flags2 |= TR2_RES_ACID;
+ o_ptr->art_flags |= TR_RES_ACID;
if (rand_int(2) == 0) return;
}
- if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_ACID))
+ if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_ACID))
{
- o_ptr->art_flags2 |= TR2_IM_ACID;
+ o_ptr->art_flags |= TR_IM_ACID;
if (rand_int(2) == 0) return;
}
}
else if (artifact_bias == BIAS_ELEC)
{
- if (!(o_ptr->art_flags2 & TR2_RES_ELEC))
+ if (!(o_ptr->art_flags & TR_RES_ELEC))
{
- o_ptr->art_flags2 |= TR2_RES_ELEC;
+ o_ptr->art_flags |= TR_RES_ELEC;
if (rand_int(2) == 0) return;
}
if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR &&
- !(o_ptr->art_flags3 & TR3_SH_ELEC))
+ !(o_ptr->art_flags & TR_SH_ELEC))
{
- o_ptr->art_flags2 |= TR3_SH_ELEC;
+ o_ptr->art_flags |= TR_SH_ELEC;
if (rand_int(2) == 0) return;
}
- if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_ELEC))
+ if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_ELEC))
{
- o_ptr->art_flags2 |= TR2_IM_ELEC;
+ o_ptr->art_flags |= TR_IM_ELEC;
if (rand_int(2) == 1) return;
}
}
else if (artifact_bias == BIAS_FIRE)
{
- if (!(o_ptr->art_flags2 & TR2_RES_FIRE))
+ if (!(o_ptr->art_flags & TR_RES_FIRE))
{
- o_ptr->art_flags2 |= TR2_RES_FIRE;
+ o_ptr->art_flags |= TR_RES_FIRE;
if (rand_int(2) == 0) return;
}
if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR &&
- !(o_ptr->art_flags3 & TR3_SH_FIRE))
+ !(o_ptr->art_flags & TR_SH_FIRE))
{
- o_ptr->art_flags2 |= TR3_SH_FIRE;
+ o_ptr->art_flags |= TR_SH_FIRE;
if (rand_int(2) == 0) return;
}
- if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_FIRE))
+ if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_FIRE))
{
- o_ptr->art_flags2 |= TR2_IM_FIRE;
+ o_ptr->art_flags |= TR_IM_FIRE;
if (rand_int(2) == 0) return;
}
}
else if (artifact_bias == BIAS_COLD)
{
- if (!(o_ptr->art_flags2 & TR2_RES_COLD))
+ if (!(o_ptr->art_flags & TR_RES_COLD))
{
- o_ptr->art_flags2 |= TR2_RES_COLD;
+ o_ptr->art_flags |= TR_RES_COLD;
if (rand_int(2) == 0) return;
}
- if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_COLD))
+ if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_COLD))
{
- o_ptr->art_flags2 |= TR2_IM_COLD;
+ o_ptr->art_flags |= TR_IM_COLD;
if (rand_int(2) == 0) return;
}
}
else if (artifact_bias == BIAS_POIS)
{
- if (!(o_ptr->art_flags2 & TR2_RES_POIS))
+ if (!(o_ptr->art_flags & TR_RES_POIS))
{
- o_ptr->art_flags2 |= TR2_RES_POIS;
+ o_ptr->art_flags |= TR_RES_POIS;
if (rand_int(2) == 0) return;
}
}
else if (artifact_bias == BIAS_WARRIOR)
{
- if (rand_int(3) && (!(o_ptr->art_flags2 & TR2_RES_FEAR)))
+ if (rand_int(3) && (!(o_ptr->art_flags & TR_RES_FEAR)))
{
- o_ptr->art_flags2 |= TR2_RES_FEAR;
+ o_ptr->art_flags |= TR_RES_FEAR;
if (rand_int(2) == 0) return;
}
- if ((rand_int(3) == 0) && (!(o_ptr->art_flags3 & TR3_NO_MAGIC)))
+ if ((rand_int(3) == 0) && (!(o_ptr->art_flags & TR_NO_MAGIC)))
{
- o_ptr->art_flags3 |= TR3_NO_MAGIC;
+ o_ptr->art_flags |= TR_NO_MAGIC;
if (rand_int(2) == 0) return;
}
}
else if (artifact_bias == BIAS_NECROMANTIC)
{
- if (!(o_ptr->art_flags2 & TR2_RES_NETHER))
+ if (!(o_ptr->art_flags & TR_RES_NETHER))
{
- o_ptr->art_flags2 |= TR2_RES_NETHER;
+ o_ptr->art_flags |= TR_RES_NETHER;
if (rand_int(2) == 0) return;
}
- if (!(o_ptr->art_flags2 & TR2_RES_POIS))
+ if (!(o_ptr->art_flags & TR_RES_POIS))
{
- o_ptr->art_flags2 |= TR2_RES_POIS;
+ o_ptr->art_flags |= TR_RES_POIS;
if (rand_int(2) == 0) return;
}
- if (!(o_ptr->art_flags2 & TR2_RES_DARK))
+ if (!(o_ptr->art_flags & TR_RES_DARK))
{
- o_ptr->art_flags2 |= TR2_RES_DARK;
+ o_ptr->art_flags |= TR_RES_DARK;
if (rand_int(2) == 0) return;
}
}
else if (artifact_bias == BIAS_CHAOS)
{
- if (!(o_ptr->art_flags2 & TR2_RES_CHAOS))
+ if (!(o_ptr->art_flags & TR_RES_CHAOS))
{
- o_ptr->art_flags2 |= TR2_RES_CHAOS;
+ o_ptr->art_flags |= TR_RES_CHAOS;
if (rand_int(2) == 0) return;
}
- if (!(o_ptr->art_flags2 & TR2_RES_CONF))
+ if (!(o_ptr->art_flags & TR_RES_CONF))
{
- o_ptr->art_flags2 |= TR2_RES_CONF;
+ o_ptr->art_flags |= TR_RES_CONF;
if (rand_int(2) == 0) return;
}
- if (!(o_ptr->art_flags2 & TR2_RES_DISEN))
+ if (!(o_ptr->art_flags & TR_RES_DISEN))
{
- o_ptr->art_flags2 |= TR2_RES_DISEN;
+ o_ptr->art_flags |= TR_RES_DISEN;
if (rand_int(2) == 0) return;
}
}
@@ -3133,10 +1981,10 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
{
case 1 :
if (randint(WEIRD_LUCK) != 1)
- random_resistance(o_ptr, is_scroll, specific);
+ random_resistance(o_ptr, specific);
else
{
- o_ptr->art_flags2 |= TR2_IM_ACID;
+ o_ptr->art_flags |= TR_IM_ACID;
/* if (is_scroll) msg_print("It looks totally incorruptible."); */
if (!(artifact_bias))
artifact_bias = BIAS_ACID;
@@ -3144,10 +1992,10 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
break;
case 2:
if (randint(WEIRD_LUCK) != 1)
- random_resistance(o_ptr, is_scroll, specific);
+ random_resistance(o_ptr, specific);
else
{
- o_ptr->art_flags2 |= TR2_IM_ELEC;
+ o_ptr->art_flags |= TR_IM_ELEC;
/* if (is_scroll) msg_print("It looks completely grounded."); */
if (!(artifact_bias))
artifact_bias = BIAS_ELEC;
@@ -3155,10 +2003,10 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
break;
case 3:
if (randint(WEIRD_LUCK) != 1)
- random_resistance(o_ptr, is_scroll, specific);
+ random_resistance(o_ptr, specific);
else
{
- o_ptr->art_flags2 |= TR2_IM_COLD;
+ o_ptr->art_flags |= TR_IM_COLD;
/* if (is_scroll) msg_print("It feels very warm."); */
if (!(artifact_bias))
artifact_bias = BIAS_COLD;
@@ -3166,10 +2014,10 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
break;
case 4:
if (randint(WEIRD_LUCK) != 1)
- random_resistance(o_ptr, is_scroll, specific);
+ random_resistance(o_ptr, specific);
else
{
- o_ptr->art_flags2 |= TR2_IM_FIRE;
+ o_ptr->art_flags |= TR_IM_FIRE;
/* if (is_scroll) msg_print("It feels very cool."); */
if (!(artifact_bias))
artifact_bias = BIAS_FIRE;
@@ -3178,7 +2026,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
case 5:
case 6:
case 13:
- o_ptr->art_flags2 |= TR2_RES_ACID;
+ o_ptr->art_flags |= TR_RES_ACID;
/* if (is_scroll) msg_print("It makes your stomach rumble."); */
if (!(artifact_bias))
artifact_bias = BIAS_ACID;
@@ -3186,7 +2034,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
case 7:
case 8:
case 14:
- o_ptr->art_flags2 |= TR2_RES_ELEC;
+ o_ptr->art_flags |= TR_RES_ELEC;
/* if (is_scroll) msg_print("It makes you feel grounded."); */
if (!(artifact_bias))
artifact_bias = BIAS_ELEC;
@@ -3194,7 +2042,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
case 9:
case 10:
case 15:
- o_ptr->art_flags2 |= TR2_RES_FIRE;
+ o_ptr->art_flags |= TR_RES_FIRE;
/* if (is_scroll) msg_print("It makes you feel cool!");*/
if (!(artifact_bias))
artifact_bias = BIAS_FIRE;
@@ -3202,14 +2050,14 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
case 11:
case 12:
case 16:
- o_ptr->art_flags2 |= TR2_RES_COLD;
+ o_ptr->art_flags |= TR_RES_COLD;
/* if (is_scroll) msg_print("It makes you feel full of hot air!");*/
if (!(artifact_bias))
artifact_bias = BIAS_COLD;
break;
case 17:
case 18:
- o_ptr->art_flags2 |= TR2_RES_POIS;
+ o_ptr->art_flags |= TR_RES_POIS;
/* if (is_scroll) msg_print("It makes breathing easier for you."); */
if (!(artifact_bias) && randint(4) != 1)
artifact_bias = BIAS_POIS;
@@ -3220,87 +2068,87 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
break;
case 19:
case 20:
- o_ptr->art_flags2 |= TR2_RES_FEAR;
+ o_ptr->art_flags |= TR_RES_FEAR;
/* if (is_scroll) msg_print("It makes you feel brave!"); */
if (!(artifact_bias) && randint(3) == 1)
artifact_bias = BIAS_WARRIOR;
break;
case 21:
- o_ptr->art_flags2 |= TR2_RES_LITE;
+ o_ptr->art_flags |= TR_RES_LITE;
/* if (is_scroll) msg_print("It makes everything look darker.");*/
break;
case 22:
- o_ptr->art_flags2 |= TR2_RES_DARK;
+ o_ptr->art_flags |= TR_RES_DARK;
/* if (is_scroll) msg_print("It makes everything look brigher.");*/
break;
case 23:
case 24:
- o_ptr->art_flags2 |= TR2_RES_BLIND;
+ o_ptr->art_flags |= TR_RES_BLIND;
/* if (is_scroll) msg_print("It makes you feel you are wearing glasses.");*/
break;
case 25:
case 26:
- o_ptr->art_flags2 |= TR2_RES_CONF;
+ o_ptr->art_flags |= TR_RES_CONF;
/* if (is_scroll) msg_print("It makes you feel very determined.");*/
if (!(artifact_bias) && randint(6) == 1)
artifact_bias = BIAS_CHAOS;
break;
case 27:
case 28:
- o_ptr->art_flags2 |= TR2_RES_SOUND;
+ o_ptr->art_flags |= TR_RES_SOUND;
/* if (is_scroll) msg_print("It makes you feel deaf!");*/
break;
case 29:
case 30:
- o_ptr->art_flags2 |= TR2_RES_SHARDS;
+ o_ptr->art_flags |= TR_RES_SHARDS;
/* if (is_scroll) msg_print("It makes your skin feel thicker.");*/
break;
case 31:
case 32:
- o_ptr->art_flags2 |= TR2_RES_NETHER;
+ o_ptr->art_flags |= TR_RES_NETHER;
/* if (is_scroll) msg_print("It makes you feel like visiting a graveyard!");*/
if (!(artifact_bias) && randint(3) == 1)
artifact_bias = BIAS_NECROMANTIC;
break;
case 33:
case 34:
- o_ptr->art_flags2 |= TR2_RES_NEXUS;
+ o_ptr->art_flags |= TR_RES_NEXUS;
/* if (is_scroll) msg_print("It makes you feel normal.");*/
break;
case 35:
case 36:
- o_ptr->art_flags2 |= TR2_RES_CHAOS;
+ o_ptr->art_flags |= TR_RES_CHAOS;
/* if (is_scroll) msg_print("It makes you feel very firm.");*/
if (!(artifact_bias) && randint(2) == 1)
artifact_bias = BIAS_CHAOS;
break;
case 37:
case 38:
- o_ptr->art_flags2 |= TR2_RES_DISEN;
+ o_ptr->art_flags |= TR_RES_DISEN;
/* if (is_scroll) msg_print("It is surrounded by a static feeling.");*/
break;
case 39:
if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
- o_ptr->art_flags3 |= TR3_SH_ELEC;
+ o_ptr->art_flags |= TR_SH_ELEC;
else
- random_resistance(o_ptr, is_scroll, specific);
+ random_resistance(o_ptr, specific);
if (!(artifact_bias))
artifact_bias = BIAS_ELEC;
break;
case 40:
if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
- o_ptr->art_flags3 |= TR3_SH_FIRE;
+ o_ptr->art_flags |= TR_SH_FIRE;
else
- random_resistance(o_ptr, is_scroll, specific);
+ random_resistance(o_ptr, specific);
if (!(artifact_bias))
artifact_bias = BIAS_FIRE;
break;
case 41:
if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK ||
o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR)
- o_ptr->art_flags2 |= TR2_REFLECT;
+ o_ptr->art_flags |= TR_REFLECT;
else
- random_resistance(o_ptr, is_scroll, specific);
+ random_resistance(o_ptr, specific);
break;
}
}
@@ -3315,7 +2163,7 @@ static void note_found_object(object_type *o_ptr)
char note[150];
char item_name[80];
- if (artifact_p(o_ptr) || o_ptr->name1)
+ if (artifact_p(o_ptr))
{
object_desc(item_name, o_ptr, FALSE, 0);
@@ -3333,7 +2181,7 @@ static void note_found_object(object_type *o_ptr)
* This routine does *not* automatically combine objects.
* Returns TRUE if something was identified, else FALSE.
*/
-bool_ ident_spell(void)
+bool_ ident_spell()
{
/* Get an item */
int item;
@@ -3393,7 +2241,7 @@ bool_ ident_spell(void)
/*
* Identify all objects in the level
*/
-bool_ ident_all(void)
+bool_ ident_all()
{
int i;
@@ -3433,7 +2281,7 @@ static bool item_tester_hook_no_mental(object_type const *o_ptr)
* Fully "identify" an object in the inventory -BEN-
* This routine returns TRUE if an item was identified.
*/
-bool_ identify_fully(void)
+bool_ identify_fully()
{
/* Get an item */
int item;
@@ -3507,7 +2355,7 @@ object_filter_t const &item_tester_hook_recharge()
static auto instance =
And(
// Must NOT have NO_RECHARGE flag.
- Not(HasFlag4(TR4_NO_RECHARGE)),
+ Not(HasFlags(TR_NO_RECHARGE)),
// ... and must be a device.
Or(
TVal(TV_STAFF),
@@ -3539,6 +2387,8 @@ object_filter_t const &item_tester_hook_recharge()
*/
bool_ recharge(int power)
{
+ auto const &k_info = game->edit_data.k_info;
+
int recharge_strength, recharge_amount;
int lev;
bool_ fail = FALSE;
@@ -3561,8 +2411,7 @@ bool_ recharge(int power)
object_type *o_ptr = get_object(item);
/* Extract the flags */
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Extract the object "level" */
lev = k_info[o_ptr->k_idx].level;
@@ -3577,7 +2426,7 @@ bool_ recharge(int power)
if (recharge_strength < 0) recharge_strength = 0;
/* Back-fire */
- if ((rand_int(recharge_strength) == 0) && (!(f4 & TR4_RECHARGE)))
+ if ((rand_int(recharge_strength) == 0) && (!(flags & TR_RECHARGE)))
{
/* Activate the failure code. */
fail = TRUE;
@@ -3614,8 +2463,8 @@ bool_ recharge(int power)
/* Back-fire XXX XXX XXX */
- if (((rand_int(recharge_strength) == 0) && (!(f4 & TR4_RECHARGE))) ||
- (f4 & TR4_NO_RECHARGE))
+ if (((rand_int(recharge_strength) == 0) && (!(flags & TR_RECHARGE))) ||
+ (flags & TR_NO_RECHARGE))
{
/* Activate the failure code. */
fail = TRUE;
@@ -3648,7 +2497,7 @@ bool_ recharge(int power)
/* Recharge the wand or staff. */
o_ptr->pval += recharge_amount;
- if (!(f4 & TR4_RECHARGE))
+ if (!(flags & TR_RECHARGE))
{
/* Hack -- we no longer "know" the item */
o_ptr->ident &= ~(IDENT_KNOWN);
@@ -3660,7 +2509,7 @@ bool_ recharge(int power)
}
/* Mark as recharged */
- o_ptr->art_flags4 |= TR4_RECHARGED;
+ o_ptr->art_flags |= TR_RECHARGED;
/* Inflict the penalties for failing a recharge. */
if (fail)
@@ -3687,7 +2536,7 @@ bool_ recharge(int power)
/*** Determine Seriousness of Failure ***/
/* Mages recharge objects more safely. */
- if (has_ability(AB_PERFECT_CASTING))
+ if (p_ptr->has_ability(AB_PERFECT_CASTING))
{
/* 10% chance to blow up one rod, otherwise draining. */
if (o_ptr->tval == TV_ROD_MAIN)
@@ -4002,7 +2851,7 @@ bool_ genocide_aux(bool_ player_cast, char typ)
{
int i;
bool_ result = FALSE;
- int msec = delay_factor * delay_factor * delay_factor;
+ auto const msec = options->delay_factor_ms();
int dam = 0;
/* Delete the monsters of that "type" */
@@ -4015,7 +2864,7 @@ bool_ genocide_aux(bool_ player_cast, char typ)
if (!m_ptr->r_idx) continue;
/* Hack -- Skip Unique Monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) continue;
+ if (r_ptr->flags & RF_UNIQUE) continue;
/* Hack -- Skip Quest Monsters */
if (m_ptr->mflag & MFLAG_QUEST) continue;
@@ -4024,7 +2873,7 @@ bool_ genocide_aux(bool_ player_cast, char typ)
if (r_ptr->d_char != typ) continue;
/* Oups */
- if (r_ptr->flags2 & RF2_DEATH_ORB)
+ if (r_ptr->flags & RF_DEATH_ORB)
{
int wx, wy;
int attempts = 500;
@@ -4096,7 +2945,7 @@ bool_ genocide(bool_ player_cast)
{
char typ;
- if (dungeon_flags2 & DF2_NO_GENO) return (FALSE);
+ if (dungeon_flags & DF_NO_GENO) return (FALSE);
/* Hack -- when you are fated to die, you cant cheat :) */
if (dungeon_type == DUNGEON_DEATH)
@@ -4119,13 +2968,11 @@ bool_ mass_genocide(bool_ player_cast)
{
int i;
bool_ result = FALSE;
- int msec = delay_factor * delay_factor * delay_factor;
+ auto const msec = options->delay_factor_ms();
int dam = 0;
- if (dungeon_flags2 & DF2_NO_GENO) return (FALSE);
-
- /* Hack -- when you are fated to die, you cant cheat :) */
- if (dungeon_type == DUNGEON_DEATH)
+ /* Prevented? */
+ if ((dungeon_flags & DF_NO_GENO) || (dungeon_type == DUNGEON_DEATH))
{
msg_print("A mysterious force stops the genocide.");
return FALSE;
@@ -4141,7 +2988,7 @@ bool_ mass_genocide(bool_ player_cast)
if (!m_ptr->r_idx) continue;
/* Hack -- Skip unique monsters */
- if (r_ptr->flags1 & (RF1_UNIQUE)) continue;
+ if (r_ptr->flags & RF_UNIQUE) continue;
/* Hack -- Skip Quest Monsters */
if (m_ptr->mflag & MFLAG_QUEST) continue;
@@ -4150,7 +2997,7 @@ bool_ mass_genocide(bool_ player_cast)
if (m_ptr->cdis > MAX_SIGHT) continue;
/* Oups */
- if (r_ptr->flags2 & RF2_DEATH_ORB)
+ if (r_ptr->flags & RF_DEATH_ORB)
{
int wx, wy;
int attempts = 500;
@@ -4218,94 +3065,6 @@ bool_ mass_genocide(bool_ player_cast)
return (result);
}
-/* Probe a monster */
-void do_probe(int m_idx)
-{
- char m_name[80];
- monster_type *m_ptr = &m_list[m_idx];
-
- /* Get "the monster" or "something" */
- monster_desc(m_name, m_ptr, 0x04);
-
- /* Describe the monster */
- if (!wizard && (m_ptr->status != MSTATUS_COMPANION)) msg_format("%^s has %d hit points.", m_name, m_ptr->hp);
- else
- {
- int i;
- char t_name[80];
- msg_format("%^s has %d(%d) hit points, %d ac, %d speed.", m_name, m_ptr->hp, m_ptr->maxhp, m_ptr->ac, m_ptr->mspeed - 110);
- msg_format("%^s attacks with:", m_name);
-
- for (i = 0; i < 4; i++)
- {
- msg_format(" Blow %d: %dd%d", i, m_ptr->blow[i].d_dice, m_ptr->blow[i].d_side);
- }
-
- if (m_ptr->target > 0)
- monster_desc(t_name, &m_list[m_ptr->target], 0x04);
- else if (!m_ptr->target)
- sprintf(t_name, "you");
- else
- sprintf(t_name, "nothing");
- msg_format("%^s target is %s.", m_name, t_name);
-
- {
- std::ostringstream buf;
- buf << " has " << m_ptr->exp
- << " exp and needs " << monster_exp(m_ptr->level + 1) << ".";
- msg_format("%^s%s", m_name, buf.str().c_str());
- }
- }
-
- /* Learn all of the non-spell, non-treasure flags */
- lore_do_probe(m_idx);
-}
-
-/*
- * Probe nearby monsters
- */
-bool_ probing(void)
-{
- int i;
-
- bool_ probe = FALSE;
-
-
- /* Probe all (nearby) monsters */
- for (i = 1; i < m_max; i++)
- {
- monster_type *m_ptr = &m_list[i];
-
- /* Paranoia -- Skip dead monsters */
- if (!m_ptr->r_idx) continue;
-
- /* Require line of sight */
- if (!player_has_los_bold(m_ptr->fy, m_ptr->fx)) continue;
-
- /* Probe visible monsters */
- if (m_ptr->ml)
- {
- /* Start the message */
- if (!probe) msg_print("Probing...");
-
- /* Actualy probe */
- do_probe(i);
-
- /* Probe worked */
- probe = TRUE;
- }
- }
-
- /* Done */
- if (probe)
- {
- msg_print("That's all.");
- }
-
- /* Result */
- return (probe);
-}
-
/*
* The spell of destruction
@@ -4324,7 +3083,7 @@ void destroy_area(int y1, int x1, int r)
bool_ flag = FALSE;
- if (dungeon_flags2 & DF2_NO_GENO)
+ if (dungeon_flags & DF_NO_GENO)
{
msg_print("Not on special levels!");
return;
@@ -4427,7 +3186,7 @@ void destroy_area(int y1, int x1, int r)
if (!p_ptr->resist_blind && !p_ptr->resist_lite)
{
/* Become blind */
- (void)set_blind(p_ptr->blind + 10 + randint(10));
+ set_blind(p_ptr->blind + 10 + randint(10));
}
}
@@ -4602,14 +3361,14 @@ void earthquake(int cy, int cx, int r)
{
msg_print("You are bashed by rubble!");
damage = damroll(10, 4);
- (void)set_stun(p_ptr->stun + randint(50));
+ set_stun(p_ptr->stun + randint(50));
break;
}
case 3:
{
msg_print("You are crushed between the floor and ceiling!");
damage = damroll(10, 4);
- (void)set_stun(p_ptr->stun + randint(50));
+ set_stun(p_ptr->stun + randint(50));
break;
}
}
@@ -4636,7 +3395,7 @@ void earthquake(int cy, int cx, int r)
map[16 + p_ptr->py - cy][16 + p_ptr->px - cx] = FALSE;
/* Semi-wraiths have to be hurt *some*, says DG */
- if (race_flags1_p(PR1_SEMI_WRAITH))
+ if (race_flags_p(PR_SEMI_WRAITH))
damage /= 4;
/* Take some damage */
@@ -4666,8 +3425,8 @@ void earthquake(int cy, int cx, int r)
auto const r_ptr = m_ptr->race();
/* Most monsters cannot co-exist with rock */
- if (!(r_ptr->flags2 & (RF2_KILL_WALL)) &&
- !(r_ptr->flags2 & (RF2_PASS_WALL)))
+ if (!(r_ptr->flags & RF_KILL_WALL) &&
+ !(r_ptr->flags & RF_PASS_WALL))
{
char m_name[80];
@@ -4675,7 +3434,7 @@ void earthquake(int cy, int cx, int r)
sn = 0;
/* Monster can move to escape the wall */
- if (!(r_ptr->flags1 & (RF1_NEVER_MOVE)))
+ if (!(r_ptr->flags & RF_NEVER_MOVE))
{
/* Look for safety */
for (i = 0; i < 8; i++)
@@ -4866,7 +3625,7 @@ void earthquake(int cy, int cx, int r)
* NORMAL monsters wake up 1/4 the time when illuminated
* STUPID monsters wake up 1/10 the time when illuminated
*/
-static void cave_temp_room_lite(void)
+static void cave_temp_room_lite()
{
int i;
@@ -4917,10 +3676,10 @@ static void cave_temp_room_lite(void)
update_mon(c_ptr->m_idx, FALSE);
/* Stupid monsters rarely wake up */
- if (r_ptr->flags2 & (RF2_STUPID)) chance = 10;
+ if (r_ptr->flags & RF_STUPID) chance = 10;
/* Smart monsters always wake up */
- if (r_ptr->flags2 & (RF2_SMART)) chance = 100;
+ if (r_ptr->flags & RF_SMART) chance = 100;
/* Sometimes monsters wake up */
if (m_ptr->csleep && (rand_int(100) < chance))
@@ -4960,7 +3719,7 @@ static void cave_temp_room_lite(void)
*
* Also, process all affected monsters
*/
-static void cave_temp_room_unlite(void)
+static void cave_temp_room_unlite()
{
int i;
@@ -5128,7 +3887,7 @@ bool_ lite_area(int dam, int rad)
}
/* Hook into the "project()" function */
- (void)project(0, rad, p_ptr->py, p_ptr->px, dam, GF_LITE_WEAK, flg);
+ project(0, rad, p_ptr->py, p_ptr->px, dam, GF_LITE_WEAK, flg);
/* Lite up the room */
lite_room(p_ptr->py, p_ptr->px);
@@ -5153,7 +3912,7 @@ bool_ unlite_area(int dam, int rad)
}
/* Hook into the "project()" function */
- (void)project(0, rad, p_ptr->py, p_ptr->px, dam, GF_DARK_WEAK, flg);
+ project(0, rad, p_ptr->py, p_ptr->px, dam, GF_DARK_WEAK, flg);
/* Lite up the room */
unlite_room(p_ptr->py, p_ptr->px);
@@ -5277,14 +4036,12 @@ void teleport_swap(int dir)
monster_type *m_ptr = &m_list[c_ptr->m_idx];
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags3 & RF3_RES_TELE)
+ if (r_ptr->flags & RF_RES_TELE)
{
msg_print("Your teleportation is blocked!");
}
else
{
- sound(SOUND_TELEPORT);
-
cave[p_ptr->py][p_ptr->px].m_idx = c_ptr->m_idx;
/* Update the old location */
@@ -5338,9 +4095,6 @@ void teleport_swap(int dir)
/* Update the monsters */
p_ptr->update |= (PU_DISTANCE);
- /* Redraw trap detection status */
- p_ptr->redraw |= (PR_FRAME);
-
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD);
@@ -5366,8 +4120,6 @@ void swap_position(int lty, int ltx)
if (!c_ptr->m_idx)
{
- sound(SOUND_TELEPORT);
-
/* Keep trace of the old location */
tx = p_ptr->px;
ty = p_ptr->py;
@@ -5391,9 +4143,6 @@ void swap_position(int lty, int ltx)
/* Update the monsters */
p_ptr->update |= (PU_DISTANCE);
- /* Redraw trap detection status */
- p_ptr->redraw |= (PR_FRAME);
-
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD);
@@ -5404,8 +4153,6 @@ void swap_position(int lty, int ltx)
{
m_ptr = &m_list[c_ptr->m_idx];
- sound(SOUND_TELEPORT);
-
cave[p_ptr->py][p_ptr->px].m_idx = c_ptr->m_idx;
/* Update the old location */
@@ -5440,9 +4187,6 @@ void swap_position(int lty, int ltx)
/* Update the monsters */
p_ptr->update |= (PU_DISTANCE);
- /* Redraw trap detection status */
- p_ptr->redraw |= (PR_FRAME);
-
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD);
@@ -5548,14 +4292,6 @@ bool_ wizard_lock(int dir)
return (project_hook(GF_JAM_DOOR, dir, 20 + randint(30), flg));
}
-
-bool_ disarm_trap(int dir)
-{
- int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM;
- return (project_hook(GF_KILL_TRAP, dir, 0, flg));
-}
-
-
bool_ slow_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
@@ -5604,23 +4340,17 @@ bool_ teleport_monster(int dir)
return (project_hook(GF_AWAY_ALL, dir, MAX_SIGHT * 5, flg));
}
-
-bool_ trap_creation(void)
-{
- int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
- return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_MAKE_TRAP, flg));
-}
-
-
bool_ wall_stone(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
cave_type *c_ptr = &cave[y][x];
int flg = PROJECT_GRID | PROJECT_ITEM;
- int featflags = f_info[c_ptr->feat].flags1;
+ auto const featflags = f_info[c_ptr->feat].flags;
bool_ dummy = (project(0, 1, y, x, 0, GF_STONE_WALL, flg));
- if (!(featflags & FF1_PERMANENT) && !(featflags & FF1_WALL))
+ if (!(featflags & FF_PERMANENT) && !(featflags & FF_WALL))
cave_set_feat(y, x, FEAT_FLOOR);
/* Update stuff */
@@ -5639,26 +4369,20 @@ bool_ wall_stone(int y, int x)
}
-bool_ destroy_doors_touch(void)
+bool_ destroy_doors_touch()
{
int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_KILL_DOOR, flg));
}
-bool_ destroy_traps_touch(void)
-{
- int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
- return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_KILL_TRAP, flg));
-}
-
-bool_ sleep_monsters_touch(void)
+bool_ sleep_monsters_touch()
{
int flg = PROJECT_KILL | PROJECT_HIDE;
return (project(0, 1, p_ptr->py, p_ptr->px, p_ptr->lev, GF_OLD_SLEEP, flg));
}
-void call_chaos(void)
+void call_chaos()
{
int Chaos_type, dummy, dir;
int plev = p_ptr->lev;
@@ -5707,7 +4431,7 @@ void call_chaos(void)
}
-static void activate_hi_summon(void)
+static void activate_hi_summon()
{
int i;
@@ -5717,57 +4441,57 @@ static void activate_hi_summon(void)
{
case 1:
case 2:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANT);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANT);
break;
case 3:
case 4:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_SPIDER);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_SPIDER);
break;
case 5:
case 6:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HOUND);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HOUND);
break;
case 7:
case 8:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HYDRA);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HYDRA);
break;
case 9:
case 10:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANGEL);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANGEL);
break;
case 11:
case 12:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNDEAD);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNDEAD);
break;
case 13:
case 14:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DRAGON);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DRAGON);
break;
case 15:
case 16:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DEMON);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DEMON);
break;
case 17:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_WRAITH);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_WRAITH);
break;
case 18:
case 19:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNIQUE);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNIQUE);
break;
case 20:
case 21:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_UNDEAD);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_UNDEAD);
break;
case 22:
case 23:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DRAGON);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DRAGON);
break;
case 24:
case 25:
- (void) summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON);
+ summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON);
break;
default:
- (void) summon_specific(p_ptr->py, p_ptr->px, (((dun_level * 3) / 2) + 5), 0);
+ summon_specific(p_ptr->py, p_ptr->px, (((dun_level * 3) / 2) + 5), 0);
}
}
}
@@ -5778,7 +4502,7 @@ static void activate_hi_summon(void)
* rr9: Stop the nasty things when a Cyberdemon is summoned
* or the player gets paralyzed.
*/
-void activate_ty_curse(void)
+void activate_ty_curse()
{
int i = 0;
bool_ stop_ty = FALSE;
@@ -5800,7 +4524,7 @@ void activate_ty_curse(void)
activate_hi_summon();
if (randint(6) != 1) break;
case 7: case 8: case 9: case 18:
- (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, 0);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, 0);
if (randint(6) != 1) break;
case 10: case 11: case 12:
msg_print("You feel your life draining away...");
@@ -5822,7 +4546,7 @@ case 13: case 14: case 15: case 19: case 20:
}
if (randint(6) != 1) break;
case 21: case 22: case 23:
- (void)do_dec_stat((randint(6)) - 1, STAT_DEC_NORMAL);
+ do_dec_stat((randint(6)) - 1, STAT_DEC_NORMAL);
if (randint(6) != 1) break;
case 24:
msg_print("Huh? Who am I? What am I doing here?");
@@ -5843,7 +4567,7 @@ case 21: case 22: case 23:
{
do
{
- (void)do_dec_stat(i, STAT_DEC_NORMAL);
+ do_dec_stat(i, STAT_DEC_NORMAL);
}
while (randint(2) == 1);
@@ -5857,7 +4581,7 @@ case 21: case 22: case 23:
/*
* Activate the ultra evil Dark God curse
*/
-void activate_dg_curse(void)
+void activate_dg_curse()
{
int i = 0;
bool_ stop_dg = FALSE;
@@ -5924,7 +4648,7 @@ void activate_dg_curse(void)
case 21:
case 22:
case 23:
- (void)do_dec_stat((randint(6)) - 1, STAT_DEC_PERMANENT);
+ do_dec_stat((randint(6)) - 1, STAT_DEC_PERMANENT);
if (randint(7) != 1) break;
case 24:
msg_print("Huh? Who am I? What am I doing here?");
@@ -5934,7 +4658,7 @@ case 27: case 28: case 29:
if (p_ptr->inventory[INVEN_WIELD].k_idx)
{
msg_print("Your weapon now seems useless...");
- p_ptr->inventory[INVEN_WIELD].art_flags4 = TR4_NEVER_BLOW;
+ p_ptr->inventory[INVEN_WIELD].art_flags = TR_NEVER_BLOW;
}
break;
case 25:
@@ -5955,7 +4679,7 @@ case 27: case 28: case 29:
{
do
{
- (void)do_dec_stat(i, STAT_DEC_NORMAL);
+ do_dec_stat(i, STAT_DEC_NORMAL);
}
while (randint(2) == 1);
@@ -5967,14 +4691,14 @@ case 27: case 28: case 29:
}
-void summon_cyber(void)
+void summon_cyber()
{
int i;
int max_cyber = (dun_level / 50) + randint(6);
for (i = 0; i < max_cyber; i++)
{
- (void)summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON);
+ summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON);
}
}
@@ -5985,7 +4709,7 @@ static void summon_dragon_riders()
for (i = 0; i < max_dr; i++)
{
- (void)summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_THUNDERLORD);
+ summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_THUNDERLORD);
}
}
@@ -6073,7 +4797,7 @@ bool_ charm_animal(int dir, int plev)
return (project_hook(GF_CONTROL_ANIMAL, dir, plev, flg));
}
-void change_wild_mode(void)
+void change_wild_mode()
{
if (p_ptr->immovable && !p_ptr->wild_mode)
{
@@ -6095,7 +4819,7 @@ void change_wild_mode(void)
}
-void alter_reality(void)
+void alter_reality()
{
msg_print("The world changes!");
@@ -6150,13 +4874,20 @@ bool_ heal_insanity(int val)
*/
bool_ passwall(int dir, bool_ safe)
{
- int x = p_ptr->px, y = p_ptr->py, ox = p_ptr->px, oy = p_ptr->py, lx = p_ptr->px, ly = p_ptr->py;
+ auto const &f_info = game->edit_data.f_info;
+
+ int x = p_ptr->px;
+ int y = p_ptr->py;
+ int ox = p_ptr->px;
+ int oy = p_ptr->py;
+ int lx = p_ptr->px;
+ int ly = p_ptr->py;
cave_type *c_ptr;
bool_ ok = FALSE;
if (p_ptr->wild_mode) return FALSE;
if (p_ptr->inside_quest) return FALSE;
- if (dungeon_flags2 & DF2_NO_TELEPORT) return FALSE;
+ if (dungeon_flags & DF_NO_TELEPORT) return FALSE;
/* Must go somewhere */
if (dir == 5) return FALSE;
@@ -6168,7 +4899,7 @@ bool_ passwall(int dir, bool_ safe)
c_ptr = &cave[y][x];
/* Perm walls stops the transfer */
- if ((!in_bounds(y, x)) && (f_info[c_ptr->feat].flags1 & FF1_PERMANENT))
+ if ((!in_bounds(y, x)) && (f_info[c_ptr->feat].flags & FF_PERMANENT))
{
/* get the last working position */
x -= ddx[dir];
@@ -6188,7 +4919,7 @@ bool_ passwall(int dir, bool_ safe)
ly = y;
/* Pass over walls */
- if (f_info[c_ptr->feat].flags1 & FF1_WALL) continue;
+ if (f_info[c_ptr->feat].flags & FF_WALL) continue;
/* So it must be ok */
ok = TRUE;
@@ -6227,9 +4958,6 @@ bool_ passwall(int dir, bool_ safe)
/* Update the monsters */
p_ptr->update |= (PU_DISTANCE);
- /* Redraw trap detection status */
- p_ptr->redraw |= (PR_FRAME);
-
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD);
@@ -6246,7 +4974,8 @@ static void print_dungeon_batch(std::vector<int> const &dungeon_idxs,
int start,
bool_ mode)
{
- char buf[80];
+ auto const &d_info = game->edit_data.d_info;
+
int i, j;
byte attr;
@@ -6254,9 +4983,11 @@ static void print_dungeon_batch(std::vector<int> const &dungeon_idxs,
for (i = 0, j = start; i < 20 && j < static_cast<int>(dungeon_idxs.size()); i++, j++)
{
- dungeon_info_type *d_ptr = &d_info[dungeon_idxs[j]];
+ auto d_ptr = &d_info[dungeon_idxs[j]];
+
+ char buf[80];
+ strnfmt(buf, 80, " %c) %-30s", I2A(i), d_ptr->name.c_str());
- strnfmt(buf, 80, " %c) %-30s", I2A(i), d_ptr->name);
if (mode)
{
if (d_ptr->min_plev > p_ptr->lev)
@@ -6277,13 +5008,11 @@ static void print_dungeon_batch(std::vector<int> const &dungeon_idxs,
static int find_dungeon_by_name(char const *name)
{
+ auto const &d_info = game->edit_data.d_info;
+
/* Find the index corresponding to the name */
- for (int i = 1; i < max_d_idx; i++)
+ for (std::size_t i = 1; i < d_info.size(); i++)
{
- /* Skip non-initialized entries. */
- if (d_info[i].name == nullptr) {
- continue;
- }
if (iequals(name, d_info[i].name))
{
return i;
@@ -6295,6 +5024,8 @@ static int find_dungeon_by_name(char const *name)
static int reset_recall_aux()
{
+ auto const &d_info = game->edit_data.d_info;
+
char which;
int start = 0;
int ret;
@@ -6302,10 +5033,10 @@ static int reset_recall_aux()
// Dungeons available for recall
std::vector<int> dungeons;
- for (size_t i = 1; i < max_d_idx; i++)
+ for (size_t i = 1; i < d_info.size(); i++)
{
/* skip "blocked" dungeons */
- if (d_info[i].flags1 & DF1_NO_RECALL) continue;
+ if (d_info[i].flags & DF_NO_RECALL) continue;
if (max_dlv[i])
{
@@ -6360,7 +5091,8 @@ static int reset_recall_aux()
else if (which == '@')
{
char buf[80];
- strcpy(buf, d_info[p_ptr->recall_dungeon].name);
+ strcpy(buf, d_info[p_ptr->recall_dungeon].name.c_str());
+
if (!get_string("Which dungeon? ", buf, 79)) continue;
/* Find the index corresponding to the name */
@@ -6372,7 +5104,7 @@ static int reset_recall_aux()
msg_print(NULL);
continue;
}
- else if (d_info[i].flags1 & DF1_NO_RECALL)
+ else if (d_info[i].flags & DF_NO_RECALL)
{
msg_print("This place blocks my magic!");
msg_print(NULL);
@@ -6419,6 +5151,8 @@ static int reset_recall_aux()
bool_ reset_recall(bool_ no_trepas_max_depth)
{
+ auto const &d_info = game->edit_data.d_info;
+
int dun, depth, max;
/* Choose dungeon */
@@ -6431,8 +5165,9 @@ bool_ reset_recall(bool_ no_trepas_max_depth)
max = d_info[dun].maxdepth;
else
max = max_dlv[dun];
+
depth = get_quantity(format("Which level in %s(%d-%d)? ",
- d_info[dun].name,
+ d_info[dun].name.c_str(),
d_info[dun].mindepth, max),
max);
@@ -6455,9 +5190,11 @@ bool_ reset_recall(bool_ no_trepas_max_depth)
*/
void create_between_gate(int dist, int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
int ii, ij, plev = get_skill(SKILL_CONVEYANCE);
- if (dungeon_flags2 & DF2_NO_TELEPORT)
+ if (dungeon_flags & DF_NO_TELEPORT)
{
msg_print("Not on special levels!");
return;
@@ -6485,12 +5222,12 @@ void create_between_gate(int dist, int y, int x)
ij = y;
ii = x;
}
- if (!(f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_PERMANENT))
+ if (!(f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_PERMANENT))
{
cave_set_feat(p_ptr->py, p_ptr->px, FEAT_BETWEEN);
cave[p_ptr->py][p_ptr->px].special = ii + (ij << 8);
}
- if (!(f_info[cave[ij][ii].feat].flags1 & FF1_PERMANENT))
+ if (!(f_info[cave[ij][ii].feat].flags & FF_PERMANENT))
{
cave_set_feat(ij, ii, FEAT_BETWEEN);
cave[ij][ii].special = p_ptr->px + (p_ptr->py << 8);
@@ -6558,6 +5295,8 @@ static int rotate_dir(int dir, int mov)
void geomancy_random_wall(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
#define TABLE_SIZE 4
cave_type *c_ptr = &cave[y][x];
int feat = -1;
@@ -6572,7 +5311,8 @@ void geomancy_random_wall(int y, int x)
};
/* Do not destroy permanent things */
- if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) {
+ if (f_info[c_ptr->feat].flags & FF_PERMANENT)
+ {
return;
}
@@ -6587,6 +5327,8 @@ void geomancy_random_wall(int y, int x)
void geomancy_random_floor(int y, int x, bool_ kill_wall)
{
+ auto const &f_info = game->edit_data.f_info;
+
#define TABLE_SIZE 9
cave_type *c_ptr = &cave[y][x];
int feat = -1;
@@ -6606,10 +5348,10 @@ void geomancy_random_floor(int y, int x, bool_ kill_wall)
};
/* Do not destroy permanent things */
- if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) {
+ if (f_info[c_ptr->feat].flags & FF_PERMANENT) {
return;
}
- if (!(kill_wall || (f_info[c_ptr->feat].flags1 & FF1_FLOOR))) {
+ if (!(kill_wall || (f_info[c_ptr->feat].flags & FF_FLOOR))) {
return;
}
diff --git a/src/spells2.hpp b/src/spells2.hpp
index bffc4a2c..0eeb3f5b 100644
--- a/src/spells2.hpp
+++ b/src/spells2.hpp
@@ -2,114 +2,111 @@
#include "h-basic.h"
#include "identify_mode.hpp"
+#include "monster_race_flag_set.hpp"
#include "object_filter.hpp"
#include "object_type_fwd.hpp"
-extern void curse_artifact(object_type * o_ptr);
-extern void grow_things(s16b type, int rad);
-extern void grow_grass(int rad);
-extern void grow_trees(int rad);
-extern bool_ hp_player(int num);
-extern bool_ heal_insanity(int val);
-extern void warding_glyph(void);
-extern void explosive_rune(void);
-extern bool_ do_dec_stat(int stat, int mode);
-extern bool_ do_res_stat(int stat, bool_ full);
-extern bool_ do_inc_stat(int stat);
-extern void identify_hooks(int i, object_type *o_ptr, identify_mode type);
-extern bool_ identify_pack(void);
-extern void identify_pack_fully(void);
-extern bool_ remove_curse(void);
-extern bool_ remove_all_curse(void);
-extern bool_ restore_level(void);
-extern void self_knowledge(FILE *fff);
-extern bool_ lose_all_info(void);
-extern bool_ detect_traps(int rad);
-extern bool_ detect_doors(int rad);
-extern bool_ detect_stairs(int rad);
-extern bool_ detect_treasure(int rad);
-extern bool detect_objects_gold(int rad);
-extern bool detect_objects_normal(int rad);
-extern bool_ detect_monsters_normal(int rad);
-extern bool_ detect_monsters_invis(int rad);
-extern bool_ detect_monsters_xxx(u32b match_flag, int rad);
-extern bool_ detect_all(int rad);
-extern void stair_creation(void);
-extern bool_ wall_stone(int y, int x);
-extern bool_ enchant(object_type *o_ptr, int n, int eflag);
-extern bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval);
-extern bool_ ident_spell(void);
-extern bool_ ident_all(void);
-extern bool_ identify_fully(void);
-extern bool_ recharge(int num);
-extern void aggravate_monsters(int who);
-extern bool_ genocide_aux(bool_ player_cast, char typ);
-extern bool_ genocide(bool_ player_cast);
-extern bool_ mass_genocide(bool_ player_cast);
-extern void do_probe(int m_idx);
-extern bool_ probing(void);
-extern void change_wild_mode(void);
-extern bool_ banish_evil(int dist);
-extern bool_ dispel_evil(int dam);
-extern bool_ dispel_good(int dam);
-extern bool_ dispel_undead(int dam);
-extern bool_ dispel_monsters(int dam);
-extern void destroy_area(int y1, int x1, int r);
-extern void earthquake(int cy, int cx, int r);
-extern void lite_room(int y1, int x1);
-extern void unlite_room(int y1, int x1);
-extern bool_ lite_area(int dam, int rad);
-extern bool_ unlite_area(int dam, int rad);
-extern bool_ fire_cloud(int typ, int dir, int dam, int rad, int time);
-extern bool_ fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff);
-extern bool_ fire_wall(int typ, int dir, int dam, int time);
-extern bool_ fire_ball(int typ, int dir, int dam, int rad);
-extern bool_ fire_bolt(int typ, int dir, int dam);
-extern bool_ fire_beam(int typ, int dir, int dam);
-extern void call_chaos(void);
-extern bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam);
-extern bool_ lite_line(int dir);
-extern bool_ drain_life(int dir, int dam);
-extern bool_ wall_to_mud(int dir);
-extern bool_ disarm_trap(int dir);
-extern bool_ wizard_lock(int dir);
-extern bool_ slow_monster(int dir);
-extern bool_ sleep_monster(int dir);
-extern bool_ confuse_monster(int dir, int plev);
-extern bool_ fear_monster(int dir, int plev);
-extern bool_ poly_monster(int dir);
-extern bool_ teleport_monster(int dir);
-extern bool_ trap_creation(void);
-extern bool_ destroy_doors_touch(void);
-extern bool_ destroy_traps_touch(void);
-extern bool_ sleep_monsters_touch(void);
-extern bool_ alchemy(void);
-extern void activate_ty_curse(void);
-extern void activate_dg_curse(void);
-extern void summon_cyber(void);
-extern bool_ confuse_monsters(int dam);
-extern bool_ charm_monsters(int dam);
-extern bool_ charm_animals(int dam);
-extern bool_ stun_monsters(int dam);
-extern bool_ banish_monsters(int dist);
-extern bool_ turn_monsters(int dam);
-extern bool_ charm_monster(int dir, int plev);
-extern bool_ control_one_undead(int dir, int plev);
-extern bool_ charm_animal(int dir, int plev);
-extern bool_ mindblast_monsters(int dam);
-extern void alter_reality(void);
-extern void report_magics(void);
-extern void teleport_swap(int dir);
-extern void swap_position(int lty, int ltx);
-extern object_filter_t const &item_tester_hook_recharge();
-extern bool_ project_hack(int typ, int dam);
-extern void project_meteor(int radius, int typ, int dam, u32b flg);
-extern object_filter_t const &item_tester_hook_artifactable();
-extern bool_ passwall(int dir, bool_ safe);
-extern bool_ project_hook(int typ, int dir, int dam, int flg);
-extern bool_ reset_recall(bool_ no_trepas_max_depth);
-extern void geomancy_random_wall(int y, int x);
-extern void geomancy_random_floor(int y, int x, bool_ kill_wall);
-extern void geomancy_dig(int oy, int ox, int dir, int length);
-extern void channel_the_elements(int y, int x, int level);
-extern void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific);
+void curse_artifact(object_type * o_ptr);
+void grow_things(s16b type, int rad);
+void grow_grass(int rad);
+void grow_trees(int rad);
+bool_ hp_player(int num);
+bool_ heal_insanity(int val);
+void warding_glyph();
+void explosive_rune();
+bool_ do_dec_stat(int stat, int mode);
+bool_ do_res_stat(int stat, bool_ full);
+bool_ do_inc_stat(int stat);
+void identify_hooks(int i, object_type *o_ptr, identify_mode type);
+bool_ identify_pack();
+void identify_pack_fully();
+bool_ remove_curse();
+bool_ remove_all_curse();
+bool_ restore_level();
+bool_ lose_all_info();
+bool_ detect_traps(int rad);
+bool_ detect_doors(int rad);
+bool_ detect_stairs(int rad);
+bool_ detect_treasure(int rad);
+bool detect_objects_gold(int rad);
+bool detect_objects_normal(int rad);
+bool_ detect_monsters_normal(int rad);
+bool_ detect_monsters_invis(int rad);
+void detect_monsters_orcs(int rad);
+bool_ detect_all(int rad);
+void stair_creation();
+bool_ wall_stone(int y, int x);
+bool_ enchant(object_type *o_ptr, int n, int eflag);
+bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval);
+bool_ ident_spell();
+bool_ ident_all();
+bool_ identify_fully();
+bool_ recharge(int num);
+void aggravate_monsters(int who);
+bool_ genocide_aux(bool_ player_cast, char typ);
+bool_ genocide(bool_ player_cast);
+bool_ mass_genocide(bool_ player_cast);
+void change_wild_mode();
+bool_ banish_evil(int dist);
+bool_ dispel_evil(int dam);
+bool_ dispel_good(int dam);
+bool_ dispel_undead(int dam);
+bool_ dispel_monsters(int dam);
+void destroy_area(int y1, int x1, int r);
+void earthquake(int cy, int cx, int r);
+void lite_room(int y1, int x1);
+void unlite_room(int y1, int x1);
+bool_ lite_area(int dam, int rad);
+bool_ unlite_area(int dam, int rad);
+bool_ fire_cloud(int typ, int dir, int dam, int rad, int time);
+bool_ fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff);
+bool_ fire_wall(int typ, int dir, int dam, int time);
+bool_ fire_ball(int typ, int dir, int dam, int rad);
+bool_ fire_bolt(int typ, int dir, int dam);
+bool_ fire_beam(int typ, int dir, int dam);
+void call_chaos();
+bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam);
+bool_ lite_line(int dir);
+bool_ drain_life(int dir, int dam);
+bool_ wall_to_mud(int dir);
+bool_ wizard_lock(int dir);
+bool_ slow_monster(int dir);
+bool_ sleep_monster(int dir);
+bool_ confuse_monster(int dir, int plev);
+bool_ fear_monster(int dir, int plev);
+bool_ poly_monster(int dir);
+bool_ teleport_monster(int dir);
+bool_ trap_creation();
+bool_ destroy_doors_touch();
+bool_ destroy_traps_touch();
+bool_ sleep_monsters_touch();
+bool_ alchemy();
+void activate_ty_curse();
+void activate_dg_curse();
+void summon_cyber();
+bool_ confuse_monsters(int dam);
+bool_ charm_monsters(int dam);
+bool_ charm_animals(int dam);
+bool_ stun_monsters(int dam);
+bool_ banish_monsters(int dist);
+bool_ turn_monsters(int dam);
+bool_ charm_monster(int dir, int plev);
+bool_ control_one_undead(int dir, int plev);
+bool_ charm_animal(int dir, int plev);
+bool_ mindblast_monsters(int dam);
+void alter_reality();
+void report_magics();
+void teleport_swap(int dir);
+void swap_position(int lty, int ltx);
+object_filter_t const &item_tester_hook_recharge();
+bool_ project_hack(int typ, int dam);
+void project_meteor(int radius, int typ, int dam, u32b flg);
+object_filter_t const &item_tester_hook_artifactable();
+bool_ passwall(int dir, bool_ safe);
+bool_ project_hook(int typ, int dir, int dam, int flg);
+bool_ reset_recall(bool_ no_trepas_max_depth);
+void geomancy_random_wall(int y, int x);
+void geomancy_random_floor(int y, int x, bool_ kill_wall);
+void geomancy_dig(int oy, int ox, int dir, int length);
+void channel_the_elements(int y, int x, int level);
+void random_resistance(object_type *o_ptr, int specific);
diff --git a/src/spells3.cc b/src/spells3.cc
index 35604f7d..58d42cab 100644
--- a/src/spells3.cc
+++ b/src/spells3.cc
@@ -3,12 +3,15 @@
#include "cave.hpp"
#include "cave_type.hpp"
#include "cmd5.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "lua_bind.hpp"
#include "mimic.hpp"
#include "monster2.hpp"
#include "monster3.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
@@ -41,7 +44,6 @@ s32b THUNDERSTORM;
s32b STERILIZE;
s32b BLINK;
-s32b DISARM;
s32b TELEPORT;
s32b TELEAWAY;
s32b RECALL;
@@ -192,11 +194,6 @@ s32b VARDA_CALL_ALMAREN;
s32b VARDA_EVENSTAR;
s32b VARDA_STARKINDLER;
-static s32b get_level_s(int sp, int max)
-{
- return get_level(sp, max, 1);
-}
-
static void find_position(int y, int x, int *yy, int *xx)
{
int attempts = 500;
@@ -403,19 +400,6 @@ const char *convey_blink_info()
return buf;
}
-casting_result convey_disarm()
-{
- casting_result result = NO_CAST;
-
- result = cplus(result, destroy_doors_touch());
- if (get_level_s(DISARM, 50) >= 10)
- {
- result = cplus(result, destroy_traps_touch());
- }
-
- return result;
-}
-
casting_result convey_teleport()
{
p_ptr->energy -= (25 - get_level_s(TELEPORT, 50));
@@ -628,13 +612,13 @@ casting_result demonology_demon_madness()
x2 = p_ptr->px - (x1 - p_ptr->px);
result = cplus(result,
- project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
+ project(0, 1 + get_level(DEMON_MADNESS, 4),
y1, x1,
20 + get_level_s(DEMON_MADNESS, 200),
type,
PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL));
result = cplus(result,
- project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
+ project(0, 1 + get_level(DEMON_MADNESS, 4),
y2, x2,
20 + get_level_s(DEMON_MADNESS, 200),
type,
@@ -649,7 +633,7 @@ const char *demonology_demon_madness_info()
sprintf(buf,
"dam " FMTs32b " rad " FMTs32b,
(20 + get_level_s(DEMON_MADNESS, 200)),
- (1 + get_level(DEMON_MADNESS, 4, 0)));
+ (1 + get_level(DEMON_MADNESS, 4)));
return buf;
}
@@ -721,7 +705,7 @@ casting_result demonology_unholy_word()
}
/* Oops he is angry now */
- if (magik(30 - get_level(UNHOLY_WORD, 25, 0)))
+ if (magik(30 - get_level(UNHOLY_WORD, 25)))
{
char buf[128];
monster_desc(buf, m_ptr, 0);
@@ -741,7 +725,7 @@ casting_result demonology_unholy_word()
msg_format("You consume %s.", buf);
heal = (m_ptr->hp * 100) / m_ptr->maxhp;
- heal = ((30 + get_level(UNHOLY_WORD, 50, 0)) * heal) / 100;
+ heal = ((30 + get_level(UNHOLY_WORD, 50)) * heal) / 100;
hp_player(heal);
@@ -761,13 +745,13 @@ const char *demonology_unholy_word_info()
static char buf[128];
sprintf(buf,
"heal mhp%% of " FMTs32b "%%",
- (30 + get_level(UNHOLY_WORD, 50, 0)));
+ (30 + get_level(UNHOLY_WORD, 50)));
return buf;
}
casting_result demonology_demon_cloak()
{
- return cast(set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15, 0)));
+ return cast(set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15)));
}
const char *demonology_demon_cloak_info()
@@ -775,7 +759,7 @@ const char *demonology_demon_cloak_info()
static char buf[128];
sprintf(buf,
"dur " FMTs32b "+d5",
- (5 + get_level(DEMON_CLOAK, 15, 0)));
+ (5 + get_level(DEMON_CLOAK, 15)));
return buf;
}
@@ -844,10 +828,10 @@ casting_result demonology_discharge_minion()
delete_monster_idx(c_ptr->m_idx);
dam = m_ptr->hp;
- dam = (dam * (20 + get_level(DISCHARGE_MINION, 60, 0))) / 100;
- if (dam > 100 + get_level(DISCHARGE_MINION, 500, 0))
+ dam = (dam * (20 + get_level(DISCHARGE_MINION, 60))) / 100;
+ if (dam > 100 + get_level(DISCHARGE_MINION, 500))
{
- dam = 100 + get_level(DISCHARGE_MINION, 500, 0);
+ dam = 100 + get_level(DISCHARGE_MINION, 500);
}
/* We use project instead of fire_ball because we must tell it exactly where to land */
@@ -866,8 +850,8 @@ const char *demonology_discharge_minion_info()
static char buf[128];
sprintf(buf,
"dam " FMTs32b "%% max " FMTs32b,
- (20 + get_level(DISCHARGE_MINION, 60, 0)),
- (100 + get_level(DISCHARGE_MINION, 500, 0)));
+ (20 + get_level(DISCHARGE_MINION, 60)),
+ (100 + get_level(DISCHARGE_MINION, 500)));
return buf;
}
@@ -893,31 +877,16 @@ const char *demonology_control_demon_info()
casting_result divination_greater_identify()
{
- if (get_check("Cast on yourself?"))
- {
- self_knowledge(NULL);
- }
- else
- {
- identify_fully();
- }
+ identify_fully();
return CAST_OBVIOUS;
}
casting_result divination_identify()
{
- if (get_level_s(IDENTIFY, 50) >= 27)
+ if (get_level_s(IDENTIFY, 50) >= 17)
{
casting_result result = NO_CAST;
result = cplus(result, identify_pack());
- result = cplus(result, fire_ball(GF_IDENTIFY, 0, 1, get_level_s(IDENTIFY, 3)));
- return result;
- }
- else if (get_level_s(IDENTIFY, 50) >= 17)
- {
- casting_result result = NO_CAST;
- result = cplus(result, identify_pack());
- result = cplus(result, fire_ball(GF_IDENTIFY, 0, 1, 0));
return result;
}
else if (ident_spell())
@@ -962,12 +931,7 @@ casting_result divination_vision()
casting_result divination_sense_hidden()
{
casting_result result = NO_CAST;
-
- result = cplus(result, detect_traps(15 + get_level(SENSEHIDDEN, 40, 0)));
- if (get_level_s(SENSEHIDDEN, 50) >= 15)
- {
- result = cplus(result, set_tim_invis(10 + randint(20) + get_level_s(SENSEHIDDEN, 40)));
- }
+ result = cplus(result, set_tim_invis(10 + randint(20) + get_level_s(SENSEHIDDEN, 40)));
return result;
}
@@ -996,8 +960,8 @@ const char *divination_sense_hidden_info()
casting_result divination_reveal_ways()
{
casting_result result = NO_CAST;
- result = cplus(result, detect_doors(10 + get_level(REVEALWAYS, 40, 0)));
- result = cplus(result, detect_stairs(10 + get_level(REVEALWAYS, 40, 0)));
+ result = cplus(result, detect_doors(10 + get_level(REVEALWAYS, 40)));
+ result = cplus(result, detect_stairs(10 + get_level(REVEALWAYS, 40)));
return result;
}
@@ -1014,7 +978,7 @@ casting_result divination_sense_monsters()
{
casting_result result = NO_CAST;
- result = cplus(result, detect_monsters_normal(10 + get_level(SENSEMONSTERS, 40, 0)));
+ result = cplus(result, detect_monsters_normal(10 + get_level(SENSEMONSTERS, 40)));
if (get_level_s(SENSEMONSTERS, 50) >= 30)
{
result = cplus(result, set_tim_esp(10 + randint(10) + get_level_s(SENSEMONSTERS, 20)));
@@ -1250,7 +1214,7 @@ casting_result eru_know_the_music()
casting_result eru_lay_of_protection()
{
- return cast(fire_ball(GF_MAKE_GLYPH, 0, 1, 1 + get_level(ERU_PROT, 2, 0)));
+ return cast(fire_ball(GF_MAKE_GLYPH, 0, 1, 1 + get_level(ERU_PROT, 2)));
}
const char *eru_lay_of_protection_info()
@@ -1258,7 +1222,7 @@ const char *eru_lay_of_protection_info()
static char buf[128];
sprintf(buf,
"rad " FMTs32b,
- (1 + get_level(ERU_PROT, 2, 0)));
+ (1 + get_level(ERU_PROT, 2)));
return buf;
}
@@ -1471,7 +1435,7 @@ casting_result geomancy_call_the_elements()
fire_ball(GF_ELEMENTAL_GROWTH,
dir,
1,
- 1 + get_level(CALL_THE_ELEMENTS, 5, 0));
+ 1 + get_level(CALL_THE_ELEMENTS, 5));
return CAST_OBVIOUS;
}
@@ -1481,7 +1445,7 @@ const char *geomancy_call_the_elements_info()
static char buf[128];
sprintf(buf,
"rad " FMTs32b,
- (1 + get_level(CALL_THE_ELEMENTS, 5, 0)));
+ (1 + get_level(CALL_THE_ELEMENTS, 5)));
return buf;
}
@@ -2108,7 +2072,7 @@ casting_result manwe_call()
if (m_idx > 0)
{
- monster_set_level(m_idx, 20 + get_level(MANWE_CALL, 70, 0));
+ monster_set_level(m_idx, 20 + get_level(MANWE_CALL, 70));
return CAST_OBVIOUS;
}
@@ -2276,7 +2240,7 @@ casting_result melkor_mind_steal()
auto const r_ptr = m_ptr->race();
if ((randint(m_ptr->level) < chance) &&
- ((r_ptr->flags1 & RF1_UNIQUE) == 0))
+ ((r_ptr->flags & RF_UNIQUE).empty()))
{
p_ptr->control = target_who;
m_ptr->mflag |= MFLAG_CONTROL;
@@ -2327,7 +2291,9 @@ static int get_spellbinder_max()
casting_result meta_spellbinder()
{
- if (p_ptr->spellbinder_num != 0)
+ auto spellbinder = &p_ptr->spellbinder;
+
+ if (spellbinder->spell_idxs.size() > 0)
{
struct trigger {
int idx;
@@ -2340,13 +2306,12 @@ casting_result meta_spellbinder()
{ -1, NULL, },
};
int trigger_idx = -1;
- int i;
- assert(p_ptr->spellbinder_trigger >= 0);
+ assert(spellbinder->trigger >= 0);
for (trigger_idx = 0; triggers[trigger_idx].idx >= 0; trigger_idx++)
{
- if (triggers[trigger_idx].idx == p_ptr->spellbinder_trigger)
+ if (triggers[trigger_idx].idx == spellbinder->trigger)
{
break;
}
@@ -2355,9 +2320,9 @@ casting_result meta_spellbinder()
msg_print("The spellbinder is already active.");
msg_format("It will trigger at %s.", triggers[trigger_idx].desc);
msg_print("With the spells: ");
- for (i = 0; i < p_ptr->spellbinder_num; i++)
+ for (auto spell_idx : spellbinder->spell_idxs)
{
- msg_print(spell_type_name(spell_at(p_ptr->spellbinder[i])));
+ msg_print(spell_type_name(spell_at(spell_idx)));
}
/* Doesn't cost anything */
@@ -2366,7 +2331,6 @@ casting_result meta_spellbinder()
else
{
char c;
- int i;
if (!get_com("Trigger at [a]75% hp [b]50% hp [c]25% hp?", &c))
{
@@ -2376,30 +2340,32 @@ casting_result meta_spellbinder()
switch (c)
{
case 'a':
- p_ptr->spellbinder_trigger = SPELLBINDER_HP75;
+ spellbinder->trigger = SPELLBINDER_HP75;
break;
case 'b':
- p_ptr->spellbinder_trigger = SPELLBINDER_HP50;
+ spellbinder->trigger = SPELLBINDER_HP50;
break;
case 'c':
- p_ptr->spellbinder_trigger = SPELLBINDER_HP25;
+ spellbinder->trigger = SPELLBINDER_HP25;
break;
default:
return NO_CAST;
}
- p_ptr->spellbinder_num = get_spellbinder_max();
- i = p_ptr->spellbinder_num;
- while (i > 0)
+ std::size_t n = get_spellbinder_max();
+ while (n > 0)
{
s32b s = get_school_spell("bind", 0);
+
if (s == -1)
{
- p_ptr->spellbinder_trigger = 0;
- p_ptr->spellbinder_num = 0;
+ spellbinder->trigger = 0;
+ spellbinder->spell_idxs.clear();
return CAST_OBVIOUS;
- } else {
+ }
+ else
+ {
if (spell_type_skill_level(spell_at(s)) > 7 + get_level_s(SPELLBINDER, 35))
{
msg_format("You are only allowed spells with a base level of " FMTs32b ".", (7 + get_level_s(SPELLBINDER, 35)));
@@ -2407,8 +2373,8 @@ casting_result meta_spellbinder()
}
}
- p_ptr->spellbinder[i] = s;
- i = i - 1;
+ spellbinder->spell_idxs.push_back(s);
+ n--;
}
p_ptr->energy = p_ptr->energy - 3100;
@@ -2481,7 +2447,7 @@ static void stop_inertia_controlled_spell()
assert(TIMER_INERTIA_CONTROL != NULL);
p_ptr->inertia_controlled_spell = -1;
- TIMER_INERTIA_CONTROL->enabled = FALSE;
+ TIMER_INERTIA_CONTROL->disable();
p_ptr->update = p_ptr->update | PU_MANA;
}
@@ -2526,9 +2492,8 @@ casting_result meta_inertia_control()
}
p_ptr->inertia_controlled_spell = s;
- TIMER_INERTIA_CONTROL->enabled = TRUE;
- TIMER_INERTIA_CONTROL->delay = delay;
- TIMER_INERTIA_CONTROL->countdown = delay;
+ TIMER_INERTIA_CONTROL->set_delay_and_reset(delay);
+ TIMER_INERTIA_CONTROL->enable();
p_ptr->update |= PU_MANA;
msg_format("Inertia flow controlling spell %s.", spell_type_name(spell_at(s)));
return CAST_OBVIOUS;
@@ -2727,6 +2692,8 @@ const char *mind_stun_info()
casting_result tempo_magelock()
{
+ auto const &f_info = game->edit_data.f_info;
+
if (get_level_s(MAGELOCK, 50) >= 30)
{
int x,y;
@@ -2742,8 +2709,8 @@ casting_result tempo_magelock()
c_ptr = &cave[y][x];
- if ((!(f_info[c_ptr->feat].flags1 | FF1_FLOOR)) ||
- (f_info[c_ptr->feat].flags1 | FF1_PERMANENT) ||
+ if ((!(f_info[c_ptr->feat].flags | FF_FLOOR)) ||
+ (f_info[c_ptr->feat].flags | FF_PERMANENT) ||
(!los(p_ptr->py, p_ptr->px, y, x)))
{
msg_print("You cannot place it there.");
@@ -2973,6 +2940,8 @@ static object_filter_t const &udun_object_is_drainable()
casting_result udun_drain()
{
+ auto const &k_info = game->edit_data.k_info;
+
/* Ask for an item */
int item;
if (!get_item(&item,
@@ -2992,7 +2961,7 @@ casting_result udun_drain()
case TV_STAFF:
case TV_WAND:
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
+ auto k_ptr = &k_info[o_ptr->k_idx];
/* Generate mana */
increase_mana(o_ptr->pval * k_ptr->level * o_ptr->number);
@@ -3123,7 +3092,7 @@ static int water_ice_storm_damage()
static int water_ice_storm_radius()
{
- return 1 + get_level(ICESTORM, 3, 0);
+ return 1 + get_level(ICESTORM, 3);
}
static int water_ice_storm_duration()
@@ -3206,7 +3175,7 @@ static int water_vapor_damage()
static int water_vapor_radius()
{
- return 3 + get_level(VAPOR, 9, 0);
+ return 3 + get_level(VAPOR, 9);
}
static int water_vapor_duration()
@@ -3925,10 +3894,6 @@ const char *music_hobbit_melodies_info()
int music_clairaudience_lasting()
{
set_tim_esp(5);
- if (get_level_s(MUSIC_MIND, 50) >= 10)
- {
- fire_ball(GF_IDENTIFY, 0, 1, 1 + get_level(MUSIC_MIND, 3, 0));
- }
return get_mana(MUSIC_MIND);
}
@@ -3945,7 +3910,7 @@ const char *music_clairaudience_info()
if (get_level_s(MUSIC_MIND, 50) >= 10)
{
sprintf(buf, "rad " FMTs32b,
- 1 + get_level(MUSIC_MIND, 3, 0));
+ 1 + get_level(MUSIC_MIND, 3));
return buf;
}
else
@@ -3958,8 +3923,8 @@ casting_result music_blow_spell()
{
fire_ball(GF_SOUND,
0,
- damroll(2 + get_level(MUSIC_BLOW, 10, 0), 4 + get_level(MUSIC_BLOW, 40, 0)),
- 1 + get_level(MUSIC_BLOW, 12, 0));
+ damroll(2 + get_level(MUSIC_BLOW, 10), 4 + get_level(MUSIC_BLOW, 40)),
+ 1 + get_level(MUSIC_BLOW, 12));
return CAST_OBVIOUS;
}
@@ -3968,9 +3933,9 @@ const char *music_blow_info()
static char buf[128];
sprintf(buf,
"dam " FMTs32b "d" FMTs32b " rad " FMTs32b,
- 2 + get_level(MUSIC_BLOW, 10, 0),
- 4 + get_level(MUSIC_BLOW, 40, 0),
- 1 + get_level(MUSIC_BLOW, 12, 0));
+ 2 + get_level(MUSIC_BLOW, 10),
+ 4 + get_level(MUSIC_BLOW, 40),
+ 1 + get_level(MUSIC_BLOW, 12));
return buf;
}
@@ -3978,8 +3943,8 @@ casting_result music_gush_of_wind_spell()
{
fire_ball(GF_AWAY_ALL,
0,
- 10 + get_level(MUSIC_BLOW, 40, 0),
- 1 + get_level(MUSIC_BLOW, 12, 0));
+ 10 + get_level(MUSIC_BLOW, 40),
+ 1 + get_level(MUSIC_BLOW, 12));
return CAST_OBVIOUS;
}
@@ -3988,8 +3953,8 @@ const char *music_gush_of_wind_info()
static char buf[128];
sprintf(buf,
"dist " FMTs32b " rad " FMTs32b,
- 10 + get_level(MUSIC_BLOW, 40, 0),
- 1 + get_level(MUSIC_BLOW, 12, 0));
+ 10 + get_level(MUSIC_BLOW, 40),
+ 1 + get_level(MUSIC_BLOW, 12));
return buf;
}
@@ -4192,7 +4157,7 @@ casting_result aule_child_spell()
if (m_idx)
{
- monster_set_level(m_idx, 20 + get_level(AULE_CHILD, 70, 0));
+ monster_set_level(m_idx, 20 + get_level(AULE_CHILD, 70));
return CAST_OBVIOUS;
}
else
@@ -4295,7 +4260,7 @@ const char *mandos_tale_of_doom_info()
int call_to_the_halls_mlev()
{
- return 20 + get_level(MANDOS_CALL_HALLS, 70, 0);
+ return 20 + get_level(MANDOS_CALL_HALLS, 70);
}
casting_result mandos_call_to_the_halls_spell()
@@ -4408,7 +4373,7 @@ const char *ulmo_draught_of_ulmonan_info()
static int call_of_the_ulumuri_mlev()
{
- return 30 + get_level(ULMO_CALL_ULUMURI, 70, 0);
+ return 30 + get_level(ULMO_CALL_ULUMURI, 70);
}
casting_result ulmo_call_of_the_ulumuri_spell()
@@ -4558,7 +4523,6 @@ casting_result varda_evenstar_spell()
if (get_level_s(VARDA_EVENSTAR, 50) >= 40)
{
identify_pack();
- self_knowledge(NULL);
}
return CAST_OBVIOUS;
diff --git a/src/spells3.hpp b/src/spells3.hpp
index 3380203a..12e6a78f 100644
--- a/src/spells3.hpp
+++ b/src/spells3.hpp
@@ -33,7 +33,6 @@ extern s32b PROBABILITY_TRAVEL;
casting_result convey_blink();
const char *convey_blink_info();
-casting_result convey_disarm();
casting_result convey_teleport();
const char *convey_teleport_info();
casting_result convey_teleport_away();
diff --git a/src/spells4.cc b/src/spells4.cc
index 62586758..97c3d523 100644
--- a/src/spells4.cc
+++ b/src/spells4.cc
@@ -210,7 +210,6 @@ void init_school_books()
push_spell(TOME_TRANSLOCATION, RECALL);
push_spell(TOME_TRANSLOCATION, TELEAWAY);
push_spell(TOME_TRANSLOCATION, TELEPORT);
- push_spell(TOME_TRANSLOCATION, DISARM);
push_spell(TOME_TRANSLOCATION, BLINK);
/* Create the book of the tree */
@@ -512,10 +511,7 @@ void lua_cast_school_spell(s32b s, bool_ no_cost)
/* failures are dangerous; we'll flush the input buffer
so it isn't missed. */
- if (flush_failure)
- {
- flush();
- }
+ flush_on_failure();
msg_print("You failed to get the spell off!");
}
diff --git a/src/spells5.cc b/src/spells5.cc
index f503c822..ba2e6d05 100644
--- a/src/spells5.cc
+++ b/src/spells5.cc
@@ -919,30 +919,6 @@ void school_spells_init()
}
{
- spell_type *spell = spell_new(&DISARM, "Disarm");
- spell_type_describe(spell, "Destroys doors and traps");
- spell_type_describe(spell, "At level 10 it destroys doors and traps, then reveals and unlocks any secret");
- spell_type_describe(spell, "doors");
- spell_type_set_mana(spell, 2, 4);
- spell_type_set_difficulty(spell, 3, 15);
- spell_type_init_mage(spell,
- RANDOM,
- SCHOOL_CONVEYANCE,
- no_info,
- convey_disarm);
-
- spell_type_set_device_charges(spell, "10+d15");
-
- {
- device_allocation *device_allocation = device_allocation_new(TV_STAFF);
- device_allocation->rarity = 4;
- range_init(&device_allocation->base_level, 1, 10);
- range_init(&device_allocation->max_level, 10, 50);
- spell_type_add_device_allocation(spell, device_allocation);
- }
- }
-
- {
spell_type *spell = spell_new(&TELEPORT, "Teleportation");
spell_type_describe(spell, "Teleports you around the level. The casting time decreases with level");
spell_type_set_mana(spell, 8, 14);
@@ -1143,7 +1119,7 @@ void school_spells_init()
spell_type_describe(spell, "Asks for an object and identifies it");
spell_type_describe(spell, "At level 17 it identifies all objects in the inventory");
spell_type_describe(spell, "At level 27 it identifies all objects in the inventory and in a");
- spell_type_describe(spell, "radius on the floor, as well as probing monsters in that radius");
+ spell_type_describe(spell, "radius on the floor");
spell_type_set_mana(spell, 10, 50);
spell_type_set_difficulty(spell, 8, 40);
spell_type_init_mage(spell,
@@ -2321,8 +2297,7 @@ void school_spells_init()
{
spell_type *spell = spell_new(&MUSIC_MIND, "Clairaudience(IV)");
spell_type_describe(spell, "Allows you to sense monster minds as long as you sing.");
- spell_type_describe(spell, "At level 10 it identifies all objects in a radius on the floor,");
- spell_type_describe(spell, "as well as probing monsters in that radius.");
+ spell_type_describe(spell, "At level 10 it identifies all objects in a radius on the floor.");
spell_type_describe(spell, "Consumes the amount of mana each turn.");
spell_type_set_mana(spell, 15, 30);
spell_type_set_difficulty(spell, 25, 75);
diff --git a/src/spells6.cc b/src/spells6.cc
index a4564ae3..555f252f 100644
--- a/src/spells6.cc
+++ b/src/spells6.cc
@@ -1,5 +1,6 @@
#include "spells6.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "lua_bind.hpp"
#include "object2.hpp"
@@ -151,6 +152,8 @@ static bool_ geomancy_depends_satisfied()
long get_provided_levels(school_type *school)
{
+ auto const &s_info = game->s_info;
+
for (auto school_provider: school->providers->v)
{
if (school_provider.deity_idx == p_ptr->pgod)
@@ -171,6 +174,8 @@ struct get_level_school_callback_data {
static bool get_level_school_callback(struct get_level_school_callback_data *data, int school_idx)
{
+ auto const &s_info = game->s_info;
+
school_type *school = school_at(school_idx);
long r = 0, s = 0, p = 0, ok = 0;
diff --git a/src/squelch/automatizer.cc b/src/squelch/automatizer.cc
index c3c52b1b..b06367a8 100644
--- a/src/squelch/automatizer.cc
+++ b/src/squelch/automatizer.cc
@@ -12,20 +12,21 @@ namespace squelch {
/**
* Parse rules from JSON array
*/
-static std::vector< std::shared_ptr < Rule > > parse_rules(json_t *rules_j)
+static std::vector< std::shared_ptr < Rule > > parse_rules(jsoncons::json const &rules_json)
{
std::vector< std::shared_ptr < Rule > > rules;
- if (!json_is_array(rules_j))
+ if (!rules_json.is_array())
{
msg_format("Error 'rules' is not an array");
return rules;
}
- for (size_t i = 0; i < json_array_size(rules_j); i++)
+ auto rules_array = rules_json.array_value();
+
+ for (auto const &rule_value : rules_array)
{
- json_t *rule_j = json_array_get(rules_j, i);
- auto rule = Rule::parse_rule(rule_j);
+ auto rule = Rule::parse_rule(rule_value);
if (rule)
{
rules.push_back(rule);
@@ -63,25 +64,25 @@ bool Automatizer::apply_rules(object_type *o_ptr, int item_idx) const
return false;
}
-std::shared_ptr<json_t> Automatizer::to_json() const
+jsoncons::json Automatizer::to_json() const
{
- auto rules_json = std::shared_ptr<json_t>(json_array(), &json_decref);
+ auto document = jsoncons::json::array();
for (auto rule : m_rules)
{
- json_array_append_new(rules_json.get(), rule->to_json());
+ document.push_back(rule->to_json());
}
- return rules_json;
+ return document;
}
-void Automatizer::load_json(json_t *json)
+void Automatizer::load_json(jsoncons::json const &document)
{
// Go through all the found rules
- auto rules = parse_rules(json);
+ auto rules = parse_rules(document);
// Load rule
- for (auto rule : rules)
+ for (auto rule: rules)
{
append_rule(rule);
}
@@ -204,13 +205,15 @@ void Automatizer::add_new_condition(std::function<std::shared_ptr<Condition> ()>
factory);
}
-void Automatizer::get_rule_names(std::vector<const char *> *names) const
+std::vector<std::string> Automatizer::get_rule_names() const
{
- names->resize(m_rules.size());
- for (size_t i = 0; i < m_rules.size(); i++)
+ std::vector<std::string> names;
+ names.reserve(m_rules.size());
+ for (auto const &rule: m_rules)
{
- (*names)[i] = m_rules.at(i)->get_name();
+ names.push_back(rule->get_name());
}
+ return names;
}
int Automatizer::rules_count() const
diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc
index c3b8c3f5..cd7f879c 100644
--- a/src/squelch/condition.cc
+++ b/src/squelch/condition.cc
@@ -6,6 +6,7 @@
#include "tome/squelch/cursor.hpp"
#include "tome/squelch/tree_printer.hpp"
#include "../ability_type.hpp"
+#include "../game.hpp"
#include "../object1.hpp"
#include "../object2.hpp"
#include "../object_kind.hpp"
@@ -16,7 +17,6 @@
#include "../player_type.hpp"
#include "../skills.hpp"
#include "../skill_type.hpp"
-#include "../quark.hpp"
#include "../util.hpp"
#include "../variable.hpp"
@@ -58,12 +58,15 @@ EnumStringMap<identification_state> &identification_state_mapping()
return *m;
}
-json_t *Condition::to_json() const
+jsoncons::json Condition::to_json() const
{
- json_t *j = json_object();
- json_object_set_new(j, "type",
- json_string(match_mapping().stringify(match)));
+ // Start with an object with only 'type' property
+ jsoncons::json j;
+ j["type"] = match_mapping().stringify(match);
+
+ // Add sub-class properties
to_json(j);
+ // Return the completed JSON
return j;
}
@@ -86,11 +89,11 @@ void Condition::display(TreePrinter *tree_printer, Cursor *cursor) const
tree_printer->dedent();
}
-std::shared_ptr<Condition> Condition::parse_condition(json_t *condition_json)
+std::shared_ptr<Condition> Condition::parse_condition(jsoncons::json const &condition_json)
{
// Parsers for concrete types of conditions.
static std::map< match_type,
- std::function< std::shared_ptr< Condition > ( json_t * ) > > parsers {
+ std::function<std::shared_ptr<Condition>(jsoncons::json const &)>> parsers {
{ match_type::AND, &AndCondition::from_json },
{ match_type::OR, &OrCondition::from_json },
{ match_type::NOT, &NotCondition::from_json },
@@ -112,15 +115,13 @@ std::shared_ptr<Condition> Condition::parse_condition(json_t *condition_json)
{ match_type::SKILL, &SkillCondition::from_json },
{ match_type::ABILITY, &AbilityCondition::from_json } };
- if ((condition_json == nullptr) || json_is_null(condition_json))
+ if (condition_json.is_null())
{
return nullptr;
}
- cptr type_s = nullptr;
- if (json_unpack(condition_json,
- "{s:s}",
- "type", &type_s) < 0)
+ cptr type_s = condition_json.get("type").as<cptr>();
+ if (!type_s)
{
msg_print("Missing/invalid 'type' in condition");
return nullptr;
@@ -144,11 +145,11 @@ std::shared_ptr<Condition> Condition::parse_condition(json_t *condition_json)
return nullptr;
}
-json_t *Condition::optional_to_json(std::shared_ptr<Condition> condition)
+jsoncons::json Condition::optional_to_json(std::shared_ptr<Condition> condition)
{
return condition
? condition->to_json()
- : json_null();
+ : jsoncons::json::null_type();
}
bool TvalCondition::is_match(object_type *o_ptr) const
@@ -156,22 +157,23 @@ bool TvalCondition::is_match(object_type *o_ptr) const
return (o_ptr->tval == m_tval);
}
-std::shared_ptr<Condition> TvalCondition::from_json(json_t *j)
+std::shared_ptr<Condition> TvalCondition::from_json(jsoncons::json const &j)
{
- int tval;
-
- if (json_unpack(j, "{s:i}", "tval", &tval) < 0)
+ auto tval_j = j.get("tval");
+ if (!tval_j.is_uinteger())
{
msg_print("Missing/invalid 'tval' property");
return nullptr;
}
+ int tval = tval_j.as_uint();
+
return std::make_shared<TvalCondition>(tval);
}
-void TvalCondition::to_json(json_t *j) const
+void TvalCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "tval", json_integer(m_tval));
+ j["tval"] = m_tval;
}
void TvalCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const
@@ -193,14 +195,16 @@ bool NameCondition::is_match(object_type *o_ptr) const
return boost::algorithm::iequals(m_name, buf1);
}
-std::shared_ptr<Condition> NameCondition::from_json(json_t *j)
+std::shared_ptr<Condition> NameCondition::from_json(jsoncons::json const &j)
{
- cptr s = nullptr;
- if (json_unpack(j, "{s:s}", "name", &s) < 0)
+ cptr s = j.get("name").as<cptr>();
+
+ if (!s)
{
msg_print("Missing/invalid 'name' property");
return nullptr;
}
+
return std::make_shared<NameCondition>(s);
}
@@ -214,9 +218,9 @@ void NameCondition::write_tree(TreePrinter *p, Cursor *cursor, uint8_t ecol, uin
p->write(TERM_WHITE, "\n");
}
-void NameCondition::to_json(json_t *j) const
+void NameCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "name", json_string(m_name.c_str()));
+ j["name"] = m_name;
}
bool ContainCondition::is_match(object_type *o_ptr) const
@@ -226,14 +230,16 @@ bool ContainCondition::is_match(object_type *o_ptr) const
return boost::algorithm::icontains(buf1, m_contain);
}
-std::shared_ptr<Condition> ContainCondition::from_json(json_t *j)
+std::shared_ptr<Condition> ContainCondition::from_json(jsoncons::json const &j)
{
- cptr s = nullptr;
- if (json_unpack(j, "{s:s}", "contain", &s) < 0)
+ cptr s = j.get("contain").as<cptr>();
+
+ if (!s)
{
msg_print("Missing/invalid 'contain' property");
return nullptr;
}
+
return std::make_shared<ContainCondition>(s);
}
@@ -247,9 +253,9 @@ void ContainCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_
p->write(TERM_WHITE, "\n");
}
-void ContainCondition::to_json(json_t *j) const
+void ContainCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "contain", json_string(m_contain.c_str()));
+ j["contain"] = m_contain;
}
bool SvalCondition::is_match(object_type *o_ptr) const
@@ -259,19 +265,25 @@ bool SvalCondition::is_match(object_type *o_ptr) const
(o_ptr->sval <= m_max));
}
-std::shared_ptr<Condition> SvalCondition::from_json(json_t *j)
+std::shared_ptr<Condition> SvalCondition::from_json(jsoncons::json const &j)
{
- int min, max;
+ auto min_j = j.get("min");
+ if (!min_j.is_uinteger())
+ {
+ msg_print("Missing/invalid 'min' property");
+ return nullptr;
+ }
- if (json_unpack(j, "{s:i,s:i}",
- "min", &min,
- "max", &max) < 0)
+ auto max_j = j.get("max");
+ if (!max_j.is_uinteger())
{
- msg_print("Missing/invalid 'min'/'max' properties");
+ msg_print("Missing/invalid 'max' property");
return nullptr;
}
- return std::make_shared<SvalCondition>(min, max);
+ return std::make_shared<SvalCondition>(
+ min_j.as_uint(),
+ max_j.as_uint());
}
void SvalCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const
@@ -285,10 +297,10 @@ void SvalCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t b
p->write(TERM_WHITE, "\n");
}
-void SvalCondition::to_json(json_t *j) const
+void SvalCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "min", json_integer(m_min));
- json_object_set_new(j, "max", json_integer(m_max));
+ j["min"] = m_min;
+ j["max"] = m_max;
}
void GroupingCondition::add_child(ConditionFactory const &factory)
@@ -370,16 +382,15 @@ std::shared_ptr<Condition> GroupingCondition::next_child(Condition *current)
return nullptr;
}
-std::vector< std::shared_ptr<Condition> > GroupingCondition::parse_conditions(json_t *j)
+std::vector< std::shared_ptr<Condition> > GroupingCondition::parse_conditions(jsoncons::json const &j)
{
- json_t *conditions_j = json_object_get(j, "conditions");
+ auto conditions_j = j.get("conditions");
- if ((conditions_j == nullptr) ||
- (json_is_null(conditions_j)))
+ if (conditions_j.is_null())
{
return std::vector< std::shared_ptr<Condition> >();
}
- else if (!json_is_array(conditions_j))
+ else if (!conditions_j.is_array())
{
msg_print("'conditions' property has invalid type");
return std::vector< std::shared_ptr<Condition> >();
@@ -387,11 +398,8 @@ std::vector< std::shared_ptr<Condition> > GroupingCondition::parse_conditions(js
else
{
std::vector< std::shared_ptr<Condition> > subconditions;
- for (size_t i = 0; i < json_array_size(conditions_j); i++)
+ for (auto const &subcondition_j: conditions_j.array_value())
{
- json_t *subcondition_j =
- json_array_get(conditions_j, i);
-
std::shared_ptr<Condition> subcondition =
parse_condition(subcondition_j);
@@ -404,14 +412,16 @@ std::vector< std::shared_ptr<Condition> > GroupingCondition::parse_conditions(js
}
}
-void GroupingCondition::to_json(json_t *j) const
+void GroupingCondition::to_json(jsoncons::json &j) const
{
- json_t *ja = json_array();
+ // Put all the sub-conditions into an array
+ jsoncons::json::array ja;
for (auto condition_p : m_conditions)
{
- json_array_append_new(ja, optional_to_json(condition_p));
+ ja.push_back(optional_to_json(condition_p));
}
- json_object_set_new(j, "conditions", ja);
+ // Add to JSON object
+ j["conditions"] = ja;
}
bool AndCondition::is_match(object_type *o_ptr) const
@@ -426,7 +436,7 @@ bool AndCondition::is_match(object_type *o_ptr) const
return true;
}
-std::shared_ptr<Condition> AndCondition::from_json(json_t *j)
+std::shared_ptr<Condition> AndCondition::from_json(jsoncons::json const &j)
{
auto condition = std::make_shared<AndCondition>();
for (auto subcondition : parse_conditions(j))
@@ -459,7 +469,7 @@ bool OrCondition::is_match(object_type *o_ptr) const
return false;
}
-std::shared_ptr<Condition> OrCondition::from_json(json_t *j)
+std::shared_ptr<Condition> OrCondition::from_json(jsoncons::json const &j)
{
std::shared_ptr<OrCondition> condition =
std::make_shared<OrCondition>();
@@ -488,10 +498,11 @@ bool StatusCondition::is_match(object_type *o_ptr) const
return m_status == object_status(o_ptr);
}
-std::shared_ptr<Condition> StatusCondition::from_json(json_t *j)
+std::shared_ptr<Condition> StatusCondition::from_json(jsoncons::json const &j)
{
- cptr s;
- if (json_unpack(j, "{s:s}", "status", &s) < 0)
+ cptr s = j.get("status").as<cptr>();
+
+ if (!s)
{
msg_print("Missing/invalid 'status' property");
return nullptr;
@@ -518,9 +529,9 @@ void StatusCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t
p->write(TERM_WHITE, "\n");
}
-void StatusCondition::to_json(json_t *j) const
+void StatusCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "status", json_string(status_mapping().stringify(m_status)));
+ j["status"] = status_mapping().stringify(m_status);
}
bool RaceCondition::is_match(object_type *o_ptr) const
@@ -528,11 +539,11 @@ bool RaceCondition::is_match(object_type *o_ptr) const
return boost::algorithm::iequals(m_race, rp_ptr->title);
}
-std::shared_ptr<Condition> RaceCondition::from_json(json_t *j)
+std::shared_ptr<Condition> RaceCondition::from_json(jsoncons::json const &j)
{
- cptr s;
+ cptr s = j.get("race").as<cptr>();
- if (json_unpack(j, "{s:s}", "race", &s) < 0)
+ if (!s)
{
msg_print("Missing/invalid 'race' property");
return nullptr;
@@ -552,9 +563,9 @@ void RaceCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t b
p->write(TERM_WHITE, "\n");
}
-void RaceCondition::to_json(json_t *j) const
+void RaceCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "race", json_string(m_race.c_str()));
+ j["race"] = m_race;
}
bool SubraceCondition::is_match(object_type *o_ptr) const
@@ -562,11 +573,11 @@ bool SubraceCondition::is_match(object_type *o_ptr) const
return boost::algorithm::iequals(m_subrace, rmp_ptr->title);
}
-std::shared_ptr<Condition> SubraceCondition::from_json(json_t *j)
+std::shared_ptr<Condition> SubraceCondition::from_json(jsoncons::json const &j)
{
- cptr s;
+ cptr s = j.get("subrace").as<cptr>();
- if (json_unpack(j, "{s:s}", "subrace", &s) < 0)
+ if (!s)
{
msg_print("Missing/invalid 'subrace' property");
return nullptr;
@@ -586,9 +597,9 @@ void SubraceCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_
p->write(TERM_WHITE, "\n");
}
-void SubraceCondition::to_json(json_t *j) const
+void SubraceCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "subrace", json_string(m_subrace.c_str()));
+ j["subrace"] = m_subrace;
}
bool ClassCondition::is_match(object_type *o_ptr) const
@@ -596,11 +607,11 @@ bool ClassCondition::is_match(object_type *o_ptr) const
return boost::algorithm::iequals(m_class, spp_ptr->title);
}
-std::shared_ptr<Condition> ClassCondition::from_json(json_t *j)
+std::shared_ptr<Condition> ClassCondition::from_json(jsoncons::json const &j)
{
- cptr s;
+ cptr s = j.get("class").as<cptr>();
- if (json_unpack(j, "{s:s}", "class", &s) < 0)
+ if (!s)
{
msg_print("Missing/invalid 'class' property");
return nullptr;
@@ -620,30 +631,28 @@ void ClassCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t
p->write(TERM_WHITE, "\n");
}
-void ClassCondition::to_json(json_t *j) const
+void ClassCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "class", json_string(m_class.c_str()));
+ j["class"] = m_class;
}
bool InscriptionCondition::is_match(object_type *o_ptr) const
{
- if (o_ptr->note == 0)
- {
- return false;
- }
return boost::algorithm::icontains(
- quark_str(o_ptr->note),
+ o_ptr->inscription,
m_inscription);
}
-std::shared_ptr<Condition> InscriptionCondition::from_json(json_t *j)
+std::shared_ptr<Condition> InscriptionCondition::from_json(jsoncons::json const &j)
{
- cptr s = nullptr;
- if (json_unpack(j, "{s:s}", "inscription", &s) < 0)
+ cptr s = j.get("inscription").as<cptr>();
+
+ if (!s)
{
msg_print("Missing/invalid 'inscription' property");
return nullptr;
}
+
return std::make_shared<InscriptionCondition>(s);
}
@@ -658,9 +667,9 @@ void InscriptionCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, ui
p->write(TERM_WHITE, "\n");
}
-void InscriptionCondition::to_json(json_t *j) const
+void InscriptionCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "inscription", json_string(m_inscription.c_str()));
+ j["inscription"] = m_inscription;
}
bool DiscountCondition::is_match(object_type *o_ptr) const
@@ -670,17 +679,23 @@ bool DiscountCondition::is_match(object_type *o_ptr) const
(o_ptr->discount <= m_max));
}
-std::shared_ptr<Condition> DiscountCondition::from_json(json_t *j)
+std::shared_ptr<Condition> DiscountCondition::from_json(jsoncons::json const &j)
{
- int min, max;
+ auto min_j = j.get("min");
+ if (!min_j.is_integer())
+ {
+ msg_print("Missing/invalid 'min' property");
+ return nullptr;
+ }
+ int min = min_j.as_int();
- if (json_unpack(j, "{s:i,s:i}",
- "min", &min,
- "max", &max) < 0)
+ auto max_j = j.get("max");
+ if (!max_j.is_integer())
{
- msg_print("Missing/invalid 'min'/'max' properties");
+ msg_print("Missing/invalid 'max' property");
return nullptr;
}
+ int max = max_j.as_int();
return std::make_shared<DiscountCondition>(min, max);
}
@@ -696,10 +711,10 @@ void DiscountCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8
p->write(TERM_WHITE, "\n");
}
-void DiscountCondition::to_json(json_t *j) const
+void DiscountCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "min", json_integer(m_min));
- json_object_set_new(j, "max", json_integer(m_max));
+ j["min"] = m_min;
+ j["max"] = m_max;
}
bool LevelCondition::is_match(object_type *) const
@@ -708,16 +723,23 @@ bool LevelCondition::is_match(object_type *) const
(p_ptr->lev <= m_max));
}
-std::shared_ptr<Condition> LevelCondition::from_json(json_t *j)
+std::shared_ptr<Condition> LevelCondition::from_json(jsoncons::json const &j)
{
- int min, max;
- if (json_unpack(j, "{s:i,s:i}",
- "min", &min,
- "max", &max) < 0)
+ auto min_j = j.get("min");
+ if (!min_j.is_integer())
{
- msg_print("Missing/invalid 'min'/'max' properties");
+ msg_print("Missing/invalid 'min' property");
return nullptr;
}
+ int min = min_j.as_int();
+
+ auto max_j = j.get("max");
+ if (!max_j.is_integer())
+ {
+ msg_print("Missing/invalid 'max' property");
+ return nullptr;
+ }
+ int max = max_j.as_int();
return std::make_shared<LevelCondition>(min, max);
}
@@ -734,10 +756,10 @@ void LevelCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t
p->write(TERM_WHITE, "\n");
}
-void LevelCondition::to_json(json_t *j) const
+void LevelCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "min", json_integer(m_min));
- json_object_set_new(j, "max", json_integer(m_max));
+ j["min"] = m_min;
+ j["max"] = m_max;
}
bool SkillCondition::is_match(object_type *) const
@@ -747,16 +769,28 @@ bool SkillCondition::is_match(object_type *) const
(sk <= m_max));
}
-std::shared_ptr<Condition> SkillCondition::from_json(json_t *j)
+std::shared_ptr<Condition> SkillCondition::from_json(jsoncons::json const &j)
{
- cptr s;
- int min, max;
- if (json_unpack(j, "{s:i,s:i,s:s}",
- "min", &min,
- "max", &max,
- "name", &s) < 0)
+ auto min_j = j.get("min");
+ if (!min_j.is_integer())
+ {
+ msg_print("Missing/invalid 'min' property");
+ return nullptr;
+ }
+ int min = min_j.as_int();
+
+ auto max_j = j.get("max");
+ if (!max_j.is_integer())
{
- msg_print("Missing/invalid 'min'/'max'/'name' properties");
+ msg_print("Missing/invalid 'max' property");
+ return nullptr;
+ }
+ int max = max_j.as_int();
+
+ auto s = j.get("name").as<cptr>();
+ if (!s)
+ {
+ msg_print("Missing/invalid 'name' property");
return nullptr;
}
@@ -772,8 +806,10 @@ std::shared_ptr<Condition> SkillCondition::from_json(json_t *j)
void SkillCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const
{
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+
p->write(ecol, "Your skill in ");
- p->write(bcol, s_info[m_skill_idx].name);
+ p->write(bcol, s_descriptors[m_skill_idx].name);
p->write(ecol, " is from ");
p->write(TERM_WHITE, format("%d", (int) m_min));
p->write(ecol, " to ");
@@ -781,14 +817,13 @@ void SkillCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t
p->write(TERM_WHITE, "\n");
}
-void SkillCondition::to_json(json_t *j) const
+void SkillCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "name",
- json_string(s_info[m_skill_idx].name));
- json_object_set_new(j, "min",
- json_integer(m_min));
- json_object_set_new(j, "max",
- json_integer(m_max));
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+
+ j["name"] = s_descriptors[m_skill_idx].name;
+ j["min"] = m_min;
+ j["max"] = m_max;
}
bool StateCondition::is_match(object_type *o_ptr) const
@@ -805,10 +840,11 @@ bool StateCondition::is_match(object_type *o_ptr) const
return false;
}
-std::shared_ptr<Condition> StateCondition::from_json(json_t *j)
+std::shared_ptr<Condition> StateCondition::from_json(jsoncons::json const &j)
{
- cptr s;
- if (json_unpack(j, "{s:s}", "state", &s) < 0)
+ cptr s = j.get("state").as<cptr>();
+
+ if (!s)
{
msg_print("Missing/invalid 'state' property");
return nullptr;
@@ -835,34 +871,28 @@ void StateCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t
p->write(TERM_WHITE, "\n");
}
-void StateCondition::to_json(json_t *j) const
+void StateCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "state",
- json_string(identification_state_mapping().
- stringify(m_state)));
+ j["state"] = identification_state_mapping().stringify(m_state);
}
bool SymbolCondition::is_match(object_type *o_ptr) const
{
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
- return k_ptr->d_char == m_symbol;
+ auto const &k_info = game->edit_data.k_info;
+
+ return k_info[o_ptr->k_idx].d_char == m_symbol;
}
-std::shared_ptr<Condition> SymbolCondition::from_json(json_t *j)
+std::shared_ptr<Condition> SymbolCondition::from_json(jsoncons::json const &j)
{
- cptr s_ = nullptr;
- if (json_unpack(j, "{s:s}", "symbol", &s_) < 0)
- {
- msg_print("Missing/invalid 'symbol' property");
- return nullptr;
- }
+ auto s = j.get("symbol").as<std::string>();
- std::string s(s_);
if (s.empty())
{
- msg_print("Invalid 'symbol' property: Too short");
+ msg_print("Missing/invalid 'symbol' property");
return nullptr;
}
+
if (s.size() > 1)
{
msg_print("Invalid 'symbol' property: Too long");
@@ -883,21 +913,21 @@ void SymbolCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t
p->write(TERM_WHITE, "\n");
}
-void SymbolCondition::to_json(json_t *j) const
+void SymbolCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "symbol",
- json_string(format("%c", m_symbol)));
+ j["symbol"] = format("%c", m_symbol);
}
bool AbilityCondition::is_match(object_type *) const
{
- return has_ability(m_ability_idx);
+ return p_ptr->has_ability(m_ability_idx);
}
-std::shared_ptr<Condition> AbilityCondition::from_json(json_t *j)
+std::shared_ptr<Condition> AbilityCondition::from_json(jsoncons::json const &j)
{
- cptr a;
- if (json_unpack(j, "{s:s}", "ability", &a) < 0)
+ cptr a = j.get("ability").as<cptr>();
+
+ if (!a)
{
msg_print("Missing/invalid 'ability' property");
return nullptr;
@@ -915,18 +945,19 @@ std::shared_ptr<Condition> AbilityCondition::from_json(json_t *j)
void AbilityCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const
{
- cptr ability_s = ab_info[m_ability_idx].name;
+ auto const &ab_info = game->edit_data.ab_info;
p->write(ecol, "You have the ");
- p->write(bcol, ability_s);
+ p->write(bcol, ab_info[m_ability_idx].name);
p->write(ecol, " ability");
p->write(TERM_WHITE, "\n");
}
-void AbilityCondition::to_json(json_t *j) const
+void AbilityCondition::to_json(jsoncons::json &j) const
{
- cptr ability_s = ab_info[m_ability_idx].name;
- json_object_set_new(j, "ability", json_string(ability_s));
+ auto const &ab_info = game->edit_data.ab_info;
+
+ j["ability"] = ab_info[m_ability_idx].name;
}
void SingleSubconditionCondition::add_child(std::function< std::shared_ptr<Condition> () > const &factory)
@@ -951,23 +982,20 @@ std::shared_ptr<Condition> SingleSubconditionCondition::first_child()
return m_subcondition;
}
-void SingleSubconditionCondition::to_json(json_t *j) const
+void SingleSubconditionCondition::to_json(jsoncons::json &j) const
{
- json_object_set_new(j, "condition",
- optional_to_json(m_subcondition));
+ j["condition"] = optional_to_json(m_subcondition);
}
-std::shared_ptr<Condition> SingleSubconditionCondition::parse_single_subcondition(json_t *in_json)
+std::shared_ptr<Condition> SingleSubconditionCondition::parse_single_subcondition(jsoncons::json const &in_json)
{
- json_t *condition_j =
- json_object_get(in_json, "condition");
+ auto condition_j = in_json.get("condition");
- if ((condition_j == nullptr) ||
- (json_is_null(condition_j)))
+ if (condition_j.is_null())
{
return nullptr;
}
- else if (!json_is_object(condition_j))
+ else if (!condition_j.is_object())
{
msg_format("Invalid 'condition' property");
return nullptr;
@@ -988,7 +1016,7 @@ bool NotCondition::is_match(object_type *o_ptr) const
return !m_subcondition->is_match(o_ptr);
}
-std::shared_ptr<Condition> NotCondition::from_json(json_t *j)
+std::shared_ptr<Condition> NotCondition::from_json(jsoncons::json const &j)
{
return std::make_shared<NotCondition>(parse_single_subcondition(j));
}
@@ -1021,7 +1049,7 @@ bool InventoryCondition::is_match(object_type *) const
return false;
}
-std::shared_ptr<Condition> InventoryCondition::from_json(json_t *j)
+std::shared_ptr<Condition> InventoryCondition::from_json(jsoncons::json const &j)
{
return std::make_shared<InventoryCondition>(
parse_single_subcondition(j));
@@ -1057,7 +1085,7 @@ bool EquipmentCondition::is_match(object_type *) const
return false;
}
-std::shared_ptr<Condition> EquipmentCondition::from_json(json_t *j)
+std::shared_ptr<Condition> EquipmentCondition::from_json(jsoncons::json const &j)
{
return std::make_shared<EquipmentCondition>(
parse_single_subcondition(j));
diff --git a/src/squelch/condition_metadata.cc b/src/squelch/condition_metadata.cc
index 62a90e58..f6d4370c 100644
--- a/src/squelch/condition_metadata.cc
+++ b/src/squelch/condition_metadata.cc
@@ -14,8 +14,8 @@ namespace squelch {
static std::shared_ptr<Condition> create_condition_name()
{
- cptr s = lua_input_box("Object name to match?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Object name to match?", 79);
+ if (s.empty())
{
return nullptr;
}
@@ -25,8 +25,8 @@ static std::shared_ptr<Condition> create_condition_name()
static std::shared_ptr<Condition> create_condition_contain()
{
- cptr s = lua_input_box("Word to find in object name?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Word to find in object name?", 79);
+ if (s.empty())
{
return nullptr;
}
@@ -36,8 +36,8 @@ static std::shared_ptr<Condition> create_condition_contain()
static std::shared_ptr<Condition> create_condition_inscribed()
{
- cptr s = lua_input_box("Word to find in object inscription?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Word to find in object inscription?", 79);
+ if (s.empty() == 0)
{
return nullptr;
}
@@ -50,16 +50,16 @@ static std::shared_ptr<Condition> create_condition_discount()
int min, max;
{
- cptr s = lua_input_box("Min discount?", 79);
- if (sscanf(s, "%d", &min) < 1)
+ auto s = input_box_auto("Min discount?", 79);
+ if (sscanf(s.c_str(), "%d", &min) < 1)
{
return nullptr;
}
}
{
- cptr s = lua_input_box("Max discount?", 79);
- if (sscanf(s, "%d", &max) < 1)
+ auto s = input_box_auto("Max discount?", 79);
+ if (sscanf(s.c_str(), "%d", &max) < 1)
{
return nullptr;
}
@@ -70,22 +70,20 @@ static std::shared_ptr<Condition> create_condition_discount()
static std::shared_ptr<Condition> create_condition_symbol()
{
- char c;
- cptr s = lua_input_box("Symbol to match?", 1);
- if (sscanf(s, "%c", &c) < 1)
+ auto s = input_box_auto("Symbol to match?", 1);
+ if (s.empty())
{
return nullptr;
}
- return std::make_shared<SymbolCondition>(c);
+ return std::make_shared<SymbolCondition>(s[0]);
}
static std::shared_ptr<Condition> create_condition_status()
{
status_type status;
- char c;
- c = lua_msg_box("[t]errible, [v]ery bad, [b]ad, "
+ auto c = msg_box_auto("[t]errible, [v]ery bad, [b]ad, "
"[a]verage, [G]ood, [V]ery good, [S]pecial?");
switch (c)
@@ -105,7 +103,7 @@ static std::shared_ptr<Condition> create_condition_status()
static std::shared_ptr<Condition> create_condition_state()
{
- char c = lua_msg_box("[i]dentified, [n]on identified?");
+ char c = msg_box_auto("[i]dentified, [n]on identified?");
identification_state s;
switch (c)
@@ -125,9 +123,9 @@ static bool in_byte_range(int x)
static std::shared_ptr<Condition> create_condition_tval()
{
- cptr s = lua_input_box("Tval to match?", 79);
+ auto s = input_box_auto("Tval to match?", 79);
int tval;
- if (sscanf(s, "%d", &tval) < 1)
+ if (sscanf(s.c_str(), "%d", &tval) < 1)
{
return nullptr;
}
@@ -145,8 +143,8 @@ static std::shared_ptr<Condition> create_condition_sval()
int sval_min, sval_max;
{
- cptr s = lua_input_box("Min sval?", 79);
- if ((sscanf(s, "%d", &sval_min) < 1) ||
+ auto s = input_box_auto("Min sval?", 79);
+ if ((sscanf(s.c_str(), "%d", &sval_min) < 1) ||
(!in_byte_range(sval_min)))
{
return nullptr;
@@ -154,8 +152,8 @@ static std::shared_ptr<Condition> create_condition_sval()
}
{
- cptr s = lua_input_box("Max sval?", 79);
- if ((sscanf(s, "%d", &sval_max) < 1) ||
+ auto s = input_box_auto("Max sval?", 79);
+ if ((sscanf(s.c_str(), "%d", &sval_max) < 1) ||
(!in_byte_range(sval_max)))
{
return nullptr;
@@ -167,8 +165,8 @@ static std::shared_ptr<Condition> create_condition_sval()
static std::shared_ptr<Condition> create_condition_race()
{
- cptr s = lua_input_box("Player race to match?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Player race to match?", 79);
+ if (s.empty())
{
return nullptr;
}
@@ -178,8 +176,8 @@ static std::shared_ptr<Condition> create_condition_race()
static std::shared_ptr<Condition> create_condition_subrace()
{
- cptr s = lua_input_box("Player subrace to match?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Player subrace to match?", 79);
+ if (s.empty())
{
return nullptr;
}
@@ -189,8 +187,8 @@ static std::shared_ptr<Condition> create_condition_subrace()
static std::shared_ptr<Condition> create_condition_class()
{
- cptr s = lua_input_box("Player class to match?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Player class to match?", 79);
+ if (s.empty())
{
return nullptr;
}
@@ -203,16 +201,16 @@ static std::shared_ptr<Condition> create_condition_level()
int min, max;
{
- cptr s = lua_input_box("Min player level?", 79);
- if (sscanf(s, "%d", &min) < 1)
+ auto s = input_box_auto("Min player level?", 79);
+ if (sscanf(s.c_str(), "%d", &min) < 1)
{
return nullptr;
}
}
{
- cptr s = lua_input_box("Max player level?", 79);
- if (sscanf(s, "%d", &max) < 1)
+ auto s = input_box_auto("Max player level?", 79);
+ if (sscanf(s.c_str(), "%d", &max) < 1)
{
return nullptr;
}
@@ -226,16 +224,16 @@ static std::shared_ptr<Condition> create_condition_skill()
int min, max;
{
- cptr s = lua_input_box("Min skill level?", 79);
- if (sscanf(s, "%d", &min) < 1)
+ auto s = input_box_auto("Min skill level?", 79);
+ if (sscanf(s.c_str(), "%d", &min) < 1)
{
return nullptr;
}
}
{
- cptr s = lua_input_box("Max skill level?", 79);
- if (sscanf(s, "%d", &max) < 1)
+ auto s = input_box_auto("Max skill level?", 79);
+ if (sscanf(s.c_str(), "%d", &max) < 1)
{
return nullptr;
}
@@ -243,13 +241,13 @@ static std::shared_ptr<Condition> create_condition_skill()
s16b skill_idx;
{
- cptr s = lua_input_box("Skill name?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Skill name?", 79);
+ if (s.empty() == 0)
{
return nullptr;
}
- skill_idx = find_skill_i(s);
+ skill_idx = find_skill_i(s.c_str());
if (skill_idx < 0)
{
return nullptr;
@@ -261,13 +259,13 @@ static std::shared_ptr<Condition> create_condition_skill()
static std::shared_ptr<Condition> create_condition_ability()
{
- cptr s = lua_input_box("Ability name?", 79);
- if (strlen(s) == 0)
+ auto s = input_box_auto("Ability name?", 79);
+ if (s.empty() == 0)
{
return nullptr;
}
- s16b ai = find_ability(s);
+ s16b ai = find_ability(s.c_str());
if (ai < 0)
{
return nullptr;
@@ -394,7 +392,7 @@ std::shared_ptr<Condition> new_condition_interactive()
match_type::INVENTORY,
match_type::EQUIPMENT
};
- static std::vector<const char *> condition_type_names;
+ static std::vector<std::string> condition_type_names;
// Fill in types names?
if (condition_type_names.empty())
@@ -414,7 +412,7 @@ std::shared_ptr<Condition> new_condition_interactive()
Term_clear();
Term_get_size(&wid, &hgt);
- display_list(0, 0, hgt - 1, 15, "Rule types", condition_type_names.data(), condition_types.size(), begin, sel, TERM_L_GREEN);
+ display_list(0, 0, hgt - 1, 15, "Rule types", condition_type_names, begin, sel, TERM_L_GREEN);
display_desc(condition_types[sel]);
diff --git a/src/squelch/rule.cc b/src/squelch/rule.cc
index 1c17d2fd..e35b3ce1 100644
--- a/src/squelch/rule.cc
+++ b/src/squelch/rule.cc
@@ -8,8 +8,8 @@
#include "../modules.hpp"
#include "../object1.hpp"
#include "../object2.hpp"
+#include "../object_flag.hpp"
#include "../object_type.hpp"
-#include "../quark.hpp"
#include "../tables.hpp"
#include "../util.hpp"
#include "../variable.hpp"
@@ -25,15 +25,14 @@ EnumStringMap<action_type> &action_mapping()
return *m;
}
-void Rule::set_name(const char *new_name)
+void Rule::set_name(std::string const &new_name)
{
- assert(new_name != nullptr);
m_name = new_name;
}
-const char *Rule::get_name() const
+std::string Rule::get_name() const
{
- return m_name.c_str();
+ return m_name;
}
std::shared_ptr<Condition> Rule::get_condition() const
@@ -41,22 +40,16 @@ std::shared_ptr<Condition> Rule::get_condition() const
return m_condition;
}
-json_t *Rule::to_json() const
+jsoncons::json Rule::to_json() const
{
- json_t *rule_json = json_object();
- json_object_set_new(rule_json,
- "name",
- json_string(m_name.c_str()));
- json_object_set_new(rule_json,
- "action",
- json_string(action_mapping().stringify(m_action)));
- json_object_set_new(rule_json,
- "module",
- json_string(modules[m_module_idx].meta.name));
- json_object_set_new(rule_json,
- "condition",
- Condition::optional_to_json(m_condition));
- return rule_json;
+ jsoncons::json j;
+
+ j["name"] = jsoncons::json::string_type(m_name);
+ j["action"] = action_mapping().stringify(m_action);
+ j["module"] = modules[m_module_idx].meta.name;
+ j["condition"] = Condition::optional_to_json(m_condition);
+
+ return j;
}
void Rule::add_new_condition(Cursor *cursor,
@@ -138,23 +131,19 @@ bool Rule::apply_rule(object_type *o_ptr, int item_idx) const
return false;
}
-std::shared_ptr<Rule> Rule::parse_rule(json_t *rule_json)
+std::shared_ptr<Rule> Rule::parse_rule(jsoncons::json const &rule_json)
{
- if (!json_is_object(rule_json))
+ if (!rule_json.is_object())
{
msg_print("Rule is not an object");
return nullptr;
}
// Retrieve the attributes
- char *rule_name_s = nullptr;
- char *rule_action_s = nullptr;
- char *rule_module_s = nullptr;
- if (json_unpack(rule_json,
- "{s:s,s:s,s:s}",
- "name", &rule_name_s,
- "action", &rule_action_s,
- "module", &rule_module_s) < 0)
+ char const *rule_name_s = rule_json.get("name").as<char const *>();
+ char const *rule_action_s = rule_json.get("action").as<char const *>();
+ char const *rule_module_s = rule_json.get("module").as<char const *>();
+ if ((!rule_name_s) || (!rule_action_s) || (!rule_module_s))
{
msg_print("Rule missing required field(s)");
return nullptr;
@@ -178,28 +167,29 @@ std::shared_ptr<Rule> Rule::parse_rule(json_t *rule_json)
// Parse condition
std::shared_ptr<Condition> condition =
- Condition::parse_condition(json_object_get(rule_json, "condition"));
+ Condition::parse_condition(rule_json.get("condition"));
// Parse rule
switch (action)
{
case action_type::AUTO_INSCRIBE:
{
- json_t *rule_inscription_j = json_object_get(rule_json, "inscription");
+ auto rule_inscription_j = rule_json.get("inscription");
- if (rule_inscription_j == nullptr)
+ if (rule_inscription_j.is_null())
{
msg_print("Inscription rule missing 'inscription' attribute");
return nullptr;
}
- if (!json_is_string(rule_inscription_j))
+
+ if (!rule_inscription_j.is_string())
{
msg_print("Inscription rule 'inscription' attribute wrong type");
return nullptr;
}
- std::string inscription =
- json_string_value(rule_inscription_j);
+ std::string inscription = rule_inscription_j.as<std::string>();
+
return std::make_shared<InscribeRule>(
rule_name_s, module_idx, condition, inscription);
}
@@ -237,7 +227,7 @@ bool DestroyRule::do_apply_rule(object_type *o_ptr, int item_idx) const
}
// Never destroy inscribed items
- if (o_ptr->note)
+ if (!o_ptr->inscription.empty())
{
return false;
}
@@ -250,10 +240,8 @@ bool DestroyRule::do_apply_rule(object_type *o_ptr, int item_idx) const
// Cannot destroy CURSE_NO_DROP objects.
{
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- if ((f4 & TR4_CURSE_NO_DROP) != 0)
+ auto const f = object_flags(o_ptr);
+ if (f & TR_CURSE_NO_DROP)
{
return false;
}
@@ -292,14 +280,10 @@ bool PickUpRule::do_apply_rule(object_type *o_ptr, int item_idx) const
return true;
}
-json_t *InscribeRule::to_json() const
+jsoncons::json InscribeRule::to_json() const
{
- json_t *j = Rule::to_json();
-
- json_object_set_new(j,
- "inscription",
- json_string(m_inscription.c_str()));
-
+ jsoncons::json j;
+ j["inscription"] = m_inscription;
return j;
}
@@ -318,14 +302,14 @@ void InscribeRule::do_write_tree(TreePrinter *p) const
bool InscribeRule::do_apply_rule(object_type *o_ptr, int) const
{
// Already inscribed?
- if (o_ptr->note != 0)
+ if (!o_ptr->inscription.empty())
{
return false;
}
// Inscribe
msg_format("<Auto-Inscribe {%s}>", m_inscription.c_str());
- o_ptr->note = quark_add(m_inscription.c_str());
+ o_ptr->inscription = m_inscription;
return true;
}
diff --git a/src/squelch/tree_printer.cc b/src/squelch/tree_printer.cc
index 2be098dc..0dbceec9 100644
--- a/src/squelch/tree_printer.cc
+++ b/src/squelch/tree_printer.cc
@@ -86,4 +86,9 @@ void TreePrinter::write(uint8_t color, cptr line)
}
}
+void TreePrinter::write(uint8_t color, std::string const &line)
+{
+ write(color, line.c_str());
+}
+
} // namespace
diff --git a/src/squeltch.cc b/src/squeltch.cc
index bab1e5c0..1db8ff74 100644
--- a/src/squeltch.cc
+++ b/src/squeltch.cc
@@ -11,6 +11,7 @@
#include "cave_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "loadsave.hpp"
#include "lua_bind.hpp"
#include "object1.hpp"
@@ -30,11 +31,11 @@
#include "variable.h"
#include "variable.hpp"
-#include <jansson.h>
#include <algorithm>
-#include <memory>
#include <deque>
+#include <fmt/format.h>
#include <list>
+#include <memory>
#include <string>
#include <vector>
@@ -57,8 +58,10 @@ using squelch::StatusCondition;
static squelch::Automatizer *automatizer = nullptr;
-void squeltch_grid(void)
+void squeltch_grid()
{
+ auto const &k_info = game->edit_data.k_info;
+
if (!automatizer_enabled)
{
return;
@@ -84,7 +87,7 @@ void squeltch_grid(void)
}
}
-void squeltch_inventory(void)
+void squeltch_inventory()
{
if (!automatizer_enabled)
{
@@ -118,18 +121,14 @@ void squeltch_inventory(void)
static int create_new_rule()
{
- char name[20] = { '\0' };
- int wid = 0, hgt = 0;
-
- Term_get_size(&wid, &hgt);
+ std::string name = "No name";
- sprintf(name, "%s", "No name");
- if (!input_box("Name?", hgt / 2, wid / 2, name, sizeof(name)))
+ if (!input_box_auto("Name?", &name, 20))
{
return -1;
}
- char typ = lua_msg_box("[D]estroy, [P]ickup, [I]nscribe?");
+ char typ = msg_box_auto("[D]estroy, [P]ickup, [I]nscribe?");
std::shared_ptr<Rule> rule;
switch (typ)
@@ -147,15 +146,13 @@ static int create_new_rule()
case 'i':
case 'I':
{
- cptr i = lua_input_box("Inscription?", 79);
- if ((i == nullptr) || (strlen(i) == 0))
+ auto s = input_box_auto("Inscription?", 79);
+ if (s.empty())
{
return -1;
}
- rule = std::make_shared<InscribeRule>(
- name, game_module_idx, nullptr, std::string(i));
-
+ rule = std::make_shared<InscribeRule>(name, game_module_idx, nullptr, s);
break;
}
@@ -168,28 +165,41 @@ static int create_new_rule()
static void automatizer_save_rules()
{
- char name[30] = { '\0' };
char buf[1025];
char ch;
int hgt, wid;
Term_get_size(&wid, &hgt);
- sprintf(name, "%s.atm", player_name);
+ std::string name = fmt::format("{}.atm", game->player_name);
- if (!input_box("Save name?", hgt / 2, wid / 2, name, sizeof(name)))
+ if (!input_box_auto("Save name?", &name, 30))
{
return;
}
+ // Function for showing a message
+ auto show_message = [hgt, wid](std::string text) {
+ auto n = std::max<std::size_t>(text.size(), 28);
+ while (text.size() < n)
+ {
+ text += ' ';
+ }
+ c_put_str(TERM_WHITE, text.c_str(), hgt/2, wid/2 - 14);
+ };
+
+ // Function for showing an error message
+ auto error = [show_message]() {
+ show_message("Saving rules FAILED!");
+ inkey();
+ };
+
// Build the filename
- path_build(buf, 1024, ANGBAND_DIR_USER, name);
+ path_build(buf, 1024, ANGBAND_DIR_USER, name.c_str());
- if (file_exist(buf))
+ if (boost::filesystem::exists(buf))
{
- c_put_str(TERM_WHITE, "File exists, continue?[y/n]",
- hgt / 2,
- wid / 2 - 14);
+ show_message("File exists, continue? [y/n]");
ch = inkey();
if ((ch != 'Y') && (ch != 'y'))
{
@@ -197,44 +207,42 @@ static void automatizer_save_rules()
}
}
- // Write to file
- {
- auto rules_json = automatizer->to_json();
+ // Pretty-printing options
+ jsoncons::output_format format;
+ format.indent(2);
- int status = json_dump_file(rules_json.get(), buf,
- JSON_INDENT(2) |
- JSON_SORT_KEYS);
- if (status == 0)
- {
- c_put_str(TERM_WHITE, "Saved rules in file ",
- hgt / 2,
- wid / 2 - 14);
- }
- else
- {
- c_put_str(TERM_WHITE, "Saving rules failed! ",
- hgt / 2,
- wid / 2 - 14);
- }
+ // Convert to a JSON document
+ auto rules_document = automatizer->to_json();
- // Wait for keypress
- inkey();
+ // Open output stream
+ std::ofstream of(buf, std::ios_base::out | std::ios_base::binary);
+ if (of.fail())
+ {
+ error();
+ return;
+ }
+
+ // Write JSON to output
+ of << jsoncons::pretty_print(rules_document, format);
+ if (of.fail())
+ {
+ error();
+ return;
}
+
+ // Success
+ show_message("Saved rules in file");
+ inkey();
}
static void rename_rule(Rule *rule)
{
- char name[16];
- int wid, hgt;
-
assert(rule != nullptr);
- Term_get_size(&wid, &hgt);
-
- sprintf(name, "%s", rule->get_name());
- if (input_box("New name?", hgt / 2, wid / 2, name, sizeof(name)))
+ std::string name = rule->get_name();
+ if (input_box_auto("New name?", &name, 16))
{
- rule->set_name(name);
+ rule->set_name(name.c_str());
}
}
@@ -242,18 +250,15 @@ static void rename_rule(Rule *rule)
#define ACTIVE_RULE 1
void do_cmd_automatizer()
{
- int wid = 0, hgt = 0;
int active = ACTIVE_LIST;
cptr keys;
cptr keys2;
cptr keys3;
std::vector<cptr> rule_names;
- Term_get_size(&wid, &hgt);
-
if (!automatizer_enabled)
{
- if (msg_box("Automatizer is currently disabled, enable it? (y/n)", hgt / 2, wid / 2) == 'y')
+ if (msg_box_auto("Automatizer is currently disabled, enable it? (y/n)") == 'y')
{
automatizer_enabled = TRUE;
}
@@ -268,11 +273,13 @@ void do_cmd_automatizer()
while (1)
{
Term_clear();
+
+ int wid, hgt;
Term_get_size(&wid, &hgt);
- automatizer->get_rule_names(&rule_names);
+ auto rule_names = automatizer->get_rule_names();
- display_list(0, 0, hgt - 1, 15, "Rules", rule_names.data(), automatizer->rules_count(), automatizer->rules_begin(), automatizer->selected_rule(), (active == ACTIVE_LIST) ? TERM_L_GREEN : TERM_GREEN);
+ display_list(0, 0, hgt - 1, 15, "Rules", rule_names, automatizer->rules_begin(), automatizer->selected_rule(), (active == ACTIVE_LIST) ? TERM_L_GREEN : TERM_GREEN);
draw_box(0, 15, hgt - 4, wid - 1 - 15);
if (active == ACTIVE_RULE)
@@ -301,7 +308,7 @@ void do_cmd_automatizer()
if (c == '?')
{
screen_save();
- show_file("automat.txt", "Automatizer help", 0, 0);
+ show_file("automat.txt", "Automatizer help");
screen_load();
}
else if (c == '8')
@@ -375,7 +382,7 @@ void do_cmd_automatizer()
if (c == '?')
{
screen_save();
- show_file("automat.txt", "Automatizer help", 0, 0);
+ show_file("automat.txt", "Automatizer help");
screen_load();
}
else if (c == '8')
@@ -574,20 +581,21 @@ bool automatizer_load(boost::filesystem::path const &path)
return false; // Not fatal; just skip
}
- // Parse file
- json_error_t error;
- std::shared_ptr<json_t> rules_json(
- json_load_file(path.c_str(), 0, &error),
- &json_decref);
- if (rules_json == nullptr)
+ // Parse into memory
+ jsoncons::json rules_json;
+ try
+ {
+ rules_json = jsoncons::json::parse_file(path.string());
+ }
+ catch (jsoncons::json_exception const &exc)
{
msg_format("Error parsing automatizer rules from '%s'.", path.c_str());
- msg_format("Line %d, Column %d", error.line, error.column);
- msg_print(nullptr);
+ msg_print(exc.what());
return false;
}
- // Load rules
- automatizer->load_json(rules_json.get());
+ // We didn't return directly via an exception, so let's extract
+ // the rules.
+ automatizer->load_json(rules_json);
return true;
}
diff --git a/src/squeltch.hpp b/src/squeltch.hpp
index 65ddfb51..c4525e7d 100644
--- a/src/squeltch.hpp
+++ b/src/squeltch.hpp
@@ -4,10 +4,10 @@
#include "object_type_fwd.hpp"
#include <boost/filesystem.hpp>
-extern void squeltch_inventory(void);
-extern void squeltch_grid(void);
-extern void do_cmd_automatizer(void);
-extern void automatizer_add_rule(object_type *o_ptr);
+void squeltch_inventory();
+void squeltch_grid();
+void do_cmd_automatizer();
+void automatizer_add_rule(object_type *o_ptr);
extern bool_ automatizer_create;
-extern void automatizer_init();
-extern bool automatizer_load(boost::filesystem::path const &path);
+void automatizer_init();
+bool automatizer_load(boost::filesystem::path const &path);
diff --git a/src/status.cc b/src/status.cc
deleted file mode 100644
index 0a3977c7..00000000
--- a/src/status.cc
+++ /dev/null
@@ -1,783 +0,0 @@
-/* File status.c */
-
-/* Purpose: Status information */
-
-/* Written by Pat Gunn <qc@apk.net> for ToME
- * This file is released into the public domain
- */
-
-/* Throughout this file, I make use of 2-d arrays called flag_arr.
- * I fill them out with esp as the 0th element because then the second
- * index is equal to the f-number that they are in the attributes, and
- * that makes it more intuitive to use. I do need to fill them out in an
- * odd order, but that's all abstracted nicely away. The 6th element is used
- * to mark if the rest of the array is filled, that is, if there's an object
- * there.
- */
-
-#include "files.hpp"
-#include "monster2.hpp"
-#include "monster_type.hpp"
-#include "object1.hpp"
-#include "player_type.hpp"
-#include "stats.hpp"
-#include "util.hpp"
-#include "util.h"
-#include "variable.h"
-#include "variable.hpp"
-#include "xtra1.hpp"
-
-static void row_trival(const char*, s16b, u32b, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]);
-static void row_bival(const char*, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]);
-static void row_npval(const char*, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]);
-static void statline(const char*, int, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]);
-static void row_hd_bon(int, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]);
-static void row_count(const char*, s16b, u32b, int, s16b, u32b, int, s16b, u32b, int, s16b, u32b, int, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]);
-static int row_x_start = 0;
-
-static void status_count(s32b val1, int v1, s32b val2, int v2, s32b val3, int v3, s32b val4, int v4, byte ypos, byte xpos);
-static void status_trival(s32b, s32b, byte, byte);
-static void status_bival(s32b, byte, byte);
-static void status_numeric(s32b, byte, byte);
-static void status_curses(void);
-static void status_companion(void);
-static void status_sight(void);
-static void status_attr(void);
-static void status_combat(void);
-static void status_move(void);
-static void status_item(void);
-static void az_line(int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]);
-
-#define STATNM_LENGTH 11
-#define SL_LENGTH 11
-
-#define INVEN_PLAYER (INVEN_TOTAL - INVEN_WIELD + 1)
-
-static void status_attr(void)
-{
- u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7];
- int yo = 0;
- char c;
-
- clear_from(0);
- c_put_str(TERM_L_BLUE, "Statistics", yo++, 1);
- yo += 2;
- az_line(SL_LENGTH, flag_arr);
- statline("Str", A_STR, TR1_STR, yo++, flag_arr);
- statline("Int", A_INT, TR1_INT, yo++, flag_arr);
- statline("Wis", A_INT, TR1_WIS, yo++, flag_arr);
- statline("Con", A_CON, TR1_CON, yo++, flag_arr);
- statline("Dex", A_DEX, TR1_DEX, yo++, flag_arr);
- statline("Chr", A_CHR, TR1_CHR, yo++, flag_arr);
- row_npval("Luck", 5, TR5_LUCK, yo++, flag_arr);
- yo++;
- row_npval("Life", 2, TR2_LIFE, yo++, flag_arr);
- row_npval("Mana", 1, TR1_MANA, yo++, flag_arr);
-
-
- c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0);
- Term_fresh();
- while (1)
- {
- c = inkey();
- if (c == ESCAPE) break;
- }
-}
-
-void status_move(void)
-{
- u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7];
- int yo = 3;
- clear_from(0);
- c_put_str(TERM_L_BLUE, "Movement", 0, 1);
- az_line(STATNM_LENGTH, flag_arr);
-
- row_trival("Fly/Lev", 4, TR4_FLY, 3, TR3_FEATHER, yo++, flag_arr);
- row_bival("Climb", 4, TR4_CLIMB, yo++, flag_arr);
- row_npval("Dig", 1, TR1_TUNNEL, yo++, flag_arr);
- row_npval("Speed", 1, TR1_SPEED, yo++, flag_arr);
- row_bival("Wraith", 3, TR3_WRAITH, yo++, flag_arr);
- yo++;
- row_npval("Stealth", 1, TR1_STEALTH, yo++, flag_arr);
- row_bival("Telep", 3, TR3_TELEPORT, yo++, flag_arr);
-
- c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0);
- Term_fresh();
- while (1)
- {
- bool_ loop_exit = FALSE;
- char c;
- c = inkey();
- switch (c)
- {
- case ESCAPE:
- {
- loop_exit = TRUE;
- }
- }
- if (loop_exit)
- {
- break;
- }
- }
-}
-
-static void status_sight(void)
-/* Tell player about ESP, infravision, auto-id, see invis, and similar */
-{
- u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7];
- int yo = 3;
- clear_from(0);
- c_put_str(TERM_L_BLUE, "Sight", 0, 1);
- az_line(STATNM_LENGTH, flag_arr);
-
- row_bival("SeeInvis", 3, TR3_SEE_INVIS, yo++, flag_arr);
- row_npval("Invis", 2, TR2_INVIS, yo++, flag_arr);
- row_npval("Infra", 1, TR1_INFRA, yo++, flag_arr);
- row_npval("Search", 1, TR1_SEARCH, yo++, flag_arr);
- row_bival("AutoID", 4, TR4_AUTO_ID, yo++, flag_arr);
- row_count("Light", 3, TR3_LITE1, 1, 4, TR4_LITE2, 2, 4, TR4_LITE3, 3, 0, 0, 0, yo++, flag_arr);
- row_bival("Full ESP", 0, ESP_ALL, yo++, flag_arr);
- row_bival("Orc ESP", 0, ESP_ORC, yo++, flag_arr);
- row_bival("Trol ESP", 0, ESP_TROLL, yo++, flag_arr);
- row_bival("Drag ESP", 0, ESP_DRAGON, yo++, flag_arr);
- row_bival("GiantESP", 0, ESP_GIANT, yo++, flag_arr);
- row_bival("DemonESP", 0, ESP_DEMON, yo++, flag_arr);
- row_bival("Undd ESP", 0, ESP_UNDEAD, yo++, flag_arr);
- row_bival("Evil ESP", 0, ESP_EVIL, yo++, flag_arr);
- row_bival("Anim ESP", 0, ESP_ANIMAL, yo++, flag_arr);
- row_bival("Drid ESP", 0, ESP_THUNDERLORD, yo++, flag_arr);
- row_bival("Good ESP", 0, ESP_GOOD, yo++, flag_arr);
- row_bival("SpidrESP", 0, ESP_SPIDER, yo++, flag_arr);
- row_bival("NonlvESP", 0, ESP_NONLIVING, yo++, flag_arr);
- row_bival("Uniq ESP", 0, ESP_UNIQUE, yo++, flag_arr);
-
- c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0);
- Term_fresh();
- while (1)
- {
- bool_ loop_exit = FALSE;
- char c;
- c = inkey();
- switch (c)
- {
- case ESCAPE:
- {
- loop_exit = TRUE;
- }
- }
- if (loop_exit)
- {
- break;
- }
- }
-}
-
-static void status_item(void)
-{
- u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7];
- int yo = 3;
- clear_from(0);
- c_put_str(TERM_L_BLUE, "Misc", 0, 1);
-
- row_x_start = 40;
- az_line(STATNM_LENGTH + row_x_start, flag_arr);
- row_bival("Blessed", 3, TR3_BLESSED, yo++, flag_arr);
- row_bival("Activate", 3, TR3_ACTIVATE, yo++, flag_arr);
- row_bival("EasyKnow", 3, TR3_EASY_KNOW, yo++, flag_arr);
- row_bival("HideType", 3, TR3_HIDE_TYPE, yo++, flag_arr);
- yo++;
- row_bival("SafeAcid", 3, TR3_IGNORE_ACID, yo++, flag_arr);
- row_bival("SafeElec", 3, TR3_IGNORE_ELEC, yo++, flag_arr);
- row_bival("SafeFire", 3, TR3_IGNORE_FIRE, yo++, flag_arr);
- row_bival("SafeCold", 3, TR3_IGNORE_COLD, yo++, flag_arr);
- row_bival("ResMorgul", 5, TR5_RES_MORGUL, yo++, flag_arr);
-
- yo = 3;
- row_x_start = 0;
- az_line(STATNM_LENGTH, flag_arr);
- row_bival("Sh.fire", 3, TR3_SH_FIRE, yo++, flag_arr);
- row_bival("Sh.elec", 3, TR3_SH_ELEC, yo++, flag_arr);
- row_bival("Regen", 3, TR3_REGEN, yo++, flag_arr);
- row_bival("SlowDigest", 3, TR3_SLOW_DIGEST, yo++, flag_arr);
- row_bival("Precog", 4, TR4_PRECOGNITION, yo++, flag_arr);
- row_bival("Auto.Id", 4, TR4_AUTO_ID, yo++, flag_arr);
- row_bival("Spell.In", 5, TR5_SPELL_CONTAIN, yo++, flag_arr);
-
- c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0);
- Term_fresh();
- while (1)
- {
- bool_ loop_exit = FALSE;
- char c;
- c = inkey();
- switch (c)
- {
- case ESCAPE:
- loop_exit = TRUE;
- }
- if (loop_exit)
- {
- break;
- }
- }
-}
-
-static void status_combat(void)
-{
- u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7];
- int yo = 3;
- clear_from(0);
- c_put_str(TERM_L_BLUE, "Combat", 0, 1);
- az_line(STATNM_LENGTH, flag_arr);
-
- row_npval("Spell", 1, TR1_SPELL, yo++, flag_arr);
- row_npval("Blows", 1, TR1_BLOWS, yo++, flag_arr);
- row_npval("Crits", 5, TR5_CRIT, yo++, flag_arr);
- row_npval("Ammo_Mgt", 3, TR3_XTRA_MIGHT, yo++, flag_arr);
- row_npval("Ammo_Sht", 3, TR3_XTRA_SHOTS, yo++, flag_arr);
- row_bival("Vorpal", 1, TR1_VORPAL, yo++, flag_arr);
- row_bival("Quake", 1, TR1_IMPACT, yo++, flag_arr);
- row_bival("Chaotic", 1, TR1_CHAOTIC, yo++, flag_arr);
- row_bival("Vampiric", 1, TR1_VAMPIRIC, yo++, flag_arr);
- row_bival("Poison", 1, TR1_BRAND_POIS, yo++, flag_arr);
- row_bival("Acidic", 1, TR1_BRAND_ACID, yo++, flag_arr);
- row_bival("Shocks", 1, TR1_BRAND_ELEC, yo++, flag_arr);
- row_bival("Burns", 1, TR1_BRAND_FIRE, yo++, flag_arr);
- row_bival("Chills", 1, TR1_BRAND_COLD, yo++, flag_arr);
- row_bival("Wound", 5, TR5_WOUNDING, yo++, flag_arr);
-
- row_x_start = 40;
- yo = 3;
- az_line(row_x_start + STATNM_LENGTH, flag_arr);
- row_bival("No.Blow", 4, TR4_NEVER_BLOW, yo++, flag_arr);
- row_trival("S/K Undd", 1, TR1_SLAY_UNDEAD, 5, TR5_KILL_UNDEAD, yo++, flag_arr);
- row_trival("S/K Dmn", 1, TR1_SLAY_DEMON, 5, TR5_KILL_DEMON, yo++, flag_arr);
- row_trival("S/K Drag", 1, TR1_SLAY_DRAGON, 1, TR1_KILL_DRAGON, yo++, flag_arr);
- row_bival("Sl.Orc", 1, TR1_SLAY_ORC, yo++, flag_arr);
- row_bival("Sl.Troll", 1, TR1_SLAY_TROLL, yo++, flag_arr);
- row_bival("Sl.Giant", 1, TR1_SLAY_GIANT, yo++, flag_arr);
- row_bival("Sl.Evil", 1, TR1_SLAY_EVIL, yo++, flag_arr);
- row_bival("Sl.Animal", 1, TR1_SLAY_ANIMAL, yo++, flag_arr);
- row_hd_bon(0, yo++, flag_arr);
- row_hd_bon(1, yo++, flag_arr);
- row_x_start = 0;
-
- c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0);
- Term_fresh();
- while (1)
- {
- bool_ loop_exit = FALSE;
- char c;
- c = inkey();
- switch (c)
- {
- case ESCAPE:
- loop_exit = TRUE;
- }
- if (loop_exit)
- {
- break;
- }
- }
-}
-
-static void status_curses(void)
-{
- u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7];
- int yo = 3;
-
- clear_from(0);
- c_put_str(TERM_L_BLUE, "Curses", 0, 1);
- az_line(STATNM_LENGTH, flag_arr);
-
- row_trival("Hvy/Nrm", 3, TR3_HEAVY_CURSE, 3, TR3_CURSED, yo++, flag_arr);
- row_bival("Perma", 3, TR3_PERMA_CURSE, yo++, flag_arr);
- row_trival("DG/Ty", 4, TR4_DG_CURSE, 3, TR3_TY_CURSE, yo++, flag_arr);
- row_trival("Prm/Auto", 3, TR3_PERMA_CURSE, 3, TR3_AUTO_CURSE, yo++, flag_arr);
- row_bival("NoDrop", 4, TR4_CURSE_NO_DROP, yo++, flag_arr);
- yo++;
- row_bival("B.Breath", 4, TR4_BLACK_BREATH, yo++, flag_arr);
- row_bival("Dr.Exp", 3, TR3_DRAIN_EXP, yo++, flag_arr);
- row_bival("Dr.Mana", 5, TR5_DRAIN_MANA, yo++, flag_arr);
- row_bival("Dr.HP", 5, TR5_DRAIN_HP, yo++, flag_arr);
- row_bival("No Hit", 4, TR4_NEVER_BLOW, yo++, flag_arr);
- row_bival("NoTelep", 3, TR3_NO_TELE, yo++, flag_arr);
- row_bival("NoMagic", 3, TR3_NO_MAGIC, yo++, flag_arr);
- row_bival("Aggrav", 3, TR3_AGGRAVATE, yo++, flag_arr);
- row_bival("Clone", 4, TR4_CLONE, yo++, flag_arr);
- row_bival("Temp", 5, TR5_TEMPORARY, yo++, flag_arr);
- yo++;
- row_bival("Antimagic", 4, TR4_ANTIMAGIC_50, yo++, flag_arr);
-
- c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0);
- Term_fresh();
- while (1)
- {
- bool_ loop_exit = FALSE;
- char c;
-
- c = inkey();
- switch (c)
- {
- case ESCAPE:
- {
- loop_exit = TRUE;
- }
- }
- if (loop_exit == TRUE)
- {
- break;
- }
- }
-}
-
-static void status_res(void)
-{
- u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7];
- int yo = 3;
-
- clear_from(0);
- c_put_str(TERM_L_BLUE, "Resistances", 0, 1);
- az_line(STATNM_LENGTH, flag_arr);
-
- row_trival("Fire", 2, TR2_IM_FIRE, 2, TR2_RES_FIRE, yo++, flag_arr);
- row_trival("Cold", 2, TR2_IM_COLD, 2, TR2_RES_COLD, yo++, flag_arr);
- row_trival("Acid", 2, TR2_IM_ACID, 2, TR2_RES_ACID, yo++, flag_arr);
- row_trival("Lightning", 2, TR2_IM_ELEC, 2, TR2_RES_ELEC, yo++, flag_arr);
- row_bival("Poison", 2, TR2_RES_POIS, yo++, flag_arr);
- row_bival("Lite", 2, TR2_RES_LITE, yo++, flag_arr);
- row_bival("Dark", 2, TR2_RES_DARK, yo++, flag_arr);
- row_bival("Sound", 2, TR2_RES_SOUND, yo++, flag_arr);
- row_bival("Shards", 2, TR2_RES_SHARDS, yo++, flag_arr);
- row_trival("Nether", 4, TR4_IM_NETHER, 2, TR2_RES_NETHER, yo++, flag_arr);
- row_bival("Nexus", 2, TR2_RES_NEXUS, yo++, flag_arr);
- row_bival("Chaos", 2, TR2_RES_CHAOS, yo++, flag_arr);
- row_bival("Disen.", 2, TR2_RES_DISEN, yo++, flag_arr);
- row_bival("Confusion", 2, TR2_RES_CONF, yo++, flag_arr);
- row_bival("Blindness", 2, TR2_RES_BLIND, yo++, flag_arr);
- row_bival("Fear", 2, TR2_RES_FEAR, yo++, flag_arr);
- row_bival("Free Act", 2, TR2_FREE_ACT, yo++, flag_arr);
- row_bival("Reflect", 2, TR2_REFLECT, yo++, flag_arr);
- row_bival("Hold Life", 2, TR2_HOLD_LIFE, yo++, flag_arr);
-
- c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0);
- Term_fresh();
- while (1)
- {
- bool_ loop_exit = FALSE;
- char c;
-
- c = inkey();
- switch (c)
- {
- case ESCAPE:
- {
- loop_exit = TRUE;
- }
- }
- if (loop_exit == TRUE)
- {
- break;
- }
- }
-}
-
-void status_main()
-{
- int do_quit = 0;
- char c;
-
- character_icky = TRUE;
- Term_save();
- while (1)
- {
- clear_from(0);
- c_put_str(TERM_WHITE, format("%s Character Status screen", game_module), 0, 10);
- c_put_str(TERM_WHITE, "1) Statistics", 2, 5);
- c_put_str(TERM_WHITE, "2) Movement", 3, 5);
- c_put_str(TERM_WHITE, "3) Combat", 4, 5);
- c_put_str(TERM_WHITE, "4) Resistances", 5, 5);
- c_put_str(TERM_WHITE, "5) Misc", 6, 5);
- c_put_str(TERM_WHITE, "6) Curses", 7, 5);
- c_put_str(TERM_WHITE, "7) Sight", 8, 5);
- c_put_str(TERM_WHITE, "8) Companions", 9, 5);
- c_put_str(TERM_RED, "Press 'q' to Quit", 23, 5);
- c = inkey();
- switch (c)
- {
- case '1':
- status_attr();
- break;
- case '2':
- status_move();
- break;
- case '3':
- status_combat();
- break;
- case '4':
- status_res();
- break;
- case '5':
- status_item();
- break;
- case '6':
- status_curses();
- break;
- case '7':
- status_sight();
- break;
- case '8':
- status_companion();
- break;
- case 'q':
- case ESCAPE:
- do_quit = 1; /* Schedule leaving the outer loop */
- break;
- }
- Term_fresh();
- if (do_quit) break;
- }
- Term_load();
- character_icky = FALSE;
- p_ptr->redraw |= (PR_WIPE | PR_FRAME | PR_MAP);
- handle_stuff();
-}
-
-static void az_line(int xo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7])
-{
- int index = xo; /* Leave room for description */
- int i;
- for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
- {
- if (p_ptr->inventory[i].k_idx) /* Wearing anything here? */
- {
- char cstrng[2];
- cstrng[0] = (i - INVEN_WIELD) + 'a'; /* Assumes ASCII */
- cstrng[1] = '\0'; /* terminate it */
- c_put_str(TERM_WHITE, cstrng, 2, index++); /* Assumes ASCII */
-
- /* DGDGDGDG */
- /* object_flags_known(&inventory[i],*/
- object_flags(&p_ptr->inventory[i], /* Help me debug */
- &flag_arr[i - INVEN_WIELD][1], /* f1 */
- &flag_arr[i - INVEN_WIELD][2], /* f2 */
- &flag_arr[i - INVEN_WIELD][3], /* f3 */
- &flag_arr[i - INVEN_WIELD][4], /* f4 */
- &flag_arr[i - INVEN_WIELD][5], /* f5 */
- &flag_arr[i - INVEN_WIELD][0]); /* esp */
- flag_arr[i - INVEN_WIELD][6] = 1; /* And mark it to display */
- }
- else flag_arr[i - INVEN_WIELD][6] = 0; /* Otherwise don't display it */
- }
- c_put_str(TERM_WHITE, "@", 2, index++);
- player_flags(
- &flag_arr[INVEN_PLAYER][1], /* f1 */
- &flag_arr[INVEN_PLAYER][2], /* f2 */
- &flag_arr[INVEN_PLAYER][3], /* f3 */
- &flag_arr[INVEN_PLAYER][4], /* f4 */
- &flag_arr[INVEN_PLAYER][5], /* f5 */
- &flag_arr[INVEN_PLAYER][0] /* esp */
- );
- flag_arr[INVEN_PLAYER][6] = 1;
-}
-
-static void status_trival(s32b val1, s32b val2, byte ypos, byte xpos)
-{
- if (val1 != 0)
- c_put_str(TERM_L_BLUE, "*", ypos, xpos);
- else if (val2 != 0)
- c_put_str(TERM_L_BLUE, "+", ypos, xpos);
- else
- c_put_str(TERM_WHITE, ".", ypos, xpos);
-}
-
-static void status_bival(s32b val, byte ypos, byte xpos)
-{
- if (val != 0)
- c_put_str(TERM_L_BLUE, "+", ypos, xpos);
- else
- c_put_str(TERM_WHITE, ".", ypos, xpos);
-}
-
-static void status_numeric(s32b val, byte ypos, byte xpos)
-{
- u32b magnitude = ABS(val);
- int color = TERM_WHITE; /* default */
- char strnum[2];
-
- if (val<0) {
- color = TERM_RED;
- };
- if (val>0) {
- color = TERM_GREEN;
- };
-
- if (magnitude == 0) {
- sprintf(strnum, ".");
- } if (magnitude > 9) {
- sprintf(strnum, "*");
- } else {
- sprintf(strnum, "%lu", (unsigned long int) magnitude);
- }
-
- c_put_str(color, strnum, ypos, xpos);
-}
-
-static void status_count(s32b val1, int v1, s32b val2, int v2, s32b val3, int v3, s32b val4, int v4, byte ypos, byte xpos)
-{
- int v = 0;
-
- if (val1 != 0) v += v1;
- if (val2 != 0) v += v2;
- if (val3 != 0) v += v3;
- if (val4 != 0) v += v4;
-
- status_numeric(v, ypos, xpos);
-}
-
-static void row_count(const char* statname, s16b row1, u32b flag1, int v1, s16b row2, u32b flag2, int v2, s16b row3, u32b flag3, int v3, s16b row4, u32b flag4, int v4, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7])
-{
- int i;
- int x = row_x_start;
-
- c_put_str(TERM_L_GREEN, statname, yo, row_x_start);
-
- for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++)
- {
- if (flag_arr[i][6] == 1)
- {
- status_count((flag_arr[i][row1] & flag1), v1, (flag_arr[i][row2] & flag2), v2, (flag_arr[i][row3] & flag3), v3, (flag_arr[i][row4] & flag4), v4, yo, x + STATNM_LENGTH);
- x++;
- }
- }
-}
-
-static void row_trival(const char* statname, s16b row, u32b flag, s16b row2, u32b flag2, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7])
-{
- int i;
- int x = row_x_start;
- c_put_str(TERM_L_GREEN, statname, yo, row_x_start);
- for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++)
- {
- if (flag_arr[i][6] == 1)
- {
- status_trival(
- (flag_arr[i][row] & flag),
- (flag_arr[i][row2] & flag2),
- yo, x + STATNM_LENGTH);
- x++;
- }
- }
-}
-
-static void row_bival(const char* statname, s16b row, u32b flag, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7])
-{
- int i;
- int x = row_x_start;
- c_put_str(TERM_L_GREEN, statname, yo, row_x_start);
- for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++)
- {
- if (flag_arr[i][6] == 1)
- {
- status_bival((flag_arr[i][row] & flag), yo, x + STATNM_LENGTH);
- x++;
- }
- }
-}
-
-static void row_npval(const char* statname, s16b row, u32b flag, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7])
-/* Displays nicely a pval-based status row */
-{
- int i;
- int x = row_x_start;
- c_put_str(TERM_L_GREEN, statname, yo, row_x_start);
- for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++)
- {
- if (flag_arr[i][6] == 1)
- {
- if (i == INVEN_PLAYER)
- /* Special case, player_flags */
- /* Players lack a pval, no way to calc value */
- {
- if (flag_arr[i][row] & flag)
- c_put_str(TERM_YELLOW, "*", yo, x + STATNM_LENGTH);
- else c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH);
- x++;
- continue;
- }
- if (flag_arr[i][row] & flag)
- status_numeric(p_ptr->inventory[i + INVEN_WIELD].pval, yo, x + STATNM_LENGTH);
- else
- c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH);
- x++;
- }
- }
-}
-
-static void statline(const char* statname, int statidx, u32b flag, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7])
-/* Displays a status row for a primary stat */
-{
- int i;
- int x = row_x_start;
- char statstr[8];
- byte stat_color = TERM_L_RED;
-
- cnv_stat(p_ptr->stat_use[statidx], statstr);
-
- c_put_str(TERM_L_GREEN, statstr, yo, 4 + row_x_start);
- for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++)
- {
- byte color = TERM_L_RED;
-
- if (flag_arr[i][6] == 1)
- {
- switch (statidx)
- {
- case A_STR:
- if (flag_arr[i][2] & TR2_SUST_STR)
- color = TERM_L_BLUE;
- break;
- case A_INT:
- if (flag_arr[i][2] & TR2_SUST_INT)
- color = TERM_L_BLUE;
- break;
- case A_WIS:
- if (flag_arr[i][2] & TR2_SUST_WIS)
- color = TERM_L_BLUE;
- break;
- case A_DEX:
- if (flag_arr[i][2] & TR2_SUST_DEX)
- color = TERM_L_BLUE;
- break;
- case A_CON:
- if (flag_arr[i][2] & TR2_SUST_CON)
- color = TERM_L_BLUE;
- break;
- case A_CHR:
- if (flag_arr[i][2] & TR2_SUST_CHR)
- color = TERM_L_BLUE;
- break;
- }
-
- if (i == INVEN_PLAYER ) /* Player flags */
- {
- if (flag_arr[i][1] & flag)
- c_put_str((color == TERM_L_RED) ? TERM_YELLOW : color, "*", yo, x + SL_LENGTH);
- else c_put_str((color == TERM_L_RED) ? TERM_WHITE : color, ".", yo, x + SL_LENGTH);
- x++;
- continue;
- }
- if (flag_arr[i][1] & flag)
- status_numeric(p_ptr->inventory[i + INVEN_WIELD].pval, yo, x + SL_LENGTH);
- else
- c_put_str((color == TERM_L_RED) ? TERM_WHITE : color, ".", yo, x + SL_LENGTH);
-
- if (color != TERM_L_RED)
- stat_color = color;
-
- x++;
- }
- }
-
- c_put_str(stat_color, statname, yo, row_x_start);
-}
-
-static void row_hd_bon(int which, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7])
-/* To-hit/dmg modifiers, selected by 1st argument */
-{
- int i;
- int x = row_x_start;
- if ((which != 0) && (which != 1)) return;
- c_put_str(TERM_L_GREEN, ((which == 0) ? "To-Hit" : "To-Dmg"), yo, row_x_start);
- for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++)
- {
- if (flag_arr[i][6] == 1)
- {
- if (i == INVEN_PLAYER) /* Player? */
- {
- c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH);
- x++;
- continue;
- }
- if ( (which == 0) && (p_ptr->inventory[INVEN_WIELD + i].to_h != 0))
- {
- status_numeric(p_ptr->inventory[INVEN_WIELD + i].to_h, yo, x + STATNM_LENGTH);
- x++;
- continue;
- }
- if ( (which == 1) && (p_ptr->inventory[INVEN_WIELD + i].to_d != 0))
- {
- status_numeric(p_ptr->inventory[INVEN_WIELD + i].to_d, yo, x + STATNM_LENGTH);
- x++;
- continue;
- }
- c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH);
- x++;
- }
- }
-}
-
-static void status_companion(void)
-{
- int i;
-
- FILE *fff;
-
- char file_name[1024];
-
- Term_clear();
-
- /* Temporary file */
- if (path_temp(file_name, 1024)) return;
-
- /* Open a new file */
- fff = my_fopen(file_name, "w");
-
- /* Calculate companions */
- /* Process the monsters (backwards) */
- for (i = m_max - 1; i >= 1; i--)
- {
- /* Access the monster */
- monster_type *m_ptr = &m_list[i];
-
- if (m_ptr->status == MSTATUS_COMPANION)
- {
- char m_name[80];
- int b, y = 0;
-
- /* Extract monster name */
- monster_desc(m_name, m_ptr, 0x80);
-
- fprintf(fff, "#####BCompanion: %s\n", m_name);
-
- fprintf(fff, " Lev/Exp : [[[[[G%d / %ld]\n", m_ptr->level, (long int) m_ptr->exp);
- if (m_ptr->level < MONSTER_LEVEL_MAX) fprintf(fff, " Next lvl: [[[[[G%ld]\n", (long int) monster_exp(m_ptr->level + 1));
- else fprintf(fff, " Next lvl: [[[[[G****]\n");
-
- fprintf(fff, " HP : [[[[[G%ld / %ld]\n", (long int) m_ptr->hp, (long int) m_ptr->maxhp);
- fprintf(fff, " AC : [[[[[G%d]\n", m_ptr->ac);
- fprintf(fff, " Speed : [[[[[G%d]\n", m_ptr->mspeed - 110);
-
- for (b = 0; b < 4; b++)
- {
- if (!m_ptr->blow[b].d_dice) continue;
- if (!m_ptr->blow[b].d_side) continue;
-
- fprintf(fff, " Blow %1d : [[[[[G%dd%d]\n", y + 1, m_ptr->blow[b].d_dice, m_ptr->blow[b].d_side);
- y++;
- }
-
- fprintf(fff, "\n");
- }
- }
-
- /* Close the file */
- my_fclose(fff);
-
- /* Display the file contents */
- show_file(file_name, "Companion List", 0, 0);
-
- /* Remove the file */
- fd_kill(file_name);
-}
diff --git a/src/status.hpp b/src/status.hpp
deleted file mode 100644
index 74624446..00000000
--- a/src/status.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-void status_main();
diff --git a/src/store.cc b/src/store.cc
index 0fbe2e9b..a11a3ea8 100644
--- a/src/store.cc
+++ b/src/store.cc
@@ -15,20 +15,22 @@
#include "cmd4.hpp"
#include "cmd5.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "obj_theme.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "owner_type.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "spell_type.hpp"
#include "skills.hpp"
#include "spells5.hpp"
#include "stats.hpp"
#include "store_action_type.hpp"
+#include "store_flag.hpp"
#include "store_type.hpp"
#include "store_info_type.hpp"
#include "tables.hpp"
@@ -41,6 +43,7 @@
#include "z-rand.hpp"
#include <cassert>
+#include <fmt/format.h>
#define STORE_GENERAL_STORE "General Store"
#define STORE_ARMOURY "Armoury"
@@ -52,7 +55,6 @@
#define STORE_BOOKS "Book Store"
#define STORE_PETS "Pet Shop"
#define STORE_HUNTING_SUPPLIES "Hunting Supply Store"
-#define STORE_RUNIC_MAGIC "Runic Magic Shop"
#define STORE_CONSTRUCTION_SUPPLIES "Construction Supply Store"
#define STORE_MUSIC "Music Store"
@@ -94,7 +96,7 @@ static cptr comment_4b[MAX_COMMENT_4B] =
/*
* Successful haggle.
*/
-static void say_comment_1(void)
+static void say_comment_1()
{
char rumour[80];
@@ -112,7 +114,7 @@ static void say_comment_1(void)
/*
* Kick 'da bum out. -RAK-
*/
-static void say_comment_4(void)
+static void say_comment_4()
{
msg_print(comment_4a[rand_int(MAX_COMMENT_4A)]);
msg_print(comment_4b[rand_int(MAX_COMMENT_4B)]);
@@ -176,9 +178,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess)
{
/* Comment */
msg_print(comment_7a[rand_int(MAX_COMMENT_7A)]);
-
- /* Sound */
- sound(SOUND_STORE1);
}
/* Item was cheaper than we thought, and we paid more than necessary */
@@ -186,9 +185,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess)
{
/* Comment */
msg_print(comment_7b[rand_int(MAX_COMMENT_7B)]);
-
- /* Sound */
- sound(SOUND_STORE2);
}
/* Item was a good bargain, and we got away with it */
@@ -196,9 +192,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess)
{
/* Comment */
msg_print(comment_7c[rand_int(MAX_COMMENT_7C)]);
-
- /* Sound */
- sound(SOUND_STORE3);
}
/* Item was a great bargain, and we got away with it */
@@ -206,9 +199,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess)
{
/* Comment */
msg_print(comment_7d[rand_int(MAX_COMMENT_7D)]);
-
- /* Sound */
- sound(SOUND_STORE4);
}
}
@@ -234,7 +224,7 @@ static store_type *st_ptr = NULL;
/*
* We store the current "owner type" here so everyone can access it
*/
-static owner_type *ot_ptr = NULL;
+static owner_type const *ot_ptr = NULL;
@@ -259,6 +249,8 @@ static owner_type *ot_ptr = NULL;
*/
static s32b price_item(object_type *o_ptr, int greed, bool_ flip)
{
+ auto const &st_info = game->edit_data.st_info;
+
int factor;
int adjust;
s32b price;
@@ -307,10 +299,10 @@ static s32b price_item(object_type *o_ptr, int greed, bool_ flip)
if (adjust > 100) adjust = 100;
/* Mega-Hack -- Black market sucks */
- if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) price = price / 2;
+ if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) price = price / 2;
/* No selling means you get no money */
- if (no_selling) price = 0;
+ if (options->no_selling) price = 0;
}
/* Shop is selling */
@@ -323,7 +315,7 @@ static s32b price_item(object_type *o_ptr, int greed, bool_ flip)
if (adjust < 100) adjust = 100;
/* Mega-Hack -- Black market sucks */
- if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) price = price * 2;
+ if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) price = price * 2;
/* Never give items away for free */
if (price <= 0L) price = 1L;
@@ -462,9 +454,9 @@ static void mass_produce(object_type *o_ptr)
}
- if (o_ptr->art_name)
+ if (!o_ptr->artifact_name.empty())
{
- if (cheat_peek && discount)
+ if (options->cheat_peek && discount)
{
msg_print("No discount on random artifacts.");
}
@@ -490,7 +482,7 @@ static void mass_produce(object_type *o_ptr)
*
* See "object_similar()" for the same function for the "player"
*/
-static bool_ store_object_similar(object_type *o_ptr, object_type *j_ptr)
+static bool_ store_object_similar(object_type const *o_ptr, object_type *j_ptr)
{
/* Hack -- Identical items cannot be stacked */
if (o_ptr == j_ptr) return (0);
@@ -520,12 +512,11 @@ static bool_ store_object_similar(object_type *o_ptr, object_type *j_ptr)
if (o_ptr->name2b != j_ptr->name2b) return (0);
/* Random artifacts don't stack !*/
- if (o_ptr->art_name || j_ptr->art_name) return (0);
+ if (!o_ptr->artifact_name.empty()) return 0;
+ if (!j_ptr->artifact_name.empty()) return 0;
/* Hack -- Identical art_flags! */
- if ((o_ptr->art_flags1 != j_ptr->art_flags1) ||
- (o_ptr->art_flags2 != j_ptr->art_flags2) ||
- (o_ptr->art_flags3 != j_ptr->art_flags3))
+ if (o_ptr->art_flags != j_ptr->art_flags)
return (0);
/* Hack -- Never stack "powerful" items */
@@ -583,24 +574,25 @@ static void store_object_absorb(object_type *o_ptr, object_type *j_ptr)
*/
static bool_ store_check_num(object_type *o_ptr)
{
- int i;
- object_type *j_ptr;
+ auto const &st_info = game->edit_data.st_info;
/* Free space is always usable */
- if (st_ptr->stock_num < st_ptr->stock_size) return TRUE;
+ if (st_ptr->stock.size() < st_ptr->stock_size)
+ {
+ return TRUE;
+ }
/* The "home" acts like the player */
- if ((cur_store_num == 7) ||
- (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM))
+ if ((cur_store_num == 7) || (st_info[st_ptr->st_idx].flags & STF_MUSEUM))
{
/* Check all the items */
- for (i = 0; i < st_ptr->stock_num; i++)
+ for (auto const &o_ref: st_ptr->stock)
{
- /* Get the existing item */
- j_ptr = &st_ptr->stock[i];
-
/* Can the new object be combined with the old one? */
- if (object_similar(j_ptr, o_ptr)) return (TRUE);
+ if (object_similar(&o_ref, o_ptr))
+ {
+ return TRUE;
+ }
}
}
@@ -608,27 +600,25 @@ static bool_ store_check_num(object_type *o_ptr)
else
{
/* Check all the items */
- for (i = 0; i < st_ptr->stock_num; i++)
+ for (auto const &o_ref: st_ptr->stock)
{
- /* Get the existing item */
- j_ptr = &st_ptr->stock[i];
-
/* Can the new object be combined with the old one? */
- if (store_object_similar(j_ptr, o_ptr)) return (TRUE);
+ if (store_object_similar(&o_ref, o_ptr))
+ {
+ return TRUE;
+ }
}
}
/* But there was no room at the inn... */
- return (FALSE);
+ return FALSE;
}
-static bool_ is_blessed(object_type const *o_ptr)
+static bool is_blessed(object_type const *o_ptr)
{
- u32b f1, f2, f3, f4, f5, esp;
- object_flags_known(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f3 & TR3_BLESSED) return (TRUE);
- else return (FALSE);
+ auto flags = object_flags_known(o_ptr);
+ return bool(flags & TR_BLESSED);
}
@@ -640,7 +630,9 @@ static bool_ is_blessed(object_type const *o_ptr)
*/
static bool store_will_buy(object_type const *o_ptr)
{
- cptr store_name = st_info[st_ptr->st_idx].name;
+ auto const &st_info = game->edit_data.st_info;
+
+ auto const &store_name = st_info[st_ptr->st_idx].name;
/* Hack -- The Home is simple */
if (cur_store_num == 7)
@@ -648,7 +640,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
- if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)
+ if (st_info[st_ptr->st_idx].flags & STF_MUSEUM)
{
return true;
}
@@ -660,7 +652,7 @@ static bool store_will_buy(object_type const *o_ptr)
}
/* What do stores buy? */
- if (streq(store_name, STORE_GENERAL_STORE))
+ if ((store_name == STORE_GENERAL_STORE))
{
switch (o_ptr->tval)
{
@@ -678,7 +670,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_ARMOURY))
+ else if ((store_name == STORE_ARMOURY))
{
switch (o_ptr->tval)
{
@@ -694,7 +686,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_WEAPONSMITH))
+ else if ((store_name == STORE_WEAPONSMITH))
{
switch (o_ptr->tval)
{
@@ -712,7 +704,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_TEMPLE))
+ else if ((store_name == STORE_TEMPLE))
{
switch (o_ptr->tval)
{
@@ -751,7 +743,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_ALCHEMY))
+ else if ((store_name == STORE_ALCHEMY))
{
switch (o_ptr->tval)
{
@@ -762,7 +754,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_MAGIC))
+ else if ((store_name == STORE_MAGIC))
{
switch (o_ptr->tval)
{
@@ -793,11 +785,11 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_BLACK_MARKET))
+ else if ((store_name == STORE_BLACK_MARKET))
{
return true;
}
- else if (streq(store_name, STORE_BOOKS))
+ else if ((store_name == STORE_BOOKS))
{
switch (o_ptr->tval)
{
@@ -809,15 +801,14 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_PETS))
+ else if ((store_name == STORE_PETS))
{
return (o_ptr->tval == TV_EGG);
}
- else if (streq(store_name, STORE_HUNTING_SUPPLIES))
+ else if ((store_name == STORE_HUNTING_SUPPLIES))
{
switch (o_ptr->tval)
{
- case TV_TRAPKIT:
case TV_BOOMERANG:
case TV_SHOT:
case TV_BOLT:
@@ -827,16 +818,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_RUNIC_MAGIC))
- {
- switch (o_ptr->tval)
- {
- case TV_RUNE1:
- case TV_RUNE2:
- return true;
- }
- }
- else if (streq(store_name, STORE_CONSTRUCTION_SUPPLIES))
+ else if ((store_name == STORE_CONSTRUCTION_SUPPLIES))
{
switch (o_ptr->tval)
{
@@ -845,7 +827,7 @@ static bool store_will_buy(object_type const *o_ptr)
return true;
}
}
- else if (streq(store_name, STORE_MUSIC))
+ else if ((store_name == STORE_MUSIC))
{
return (o_ptr->tval == TV_INSTRUMENT);
}
@@ -868,17 +850,13 @@ static bool store_will_buy(object_type const *o_ptr)
*/
static int home_carry(object_type *o_ptr)
{
- int slot;
- s32b value, j_value;
- int i;
- object_type *j_ptr;
-
+ std::size_t slot;
/* Check each existing item (try to combine) */
- for (slot = 0; slot < st_ptr->stock_num; slot++)
+ for (slot = 0; slot < st_ptr->stock.size(); slot++)
{
/* Get the existing item */
- j_ptr = &st_ptr->stock[slot];
+ auto j_ptr = &st_ptr->stock[slot];
/* The home acts just like the player */
if (object_similar(j_ptr, o_ptr))
@@ -887,22 +865,24 @@ static int home_carry(object_type *o_ptr)
object_absorb(j_ptr, o_ptr);
/* All done */
- return (slot);
+ return slot;
}
}
/* No space? */
- if (st_ptr->stock_num >= st_ptr->stock_size) return ( -1);
-
+ if (st_ptr->stock.size() >= st_ptr->stock_size)
+ {
+ return -1;
+ }
/* Determine the "value" of the item */
- value = object_value(o_ptr);
+ auto const value = object_value(o_ptr);
/* Check existing slots to see if we must "slide" */
- for (slot = 0; slot < st_ptr->stock_num; slot++)
+ for (slot = 0; slot < st_ptr->stock.size(); slot++)
{
/* Get that item */
- j_ptr = &st_ptr->stock[slot];
+ auto j_ptr = &st_ptr->stock[slot];
/* Objects sort by decreasing type */
if (o_ptr->tval > j_ptr->tval) break;
@@ -932,25 +912,16 @@ static int home_carry(object_type *o_ptr)
}
/* Objects sort by decreasing value */
- j_value = object_value(j_ptr);
+ auto const j_value = object_value(j_ptr);
if (value > j_value) break;
if (value < j_value) continue;
}
- /* Slide the others up */
- for (i = st_ptr->stock_num; i > slot; i--)
- {
- st_ptr->stock[i] = st_ptr->stock[i - 1];
- }
-
- /* More stuff now */
- st_ptr->stock_num++;
-
- /* Insert the new item */
- st_ptr->stock[slot] = *o_ptr;
+ /* Insert */
+ st_ptr->stock.insert(st_ptr->stock.begin() + slot, *o_ptr);
/* Return the location */
- return (slot);
+ return slot;
}
@@ -968,28 +939,28 @@ static int home_carry(object_type *o_ptr)
*/
static int store_carry(object_type *o_ptr)
{
- int i, slot;
- s32b value, j_value;
- object_type *j_ptr;
-
+ std::size_t slot;
/* Evaluate the object */
- value = object_value(o_ptr);
+ auto const value = object_value(o_ptr);
/* Cursed/Worthless items "disappear" when sold */
- if (value <= 0) return ( -1);
+ if (value <= 0)
+ {
+ return -1;
+ }
/* All store items are fully *identified* */
o_ptr->ident |= IDENT_MENTAL;
/* Erase the inscription */
- o_ptr->note = 0;
+ o_ptr->inscription.clear();
/* Check each existing item (try to combine) */
- for (slot = 0; slot < st_ptr->stock_num; slot++)
+ for (slot = 0; slot < st_ptr->stock.size(); slot++)
{
/* Get the existing item */
- j_ptr = &st_ptr->stock[slot];
+ auto j_ptr = &st_ptr->stock[slot];
/* Can the existing items be incremented? */
if (store_object_similar(j_ptr, o_ptr))
@@ -998,19 +969,22 @@ static int store_carry(object_type *o_ptr)
store_object_absorb(j_ptr, o_ptr);
/* All done */
- return (slot);
+ return slot;
}
}
/* No space? */
- if (st_ptr->stock_num >= st_ptr->stock_size) return ( -1);
+ if (st_ptr->stock.size() >= st_ptr->stock_size)
+ {
+ return -1;
+ }
/* Check existing slots to see if we must "slide" */
- for (slot = 0; slot < st_ptr->stock_num; slot++)
+ for (slot = 0; slot < st_ptr->stock.size(); slot++)
{
/* Get that item */
- j_ptr = &st_ptr->stock[slot];
+ auto j_ptr = &st_ptr->stock[slot];
/* Objects sort by decreasing type */
if (o_ptr->tval > j_ptr->tval) break;
@@ -1032,27 +1006,18 @@ static int store_carry(object_type *o_ptr)
}
/* Evaluate that slot */
- j_value = object_value(j_ptr);
+ auto const j_value = object_value(j_ptr);
/* Objects sort by decreasing value */
if (value > j_value) break;
if (value < j_value) continue;
}
- /* Slide the others up */
- for (i = st_ptr->stock_num; i > slot; i--)
- {
- st_ptr->stock[i] = st_ptr->stock[i - 1];
- }
-
- /* More stuff now */
- st_ptr->stock_num++;
-
/* Insert the new item */
- st_ptr->stock[slot] = *o_ptr;
+ st_ptr->stock.insert(st_ptr->stock.begin() + slot, *o_ptr);
/* Return the location */
- return (slot);
+ return slot;
}
@@ -1062,14 +1027,11 @@ static int store_carry(object_type *o_ptr)
*/
static void store_item_increase(int item, int num)
{
- int cnt;
- object_type *o_ptr;
-
/* Get the item */
- o_ptr = &st_ptr->stock[item];
+ auto o_ptr = &st_ptr->stock[item];
/* Verify the number */
- cnt = o_ptr->number + num;
+ int cnt = o_ptr->number + num;
if (cnt > 255) cnt = 255;
else if (cnt < 0) cnt = 0;
num = cnt - o_ptr->number;
@@ -1084,11 +1046,8 @@ static void store_item_increase(int item, int num)
*/
static void store_item_optimize(int item)
{
- int j;
- object_type *o_ptr;
-
/* Get the item */
- o_ptr = &st_ptr->stock[item];
+ auto const o_ptr = &st_ptr->stock[item];
/* Must exist */
if (!o_ptr->k_idx) return;
@@ -1096,17 +1055,11 @@ static void store_item_optimize(int item)
/* Must have no items */
if (o_ptr->number) return;
- /* One less item */
- st_ptr->stock_num--;
+ /* Wipe the item */
+ object_wipe(&st_ptr->stock[item]);
- /* Slide everyone */
- for (j = item; j < st_ptr->stock_num; j++)
- {
- st_ptr->stock[j] = st_ptr->stock[j + 1];
- }
-
- /* Nuke the final slot */
- object_wipe(&st_ptr->stock[j]);
+ /* Erase the item */
+ st_ptr->stock.erase(st_ptr->stock.begin() + item);
}
@@ -1117,7 +1070,7 @@ static void store_item_optimize(int item)
*/
static bool_ black_market_crap(object_type *o_ptr)
{
- int i, j;
+ auto const &st_info = game->edit_data.st_info;
/* Ego items are never crap */
if (o_ptr->name2) return (FALSE);
@@ -1128,18 +1081,16 @@ static bool_ black_market_crap(object_type *o_ptr)
if (o_ptr->to_d > 0) return (FALSE);
/* Check all stores */
- for (i = 0; i < max_st_idx; i++)
+ for (std::size_t i = 0; i < st_info.size(); i++)
{
if (i == STORE_HOME) continue;
- if (st_info[i].flags1 & SF1_MUSEUM) continue;
+ if (st_info[i].flags & STF_MUSEUM) continue;
/* Check every item in the store */
- for (j = 0; j < town_info[p_ptr->town_num].store[i].stock_num; j++)
+ for (auto const &stock_obj: town_info[p_ptr->town_num].store[i].stock)
{
- object_type *j_ptr = &town_info[p_ptr->town_num].store[i].stock[j];
-
/* Duplicate item "type", assume crappy */
- if (o_ptr->k_idx == j_ptr->k_idx) return (TRUE);
+ if (o_ptr->k_idx == stock_obj.k_idx) return (TRUE);
}
}
@@ -1152,15 +1103,13 @@ static bool_ black_market_crap(object_type *o_ptr)
* Attempt to delete (some of) a random item from the store
* Hack -- we attempt to "maintain" piles of items when possible.
*/
-static void store_delete(void)
+static void store_delete()
{
- int what, num;
-
/* Pick a random slot */
- what = rand_int(st_ptr->stock_num);
+ int const what = rand_int(st_ptr->stock.size());
/* Determine how many items are here */
- num = st_ptr->stock[what].number;
+ int num = st_ptr->stock[what].number;
/* Hack -- sometimes, only destroy half the items */
if (rand_int(100) < 50) num = (num + 1) / 2;
@@ -1182,19 +1131,22 @@ static void store_delete(void)
/* Analyze store flags and return a level */
int return_level()
{
- store_info_type *sti_ptr = &st_info[st_ptr->st_idx];
+ auto const &st_info = game->edit_data.st_info;
+
+ auto sti_ptr = &st_info[st_ptr->st_idx];
+
int level;
- if (sti_ptr->flags1 & SF1_RANDOM) level = 0;
+ if (sti_ptr->flags & STF_RANDOM) level = 0;
else level = rand_range(1, STORE_OBJ_LEVEL);
- if (sti_ptr->flags1 & SF1_DEPEND_LEVEL) level += dun_level;
+ if (sti_ptr->flags & STF_DEPEND_LEVEL) level += dun_level;
- if (sti_ptr->flags1 & SF1_SHALLOW_LEVEL) level += 5 + rand_int(5);
- if (sti_ptr->flags1 & SF1_MEDIUM_LEVEL) level += 25 + rand_int(25);
- if (sti_ptr->flags1 & SF1_DEEP_LEVEL) level += 45 + rand_int(45);
+ if (sti_ptr->flags & STF_SHALLOW_LEVEL) level += 5 + rand_int(5);
+ if (sti_ptr->flags & STF_MEDIUM_LEVEL) level += 25 + rand_int(25);
+ if (sti_ptr->flags & STF_DEEP_LEVEL) level += 45 + rand_int(45);
- if (sti_ptr->flags1 & SF1_ALL_ITEM) level += p_ptr->lev;
+ if (sti_ptr->flags & STF_ALL_ITEM) level += p_ptr->lev;
return (level);
}
@@ -1207,12 +1159,14 @@ static int store_tval = 0, store_level = 0;
*/
static bool_ kind_is_storeok(int k_idx)
{
- object_kind *k_ptr = &k_info[k_idx];
+ auto const &k_info = game->edit_data.k_info;
+
+ auto k_ptr = &k_info[k_idx];
- if (k_info[k_idx].flags3 & TR3_NORM_ART)
+ if (k_info[k_idx].flags & TR_NORM_ART)
return ( FALSE );
- if (k_info[k_idx].flags3 & TR3_INSTA_ART)
+ if (k_info[k_idx].flags & TR_INSTA_ART)
return ( FALSE );
if (!kind_is_legal(k_idx)) return FALSE;
@@ -1233,9 +1187,13 @@ static bool_ kind_is_storeok(int k_idx)
*
* Should we check for "permission" to have the given item?
*/
-static void store_create(void)
+static void store_create()
{
- int i = 0, tries, level = 0, chance, item;
+ auto const &st_info = game->edit_data.st_info;
+ auto const &k_info = game->edit_data.k_info;
+ auto &alloc = game->alloc;
+
+ int i = 0, tries, level = 0;
object_type forge;
object_type *q_ptr = NULL;
@@ -1243,7 +1201,10 @@ static void store_create(void)
/* Paranoia -- no room left */
- if (st_ptr->stock_num >= st_ptr->stock_size) return;
+ if (st_ptr->stock.size() >= st_ptr->stock_size)
+ {
+ return;
+ }
/* Hack -- consider up to four items */
@@ -1252,7 +1213,7 @@ static void store_create(void)
obj_all_done = FALSE;
/* Magic Shop */
- if (streq(st_info[st_ptr->st_idx].name, STORE_MAGIC) &&
+ if ((st_info[st_ptr->st_idx].name == STORE_MAGIC) &&
magik(20))
{
s16b spell;
@@ -1268,7 +1229,7 @@ static void store_create(void)
}
/* Temple */
- else if (streq(st_info[st_ptr->st_idx].name, STORE_TEMPLE) &&
+ else if ((st_info[st_ptr->st_idx].name == STORE_TEMPLE) &&
magik(20))
{
s16b spell;
@@ -1284,16 +1245,10 @@ static void store_create(void)
}
/* Black Market */
- else if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM)
+ else if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM)
{
- obj_theme theme;
-
/* No themes */
- theme.treasure = 100;
- theme.combat = 100;
- theme.magic = 100;
- theme.tools = 100;
- init_match_theme(theme);
+ init_match_theme(obj_theme::no_theme());
/*
* Even in Black Markets, illegal objects can be
@@ -1311,7 +1266,7 @@ static void store_create(void)
i = get_obj_num(level);
/* Invalidate the cached allocation table */
- alloc_kind_table_valid = FALSE;
+ alloc.kind_table_valid = false;
/* Handle failure */
if (!i) continue;
@@ -1322,12 +1277,12 @@ static void store_create(void)
else
{
/* Hack -- Pick an item to sell */
- item = rand_int(st_info[st_ptr->st_idx].table_num);
- i = st_info[st_ptr->st_idx].table[item][0];
- chance = st_info[st_ptr->st_idx].table[item][1];
+ auto const &item = st_info[st_ptr->st_idx].items[rand_int(st_info[st_ptr->st_idx].items.size())];
+ i = item.kind;
+ auto chance = item.chance;
/* Don't allow k_info artifacts */
- if ((i <= 10000) && (k_info[i].flags3 & TR3_NORM_ART))
+ if ((i <= 10000) && (k_info[i].flags & TR_NORM_ART))
continue;
/* Does it passes the rarity check ? */
@@ -1339,22 +1294,22 @@ static void store_create(void)
/* Hack -- i > 10000 means it's a tval and all svals are allowed */
if (i > 10000)
{
- obj_theme theme;
-
/* No themes */
- theme.treasure = 100;
- theme.combat = 100;
- theme.magic = 100;
- theme.tools = 100;
- init_match_theme(theme);
+ init_match_theme(obj_theme::no_theme());
/* Activate restriction */
get_obj_num_hook = kind_is_storeok;
store_tval = i - 10000;
/* Do we forbid too shallow items ? */
- if (st_info[st_ptr->st_idx].flags1 & SF1_FORCE_LEVEL) store_level = level;
- else store_level = 0;
+ if (st_info[st_ptr->st_idx].flags & STF_FORCE_LEVEL)
+ {
+ store_level = level;
+ }
+ else
+ {
+ store_level = 0;
+ }
/* Prepare allocation table */
get_obj_num_prep();
@@ -1363,7 +1318,7 @@ static void store_create(void)
i = get_obj_num(level);
/* Invalidate the cached allocation table */
- alloc_kind_table_valid = FALSE;
+ alloc.kind_table_valid = false;
}
if (!i) continue;
@@ -1373,11 +1328,11 @@ static void store_create(void)
if (!obj_all_done)
{
/* Don't allow k_info artifacts */
- if (k_info[i].flags3 & TR3_NORM_ART)
+ if (k_info[i].flags & TR_NORM_ART)
continue;
/* Don't allow artifacts */
- if (k_info[i].flags3 & TR3_INSTA_ART)
+ if (k_info[i].flags & TR_INSTA_ART)
continue;
/* Get local object */
@@ -1392,11 +1347,11 @@ static void store_create(void)
/* Hack -- Charge lite's */
if (q_ptr->tval == TV_LITE)
{
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- if (f4 & TR4_FUEL_LITE) q_ptr->timeout = k_info[q_ptr->k_idx].pval2;
+ auto const flags = object_flags(q_ptr);
+ if (flags & TR_FUEL_LITE)
+ {
+ q_ptr->timeout = k_info[q_ptr->k_idx].pval2;
+ }
}
}
@@ -1411,7 +1366,7 @@ static void store_create(void)
if (q_ptr->tval == TV_CHEST) continue;
/* Prune the black market */
- if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM)
+ if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM)
{
/* Hack -- No "crappy" items */
if (black_market_crap(q_ptr)) continue;
@@ -1438,7 +1393,7 @@ static void store_create(void)
}
/* Attempt to carry the (known) item */
- (void)store_carry(q_ptr);
+ store_carry(q_ptr);
/* Definitely done */
break;
@@ -1452,28 +1407,21 @@ static void store_create(void)
*/
static void display_entry(int pos)
{
- int i, cur_col;
- object_type *o_ptr;
- s32b x;
-
- char o_name[80];
- char out_val[160];
-
-
- int maxwid = 75;
+ auto const &st_info = game->edit_data.st_info;
/* Get the item */
- o_ptr = &st_ptr->stock[pos];
+ auto o_ptr = &st_ptr->stock[pos];
/* Get the "offset" */
- i = (pos % 12);
+ auto const i = (pos % 12);
/* Label it, clear the line --(-- */
+ char out_val[160];
strnfmt(out_val, 160, "%c) ", I2A(i));
c_prt(get_item_letter_color(o_ptr), out_val, i + 6, 0);
- cur_col = 3;
+ int cur_col = 3;
{
byte a = object_attr(o_ptr);
char c = object_char(o_ptr);
@@ -1486,14 +1434,15 @@ static void display_entry(int pos)
/* Describe an item in the home */
if ((cur_store_num == 7) ||
- (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM))
+ (st_info[st_ptr->st_idx].flags & STF_MUSEUM))
{
- maxwid = 75;
+ int maxwid = 75;
/* Leave room for weights */
maxwid -= 10;
/* Describe the object */
+ char o_name[80];
object_desc(o_name, o_ptr, TRUE, 3);
o_name[maxwid] = '\0';
c_put_str(tval_to_attr[o_ptr->tval], o_name, i + 6, cur_col);
@@ -1513,12 +1462,13 @@ static void display_entry(int pos)
byte color = TERM_WHITE;
/* Must leave room for the "price" */
- maxwid = 65;
+ int maxwid = 65;
/* Leave room for weights */
maxwid -= 7;
/* Describe the object (fully) */
+ char o_name[80];
object_desc_store(o_name, o_ptr, TRUE, 3);
o_name[maxwid] = '\0';
c_put_str(tval_to_attr[o_ptr->tval], o_name, i + 6, cur_col);
@@ -1532,7 +1482,7 @@ static void display_entry(int pos)
}
/* Extract the "minimum" price */
- x = price_item(o_ptr, ot_ptr->inflation, FALSE);
+ auto const x = price_item(o_ptr, ot_ptr->inflation, FALSE);
/* Can we buy one ? */
if (x > p_ptr->au) color = TERM_L_DARK;
@@ -1548,28 +1498,31 @@ static void display_entry(int pos)
* Displays a store's inventory -RAK-
* All prices are listed as "per individual object". -BEN-
*/
-static void display_inventory(void)
+static void display_inventory()
{
- int i, k;
+ int k;
/* Display the next 12 items */
for (k = 0; k < 12; k++)
{
/* Do not display "dead" items */
- if (store_top + k >= st_ptr->stock_num) break;
+ if (store_top + k >= static_cast<int>(st_ptr->stock.size()))
+ {
+ break;
+ }
/* Display that line */
display_entry(store_top + k);
}
/* Erase the extra lines and the "more" prompt */
- for (i = k; i < 13; i++) prt("", i + 6, 0);
+ for (int i = k; i < 13; i++) prt("", i + 6, 0);
/* Assume "no current page" */
put_str(" ", 5, 20);
/* Visual reminder of "more items" */
- if (st_ptr->stock_num > 12)
+ if (st_ptr->stock.size() > 12)
{
/* Show "more" reminder (after the last item) */
prt("-more-", k + 6, 3);
@@ -1583,7 +1536,7 @@ static void display_inventory(void)
/*
* Displays players gold -RAK-
*/
-void store_prt_gold(void)
+void store_prt_gold()
{
char out_val[64];
@@ -1597,8 +1550,10 @@ void store_prt_gold(void)
/*
* Displays store (after clearing screen) -RAK-
*/
-void display_store(void)
+void display_store()
{
+ auto const &st_info = game->edit_data.st_info;
+
char buf[80];
@@ -1617,11 +1572,10 @@ void display_store(void)
put_str("Weight", 5, 70);
}
- else if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)
+ else if (st_info[st_ptr->st_idx].flags & STF_MUSEUM)
{
/* Show the name of the store */
- strnfmt(buf, 80, "%s", st_info[cur_store_num].name);
- prt(buf, 3, 30);
+ prt(st_info[cur_store_num].name, 3, 30);
/* Label the item descriptions */
put_str("Item Description", 5, 3);
@@ -1634,14 +1588,11 @@ void display_store(void)
else
{
/* Put the owner name and race */
- strnfmt(buf, 80, "%s", ot_ptr->name);
+ strnfmt(buf, 80, "%s", ot_ptr->name.c_str());
put_str(buf, 3, 10);
/* Show the max price in the store (above prices) */
- strnfmt(buf, 80, "%s (" FMTs16b ")",
- st_info[cur_store_num].name,
- ot_ptr->max_cost);
- prt(buf, 3, 50);
+ prt(fmt::format("{:s} ({:d})", st_info[cur_store_num].name, ot_ptr->max_cost), 3, 50);
/* Label the item descriptions */
put_str("Item Description", 5, 3);
@@ -1761,7 +1712,7 @@ static bool_ prompt_yesno(cptr prompt)
}
/* Any other key must be in the allowed set to break the loop. */
- if ((strchr(allowed, key) != NULL) || quick_messages) {
+ if ((strchr(allowed, key) != NULL) || options->quick_messages) {
/* Check for presence in the 'yes' set */
ret = (strchr(yes, key) != NULL);
break;
@@ -1879,43 +1830,55 @@ static bool_ sell_haggle(object_type *o_ptr, s32b *price)
/*
* Will the owner retire?
*/
-static bool_ retire_owner_p(void)
+static bool retire_owner_p()
{
- store_info_type *sti_ptr = &st_info[town_info[p_ptr->town_num].store[cur_store_num].st_idx];
+ auto const &st_info = game->edit_data.st_info;
- if ((sti_ptr->owners[0] == sti_ptr->owners[1]) &&
- (sti_ptr->owners[0] == sti_ptr->owners[2]) &&
- (sti_ptr->owners[0] == sti_ptr->owners[3]))
+ auto sti_ptr = &st_info[town_info[p_ptr->town_num].store[cur_store_num].st_idx];
+
+ if (sti_ptr->owners.size() > 1)
{
- /* there is no other owner */
- return FALSE;
+ return false; // No other possible owner
}
if (rand_int(STORE_SHUFFLE) != 0)
{
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
}
/*
- * Stole an item from a store -DG-
+ * Adjust store_top to account for a removed item
*/
-void store_stole(void)
+static void adjust_store_top_item_removed()
{
- int i, amt;
- int item, item_new;
-
- object_type forge;
- object_type *j_ptr;
+ /* Nothing left? */
+ if (st_ptr->stock.empty() == 0)
+ {
+ store_top = 0;
+ }
- object_type *o_ptr;
+ /* Already at the top beginning? */
+ else if (store_top == 0)
+ {
+ /* Nothing to do */
+ }
- char o_name[80];
+ /* Nothing left on current screen? */
+ else if (store_top >= static_cast<int>(st_ptr->stock.size()))
+ {
+ store_top -= 12;
+ }
+}
- char out_val[160];
+/*
+ * Stole an item from a store -DG-
+ */
+void store_stole()
+{
if (cur_store_num == 7)
{
msg_print("You can't steal from your home!");
@@ -1923,7 +1886,7 @@ void store_stole(void)
}
/* Empty? */
- if (st_ptr->stock_num <= 0)
+ if (st_ptr->stock.empty())
{
msg_print("There is no item to steal.");
return;
@@ -1931,30 +1894,31 @@ void store_stole(void)
/* Find the number of objects on this and following pages */
- i = (st_ptr->stock_num - store_top);
+ int i = (st_ptr->stock.size() - store_top);
/* And then restrict it to the current page */
if (i > 12) i = 12;
/* Prompt */
+ char out_val[160];
strnfmt(out_val, 160, "Which item do you want to steal? ");
/* Get the item number to be bought */
+ int item;
if (!get_stock(&item, out_val, 0, i - 1)) return;
/* Get the actual index */
item = item + store_top;
/* Get the actual item */
- o_ptr = &st_ptr->stock[item];
+ object_type *o_ptr = &st_ptr->stock[item];
/* Assume the player wants just one of them */
- amt = 1;
-
- /* Get local object */
- j_ptr = &forge;
+ int amt = 1;
/* Get a copy of the object */
+ object_type forge;
+ object_type *j_ptr = &forge;
object_copy(j_ptr, o_ptr);
/* Modify quantity */
@@ -2018,16 +1982,17 @@ void store_stole(void)
}
/* Describe the transaction */
+ char o_name[80];
object_desc(o_name, j_ptr, TRUE, 3);
/* Message */
msg_format("You steal %s.", o_name);
/* Erase the inscription */
- j_ptr->note = 0;
+ j_ptr->inscription.clear();
/* Give it to the player */
- item_new = inven_carry(j_ptr, FALSE);
+ int const item_new = inven_carry(j_ptr, FALSE);
/* Describe the final result */
object_desc(o_name, &p_ptr->inventory[item_new], TRUE, 3);
@@ -2040,14 +2005,14 @@ void store_stole(void)
handle_stuff();
/* Note how many slots the store used to have */
- i = st_ptr->stock_num;
+ auto prev_stock_size = st_ptr->stock.size();
/* Remove the bought items from the store */
store_item_increase(item, -amt);
store_item_optimize(item);
/* Store is empty */
- if (st_ptr->stock_num == 0)
+ if (st_ptr->stock.empty())
{
/* Shuffle */
if (retire_owner_p())
@@ -2067,7 +2032,7 @@ void store_stole(void)
}
/* New inventory */
- for (i = 0; i < 10; i++)
+ for (int k = 0; k < 10; k++)
{
/* Maintain the store */
store_maint(p_ptr->town_num, cur_store_num);
@@ -2081,10 +2046,9 @@ void store_stole(void)
}
/* The item is gone */
- else if (st_ptr->stock_num != i)
+ else if (st_ptr->stock.size() != prev_stock_size)
{
- /* Pick the correct screen */
- if (store_top >= st_ptr->stock_num) store_top -= 12;
+ adjust_store_top_item_removed();
/* Redraw everything */
display_inventory();
@@ -2113,31 +2077,19 @@ void store_stole(void)
/*
* Buy an item from a store -RAK-
*/
-void store_purchase(void)
+void store_purchase()
{
- int i, amt = 1, choice;
- int item, item_new;
-
- s32b price, best;
-
- object_type forge;
- object_type *j_ptr;
-
- object_type *o_ptr;
-
- char o_name[80];
-
- char out_val[160];
+ auto const &st_info = game->edit_data.st_info;
/* Museum? */
- if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)
+ if (st_info[st_ptr->st_idx].flags & STF_MUSEUM)
{
msg_print("You cannot take items from the museum!");
return;
}
/* Empty? */
- if (st_ptr->stock_num <= 0)
+ if (st_ptr->stock.empty())
{
if (cur_store_num == 7) msg_print("Your home is empty.");
else msg_print("I am currently out of stock.");
@@ -2146,12 +2098,13 @@ void store_purchase(void)
/* Find the number of objects on this and following pages */
- i = (st_ptr->stock_num - store_top);
+ int i = (st_ptr->stock.size() - store_top);
/* And then restrict it to the current page */
if (i > 12) i = 12;
/* Prompt */
+ char out_val[160];
if (cur_store_num == 7)
{
strnfmt(out_val, 160, "Which item do you want to take? ");
@@ -2162,18 +2115,18 @@ void store_purchase(void)
}
/* Get the item number to be bought */
+ int item;
if (!get_stock(&item, out_val, 0, i - 1)) return;
/* Get the actual index */
item = item + store_top;
/* Get the actual item */
- o_ptr = &st_ptr->stock[item];
-
- /* Get local object */
- j_ptr = &forge;
+ auto o_ptr = &st_ptr->stock[item];
/* Get a copy of one object to determine the price */
+ object_type forge;
+ auto j_ptr = &forge;
object_copy(j_ptr, o_ptr);
/* Modify quantity */
@@ -2193,9 +2146,10 @@ void store_purchase(void)
}
/* Determine the "best" price (per item) */
- best = price_item(j_ptr, ot_ptr->inflation, FALSE);
+ auto const best = price_item(j_ptr, ot_ptr->inflation, FALSE);
/* Find out how many the player wants */
+ int amt = 1;
if (o_ptr->number > 1)
{
s32b q;
@@ -2231,10 +2185,8 @@ void store_purchase(void)
if (amt <= 0) return;
}
- /* Get local object */
- j_ptr = &forge;
-
/* Get desired object */
+ j_ptr = &forge;
object_copy(j_ptr, o_ptr);
/* Modify quantity */
@@ -2259,14 +2211,15 @@ void store_purchase(void)
if (cur_store_num != 7)
{
/* Haggle for a final price */
- choice = purchase_haggle(j_ptr, &price);
+ s32b price;
+ auto const choice = purchase_haggle(j_ptr, &price);
/* Hack -- Got kicked out */
if (st_ptr->store_open >= turn) return;
/* Player wants it */
- if (choice == 0)
+ if (!choice)
{
/* Player can afford it */
if (p_ptr->au >= price)
@@ -2274,9 +2227,6 @@ void store_purchase(void)
/* Say "okay" */
say_comment_1();
- /* Make a sound */
- sound(SOUND_BUY);
-
/* Spend the money */
p_ptr->au -= price;
@@ -2291,13 +2241,14 @@ void store_purchase(void)
j_ptr->found_aux1 = st_ptr->st_idx;
/* Describe the transaction */
+ char o_name[80];
object_desc(o_name, j_ptr, TRUE, 3);
/* Message */
msg_format("You bought %s for " FMTs32b " gold.", o_name, price);
/* Erase the inscription */
- j_ptr->note = 0;
+ j_ptr->inscription.clear();
/* Hack -- If a rod or wand, allocate total maximum
* timeouts or charges between those picked up and
@@ -2310,7 +2261,7 @@ void store_purchase(void)
}
/* Give it to the player */
- item_new = inven_carry(j_ptr, FALSE);
+ int const item_new = inven_carry(j_ptr, FALSE);
/* Describe the final result */
object_desc(o_name, &p_ptr->inventory[item_new], TRUE, 3);
@@ -2323,14 +2274,14 @@ void store_purchase(void)
handle_stuff();
/* Note how many slots the store used to have */
- i = st_ptr->stock_num;
+ auto prev_stock_size = st_ptr->stock.size();
/* Remove the bought items from the store */
store_item_increase(item, -amt);
store_item_optimize(item);
/* Store is empty */
- if (st_ptr->stock_num == 0)
+ if (st_ptr->stock.empty())
{
/* Shuffle */
if (retire_owner_p())
@@ -2350,7 +2301,7 @@ void store_purchase(void)
}
/* New inventory */
- for (i = 0; i < 10; i++)
+ for (int k = 0; k < 10; k++)
{
/* Maintain the store */
store_maint(p_ptr->town_num, cur_store_num);
@@ -2361,10 +2312,9 @@ void store_purchase(void)
}
/* The item is gone */
- else if (st_ptr->stock_num != i)
+ else if (st_ptr->stock.size() != prev_stock_size)
{
- /* Pick the correct screen */
- if (store_top >= st_ptr->stock_num) store_top -= 12;
+ adjust_store_top_item_removed();
}
/* Redraw everything */
@@ -2394,9 +2344,10 @@ void store_purchase(void)
}
/* Give it to the player */
- item_new = inven_carry(j_ptr, FALSE);
+ int const item_new = inven_carry(j_ptr, FALSE);
/* Describe just the result */
+ char o_name[80];
object_desc(o_name, &p_ptr->inventory[item_new], TRUE, 3);
/* Message */
@@ -2406,14 +2357,14 @@ void store_purchase(void)
handle_stuff();
/* Take note if we take the last one */
- i = st_ptr->stock_num;
+ std::size_t prev_stock_size = st_ptr->stock.size();
/* Remove the items from the home */
store_item_increase(item, -amt);
store_item_optimize(item);
/* Hack -- Item is still here */
- if (i == st_ptr->stock_num)
+ if (prev_stock_size == st_ptr->stock.size())
{
/* Redraw the item */
display_entry(item);
@@ -2422,11 +2373,7 @@ void store_purchase(void)
/* The item is gone */
else
{
- /* Nothing left */
- if (st_ptr->stock_num == 0) store_top = 0;
-
- /* Nothing left on that screen */
- else if (store_top >= st_ptr->stock_num) store_top -= 12;
+ adjust_store_top_item_removed();
/* Redraw everything */
display_inventory();
@@ -2441,8 +2388,10 @@ void store_purchase(void)
/*
* Sell an item to the store (or home)
*/
-void store_sell(void)
+void store_sell()
{
+ auto const &st_info = game->edit_data.st_info;
+
int choice;
int item, item_pos;
int amt;
@@ -2452,13 +2401,9 @@ void store_sell(void)
object_type forge;
object_type *q_ptr;
- object_type *o_ptr;
-
char o_name[80];
- u32b f1, f2, f3, f4, f5, esp;
-
- bool_ museum = (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) ? TRUE : FALSE;
+ bool museum = bool(st_info[st_ptr->st_idx].flags & STF_MUSEUM);
/* Prepare prompt */
cptr q, s;
@@ -2485,9 +2430,9 @@ void store_sell(void)
}
/* Get the item */
- o_ptr = get_object(item);
+ auto o_ptr = get_object(item);
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Hack -- Cannot remove cursed items */
if (cursed_p(o_ptr))
@@ -2502,7 +2447,7 @@ void store_sell(void)
}
else
{
- if (f4 & TR4_CURSE_NO_DROP)
+ if (flags & TR_CURSE_NO_DROP)
{
/* Oops */
msg_print("Hmmm, you seem to be unable to drop it.");
@@ -2550,7 +2495,7 @@ void store_sell(void)
/* Remove any inscription for stores */
if ((cur_store_num != 7) && !museum)
{
- q_ptr->note = 0;
+ q_ptr->inscription.clear();
}
/* Is there room in the store (or the home?) */
@@ -2578,9 +2523,6 @@ void store_sell(void)
/* Say "okay" */
say_comment_1();
- /* Make a sound */
- sound(SOUND_SELL);
-
/* Get some money */
p_ptr->au += price;
@@ -2747,45 +2689,38 @@ void store_sell(void)
/*
* Examine an item in a store -JDL-
*/
-void store_examine(void)
+void store_examine()
{
- int i;
- int item;
-
- object_type *o_ptr;
-
- char o_name[80];
-
- char out_val[160];
-
+ auto const &st_info = game->edit_data.st_info;
/* Empty? */
- if (st_ptr->stock_num <= 0)
+ if (st_ptr->stock.empty())
{
if (cur_store_num == 7) msg_print("Your home is empty.");
- else if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) msg_print("The museum is empty.");
+ else if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) msg_print("The museum is empty.");
else msg_print("I am currently out of stock.");
return;
}
/* Find the number of objects on this and following pages */
- i = (st_ptr->stock_num - store_top);
+ int i = (st_ptr->stock.size() - store_top);
/* And then restrict it to the current page */
- if (i > 12) i = 12;
-
- /* Prompt */
- strnfmt(out_val, 160, "Which item do you want to examine? ");
+ if (i > 12)
+ {
+ i = 12;
+ }
/* Get the item number to be examined */
- if (!get_stock(&item, out_val, 0, i - 1)) return;
+ int item;
+ if (!get_stock(&item, "Which item do you want to examine? ", 0, i - 1)) return;
/* Get the actual index */
item = item + store_top;
/* Get the actual item */
- o_ptr = &st_ptr->stock[item];
+ auto o_ptr = &st_ptr->stock[item];
/* Debug hack */
if (wizard)
@@ -2802,6 +2737,7 @@ void store_examine(void)
}
/* Description */
+ char o_name[80];
object_desc(o_name, o_ptr, TRUE, 3);
/* Describe */
@@ -2834,6 +2770,34 @@ static bool_ leave_store = FALSE;
/*
+ * Find building action for command. Returns nullptr if no matching
+ * action is found.
+ */
+static store_action_type const *find_store_action(s16b command_cmd)
+{
+ auto const &st_info = game->edit_data.st_info;
+ auto const &ba_info = game->edit_data.ba_info;
+
+ for (std::size_t i = 0; i < st_info[st_ptr->st_idx].actions.size(); i++)
+ {
+ auto ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]];
+
+ if (ba_ptr->letter && (ba_ptr->letter == command_cmd))
+ {
+ return ba_ptr;
+ }
+
+ if (ba_ptr->letter_aux && (ba_ptr->letter_aux == command_cmd))
+ {
+ return ba_ptr;
+ }
+ }
+
+ return nullptr;
+}
+
+
+/*
* Process a command in a store
*
* Note that we must allow the use of a few "special" commands
@@ -2841,41 +2805,18 @@ static bool_ leave_store = FALSE;
* must disable some commands which are allowed in the dungeon
* but not in the stores, to prevent chaos.
*/
-static bool_ store_process_command(void)
+static bool_ store_process_command()
{
- bool_ validcmd = FALSE;
- int i;
- store_action_type *ba_ptr;
bool_ recreate = FALSE;
/* Handle repeating the last command */
repeat_check();
- for (i = 0; i < 6; i++)
- {
- ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]];
+ auto ba_ptr = find_store_action(command_cmd);
- if (ba_ptr->letter)
- {
- if (ba_ptr->letter == command_cmd)
- {
- validcmd = TRUE;
- break;
- }
- }
- if (ba_ptr->letter_aux)
- {
- if (ba_ptr->letter_aux == command_cmd)
- {
- validcmd = TRUE;
- break;
- }
- }
- }
-
- if (validcmd)
+ if (ba_ptr)
{
- recreate = bldg_process_command(st_ptr, i);
+ recreate = bldg_process_command(st_ptr, ba_ptr);
}
else
{
@@ -2892,14 +2833,17 @@ static bool_ store_process_command(void)
/* Browse */
case ' ':
{
- if (st_ptr->stock_num <= 12)
+ if (st_ptr->stock.size() <= 12)
{
msg_print("Entire inventory is shown.");
}
else
{
store_top += 12;
- if (store_top >= st_ptr->stock_num) store_top = 0;
+ if (store_top >= static_cast<int>(st_ptr->stock.size()))
+ {
+ store_top = 0;
+ }
display_inventory();
}
break;
@@ -2908,7 +2852,7 @@ static bool_ store_process_command(void)
/* Browse backwards */
case '-':
{
- if (st_ptr->stock_num <= 12)
+ if (st_ptr->stock.size() <= 12)
{
msg_print("Entire inventory is shown.");
}
@@ -2917,7 +2861,7 @@ static bool_ store_process_command(void)
store_top -= 12;
if (store_top < 0)
{
- store_top = ((st_ptr->stock_num - 1) / 12) * 12;
+ store_top = ((st_ptr->stock.size() - 1) / 12) * 12;
}
display_inventory();
}
@@ -3169,8 +3113,12 @@ static bool_ store_process_command(void)
* into other commands, normally, we convert "p" (pray) and "m"
* (cast magic) into "g" (get), and "s" (search) into "d" (drop).
*/
-void do_cmd_store(void)
+void do_cmd_store()
{
+ auto const &ow_info = game->edit_data.ow_info;
+ auto const &ba_info = game->edit_data.ba_info;
+ auto const &st_info = game->edit_data.st_info;
+
int which;
int maintain_num;
int tmp_chr;
@@ -3252,13 +3200,11 @@ void do_cmd_store(void)
display_store();
/* Mega-Hack -- Ignore keymaps on store action letters */
- for (i = 0; i < 6; i++)
+ for (std::size_t i = 0; i < st_info[st_ptr->st_idx].actions.size(); i++)
{
- store_action_type *ba_ptr =
- &ba_info[st_info[st_ptr->st_idx].actions[i]];
+ auto ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]];
request_command_ignore_keymaps[2*i] = ba_ptr->letter;
request_command_ignore_keymaps[2*i+1] = ba_ptr->letter_aux;
-
}
/* Do not leave */
@@ -3282,7 +3228,7 @@ void do_cmd_store(void)
prt(") Exit.", 22, 4);
/* Browse if necessary */
- if (st_ptr->stock_num > 12)
+ if (st_ptr->stock.size() > 12)
{
c_prt(TERM_YELLOW, " SPACE", 23, 0);
prt(") Next page", 23, 6);
@@ -3439,14 +3385,14 @@ void do_cmd_store(void)
*/
void store_shuffle(int which)
{
- int i, j;
-
+ auto const &ow_info = game->edit_data.ow_info;
+ auto const &st_info = game->edit_data.st_info;
/* Ignore home */
if (which == STORE_HOME) return;
/* Ignoer Museum */
- if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) return;
+ if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) return;
/* Save the store index */
@@ -3456,9 +3402,9 @@ void store_shuffle(int which)
st_ptr = &town_info[p_ptr->town_num].store[cur_store_num];
/* Pick a new owner */
- for (j = st_ptr->owner; j == st_ptr->owner; )
+ for (auto j = st_ptr->owner; j == st_ptr->owner; )
{
- st_ptr->owner = st_info[st_ptr->st_idx].owners[rand_int(4)];
+ st_ptr->owner = *uniform_element(st_info[st_ptr->st_idx].owners);
}
/* Activate the new owner */
@@ -3470,19 +3416,16 @@ void store_shuffle(int which)
/* Hack -- discount all the items */
- for (i = 0; i < st_ptr->stock_num; i++)
+ for (auto &o_ref: st_ptr->stock)
{
- object_type *o_ptr;
-
- /* Get the item */
- o_ptr = &st_ptr->stock[i];
+ auto o_ptr = &o_ref;
/* Hack -- Sell all old items for "half price" */
- if (!(o_ptr->art_name))
+ if (o_ptr->artifact_name.empty())
o_ptr->discount = 50;
/* Mega-Hack -- Note that the item is "on sale" */
- o_ptr->note = quark_add("on sale");
+ o_ptr->inscription = "on sale";
}
}
@@ -3492,9 +3435,10 @@ void store_shuffle(int which)
*/
void store_maint(int town_num, int store_num)
{
- int j, tries = 100;
+ auto const &ow_info = game->edit_data.ow_info;
+ auto const &st_info = game->edit_data.st_info;
- int old_rating = rating;
+ int const old_rating = rating;
cur_store_num = store_num;
@@ -3505,16 +3449,16 @@ void store_maint(int town_num, int store_num)
st_ptr = &town_info[town_num].store[store_num];
/* Ignoer Museum */
- if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) return;
+ if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) return;
/* Activate the owner */
ot_ptr = &ow_info[st_ptr->owner];
/* Mega-Hack -- prune the black market */
- if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM)
+ if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM)
{
/* Destroy crappy black market items */
- for (j = st_ptr->stock_num - 1; j >= 0; j--)
+ for (int j = st_ptr->stock.size() - 1; j >= 0; j--)
{
object_type *o_ptr = &st_ptr->stock[j];
@@ -3530,7 +3474,7 @@ void store_maint(int town_num, int store_num)
/* Choose the number of slots to keep */
- j = st_ptr->stock_num;
+ int j = st_ptr->stock.size();
/* Sell a few items */
j = j - randint(STORE_TURNOVER);
@@ -3545,11 +3489,13 @@ void store_maint(int town_num, int store_num)
if (j < 0) j = 0;
/* Destroy objects until only "j" slots are left */
- while (st_ptr->stock_num > j) store_delete();
-
+ while (j < static_cast<int>(st_ptr->stock.size()))
+ {
+ store_delete();
+ }
/* Choose the number of slots to fill */
- j = st_ptr->stock_num;
+ j = st_ptr->stock.size();
/* Buy some more items */
j = j + randint(STORE_TURNOVER);
@@ -3561,13 +3507,15 @@ void store_maint(int town_num, int store_num)
if (j < STORE_MIN_KEEP) j = STORE_MIN_KEEP;
/* Hack -- prevent "overflow" */
- if (j >= st_ptr->stock_size) j = st_ptr->stock_size - 1;
+ if (j >= st_ptr->stock_size)
+ {
+ j = st_ptr->stock_size - 1;
+ }
/* Acquire some new items */
- while ((st_ptr->stock_num < j) && tries)
+ for (int tries = 0; (tries < 100) && (static_cast<int>(st_ptr->stock.size()) < j); tries++)
{
store_create();
- tries--;
}
/* Hack -- Restore the rating */
@@ -3580,38 +3528,34 @@ void store_maint(int town_num, int store_num)
*/
void store_init(int town_num, int store_num)
{
- int k;
+ auto const &ow_info = game->edit_data.ow_info;
+ auto const &st_info = game->edit_data.st_info;
cur_store_num = store_num;
- /* Activate that store */
+ // Activate store
st_ptr = &town_info[town_num].store[store_num];
+ // Pick an owner. We use 0 for st_info[] which haven't been
+ // initialized, i.e. where there's no entry in st_info.txt.
+ st_ptr->owner = st_info[st_ptr->st_idx].owners.empty()
+ ? 0
+ : *uniform_element(st_info[st_ptr->st_idx].owners)
+ ;
- /* Pick an owner */
- st_ptr->owner = st_info[st_ptr->st_idx].owners[rand_int(4)];
-
- /* Activate the new owner */
+ // Activate the new owner
ot_ptr = &ow_info[st_ptr->owner];
-
- /* Initialize the store */
+ // Initialize the store
st_ptr->store_open = 0;
- /* Nothing in stock */
- st_ptr->stock_num = 0;
+ // Nothing in stock
+ st_ptr->stock.reserve(st_ptr->stock_size);
+ st_ptr->stock.clear();
- /*
- * MEGA-HACK - Last visit to store is
- * BEFORE player birth to enable store restocking
- */
+ // MEGA-HACK - Last visit to store is BEFORE player
+ // birth to enable store restocking.
st_ptr->last_visit = -100L * STORE_TURNS;
-
- /* Clear any old items */
- for (k = 0; k < st_ptr->stock_size; k++)
- {
- object_wipe(&st_ptr->stock[k]);
- }
}
@@ -3625,12 +3569,15 @@ void store_init(int town_num, int store_num)
* into other commands, normally, we convert "p" (pray) and "m"
* (cast magic) into "g" (get), and "s" (search) into "d" (drop).
*/
-void do_cmd_home_trump(void)
+void do_cmd_home_trump()
{
+ auto const &ow_info = game->edit_data.ow_info;
+ auto const &ba_info = game->edit_data.ba_info;
+ auto const &st_info = game->edit_data.st_info;
+
int which;
int maintain_num;
int tmp_chr;
- int i;
int town_num;
/* Extract the store code */
@@ -3655,8 +3602,10 @@ void do_cmd_home_trump(void)
if (maintain_num)
{
/* Maintain the store */
- for (i = 0; i < maintain_num; i++)
+ for (int i = 0; i < maintain_num; i++)
+ {
store_maint(town_num, which);
+ }
/* Save the visit */
town_info[town_num].store[which].last_visit = turn;
@@ -3698,10 +3647,10 @@ void do_cmd_home_trump(void)
display_store();
/* Mega-Hack -- Ignore keymaps on store action letters */
- for (i = 0; i < 6; i++)
+ auto const &st_actions = st_info[st_ptr->st_idx].actions;
+ for (std::size_t i = 0; (i < (MAX_IGNORE_KEYMAPS/2)) && (i < st_actions.size()); i++)
{
- store_action_type *ba_ptr =
- &ba_info[st_info[st_ptr->st_idx].actions[i]];
+ auto ba_ptr = &ba_info[st_actions[i]];
request_command_ignore_keymaps[2*i] = ba_ptr->letter;
request_command_ignore_keymaps[2*i+1] = ba_ptr->letter_aux;
}
@@ -3726,7 +3675,7 @@ void do_cmd_home_trump(void)
prt(" ESC) Exit from Building.", 22, 0);
/* Browse if necessary */
- if (st_ptr->stock_num > 12)
+ if (st_ptr->stock.size() > 12)
{
prt(" SPACE) Next page of stock", 23, 0);
}
diff --git a/src/store.hpp b/src/store.hpp
index f67d94eb..0f189167 100644
--- a/src/store.hpp
+++ b/src/store.hpp
@@ -1,12 +1,12 @@
#pragma once
-extern void do_cmd_store();
-extern void store_shuffle(int which);
-extern void store_maint(int town_num, int store_num);
-extern void store_init(int town_num, int store_num);
-extern void do_cmd_home_trump();
-extern void store_sell();
-extern void store_purchase();
-extern void store_examine();
-extern void store_stole();
-extern void store_prt_gold();
+void do_cmd_store();
+void store_shuffle(int which);
+void store_maint(int town_num, int store_num);
+void store_init(int town_num, int store_num);
+void do_cmd_home_trump();
+void store_sell();
+void store_purchase();
+void store_examine();
+void store_stole();
+void store_prt_gold();
diff --git a/src/store_action_type.hpp b/src/store_action_type.hpp
index 048e13a0..ee479375 100644
--- a/src/store_action_type.hpp
+++ b/src/store_action_type.hpp
@@ -7,11 +7,11 @@
*/
struct store_action_type
{
- const char *name; /* Name */
+ std::string name; /* Name */
- s16b costs[3]; /* Costs for liked people */
- char letter; /* Action letter */
- char letter_aux; /* Action letter */
- s16b action; /* Action code */
- s16b action_restr; /* Action restriction */
+ std::array<s16b, 3> costs { }; /* Costs for liked people */
+ char letter = '\0'; /* Action letter */
+ char letter_aux = '\0'; /* Action letter */
+ s16b action = 0; /* Action code */
+ s16b action_restr = 0; /* Action restriction */
};
diff --git a/src/store_flag.hpp b/src/store_flag.hpp
new file mode 100644
index 00000000..6844bd84
--- /dev/null
+++ b/src/store_flag.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "store_flag_set.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+//
+// Define flag set for each flag.
+//
+#define STF(tier, index, name) \
+ DECLARE_FLAG(store_flag_set, BOOST_PP_CAT(STF_,name), tier, index)
+#include "store_flag_list.hpp"
+#undef STF
diff --git a/src/store_flag_list.hpp b/src/store_flag_list.hpp
new file mode 100644
index 00000000..f8e4b177
--- /dev/null
+++ b/src/store_flag_list.hpp
@@ -0,0 +1,17 @@
+/**
+ * X-macro list of all the store flags
+ */
+
+/* STF(<tier>, <index>, <name>) */
+
+STF(1, 0, DEPEND_LEVEL )
+STF(1, 1, SHALLOW_LEVEL)
+STF(1, 2, MEDIUM_LEVEL )
+STF(1, 3, DEEP_LEVEL )
+STF(1, 4, RARE )
+STF(1, 5, VERY_RARE )
+STF(1, 6, COMMON )
+STF(1, 7, ALL_ITEM )
+STF(1, 8, RANDOM )
+STF(1, 9, FORCE_LEVEL )
+STF(1, 10, MUSEUM )
diff --git a/src/store_flag_set.hpp b/src/store_flag_set.hpp
new file mode 100644
index 00000000..0529baed
--- /dev/null
+++ b/src/store_flag_set.hpp
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "flag_set.hpp"
+
+constexpr std::size_t STF_MAX_TIERS = 1;
+
+typedef flag_set<STF_MAX_TIERS> store_flag_set;
diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp
index 030afe91..78aa071e 100644
--- a/src/store_info_type.hpp
+++ b/src/store_info_type.hpp
@@ -1,32 +1,31 @@
#pragma once
#include "h-basic.h"
+#include "store_flag_set.hpp"
+#include "store_item.hpp"
-/**
- * Number of items to choose stock from
- */
-constexpr int STORE_CHOICES = 56;
+#include <vector>
/**
* Store descriptor.
*/
struct store_info_type
{
- const char *name; /* Name */
+ std::string name; /* Name */
+
+ std::vector<store_item> items; /* Table -- Legal item kinds */
- s16b table[STORE_CHOICES][2]; /* Table -- Legal item kinds */
- byte table_num; /* Number of items */
- s16b max_obj; /* Number of items this store can hold */
+ s16b max_obj = 0; /* Number of items this store can hold */
- u16b owners[4]; /* List of owners(refers to ow_info) */
+ std::vector<u16b> owners; /* List of owners; refers to ow_info */
- u16b actions[6]; /* Actions(refers to ba_info) */
+ std::vector<u16b> actions; /* Actions; refers to ba_info */
- byte d_attr; /* Default building attribute */
- char d_char; /* Default building character */
+ byte d_attr = 0; /* Default building attribute */
+ char d_char = '\0'; /* Default building character */
- byte x_attr; /* Desired building attribute */
- char x_char; /* Desired building character */
+ byte x_attr = 0; /* Desired building attribute */
+ char x_char = '\0'; /* Desired building character */
- u32b flags1; /* Flags */
+ store_flag_set flags; /* Flags */
};
diff --git a/src/store_info_type_fwd.hpp b/src/store_info_type_fwd.hpp
deleted file mode 100644
index a0dace90..00000000
--- a/src/store_info_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct store_info_type;
diff --git a/src/store_item.hpp b/src/store_item.hpp
new file mode 100644
index 00000000..62d3f2a9
--- /dev/null
+++ b/src/store_item.hpp
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "h-basic.h"
+
+struct store_item
+{
+ /**
+ * Legal item kinds; if > 10000, designates (TVAL - 10000) and any SVAL.
+ * Otherwise designates an entry in k_info.txt.
+ */
+ s16b kind = 0;
+
+ /**
+ * Percentage chance of generation if the entry is chosen.
+ */
+ s16b chance = 0;
+
+};
diff --git a/src/store_type.hpp b/src/store_type.hpp
index e3f917ac..5fb4ac7f 100644
--- a/src/store_type.hpp
+++ b/src/store_type.hpp
@@ -1,7 +1,9 @@
#pragma once
#include "h-basic.h"
-#include "object_type.hpp"
+#include "object_type_fwd.hpp"
+
+#include <vector>
/**
* A store, with an owner, various state flags, a current stock
@@ -9,35 +11,30 @@
*/
struct store_type
{
- u16b st_idx;
+ u16b st_idx = 0;
/**
* Owner index
*/
- u16b owner;
+ u16b owner = 0;
/**
* Closed until this turn.
*/
- s32b store_open;
+ s32b store_open = 0;
/**
* Last visited on this turn.
*/
- s32b last_visit;
-
- /**
- * Stock: Number of entries.
- */
- byte stock_num;
+ s32b last_visit = 0;
/**
* Stock: Total size of array
*/
- s16b stock_size;
+ u16b stock_size = 0;
/**
* Stock: Actual stock items
*/
- object_type *stock;
+ std::vector<object_type> stock;
};
diff --git a/src/tables.cc b/src/tables.cc
index 09e6c18c..1caa4bcf 100644
--- a/src/tables.cc
+++ b/src/tables.cc
@@ -10,6 +10,9 @@
#include "tables.h"
#include "modules.hpp"
+#include "monster_race_flag.hpp"
+#include "monster_spell_flag.hpp"
+#include "object_flag.hpp"
#include "options.hpp"
#include "q_library.hpp"
#include "q_fireprof.hpp"
@@ -311,98 +314,6 @@ byte adj_wis_sav[] =
/*
- * Stat Table (DEX) -- disarming
- */
-byte adj_dex_dis[] =
-{
- 0 /* 3 */,
- 0 /* 4 */,
- 0 /* 5 */,
- 0 /* 6 */,
- 0 /* 7 */,
- 0 /* 8 */,
- 0 /* 9 */,
- 0 /* 10 */,
- 0 /* 11 */,
- 0 /* 12 */,
- 1 /* 13 */,
- 1 /* 14 */,
- 1 /* 15 */,
- 2 /* 16 */,
- 2 /* 17 */,
- 4 /* 18/00-18/09 */,
- 4 /* 18/10-18/19 */,
- 4 /* 18/20-18/29 */,
- 4 /* 18/30-18/39 */,
- 5 /* 18/40-18/49 */,
- 5 /* 18/50-18/59 */,
- 5 /* 18/60-18/69 */,
- 6 /* 18/70-18/79 */,
- 6 /* 18/80-18/89 */,
- 7 /* 18/90-18/99 */,
- 8 /* 18/100-18/109 */,
- 8 /* 18/110-18/119 */,
- 8 /* 18/120-18/129 */,
- 8 /* 18/130-18/139 */,
- 8 /* 18/140-18/149 */,
- 9 /* 18/150-18/159 */,
- 9 /* 18/160-18/169 */,
- 9 /* 18/170-18/179 */,
- 9 /* 18/180-18/189 */,
- 9 /* 18/190-18/199 */,
- 10 /* 18/200-18/209 */,
- 10 /* 18/210-18/219 */,
- 10 /* 18/220+ */
-};
-
-
-/*
- * Stat Table (INT) -- disarming
- */
-byte adj_int_dis[] =
-{
- 0 /* 3 */,
- 0 /* 4 */,
- 0 /* 5 */,
- 0 /* 6 */,
- 0 /* 7 */,
- 1 /* 8 */,
- 1 /* 9 */,
- 1 /* 10 */,
- 1 /* 11 */,
- 1 /* 12 */,
- 1 /* 13 */,
- 1 /* 14 */,
- 2 /* 15 */,
- 2 /* 16 */,
- 2 /* 17 */,
- 3 /* 18/00-18/09 */,
- 3 /* 18/10-18/19 */,
- 3 /* 18/20-18/29 */,
- 4 /* 18/30-18/39 */,
- 4 /* 18/40-18/49 */,
- 5 /* 18/50-18/59 */,
- 6 /* 18/60-18/69 */,
- 7 /* 18/70-18/79 */,
- 8 /* 18/80-18/89 */,
- 9 /* 18/90-18/99 */,
- 10 /* 18/100-18/109 */,
- 10 /* 18/110-18/119 */,
- 11 /* 18/120-18/129 */,
- 12 /* 18/130-18/139 */,
- 13 /* 18/140-18/149 */,
- 14 /* 18/150-18/159 */,
- 15 /* 18/160-18/169 */,
- 16 /* 18/170-18/179 */,
- 17 /* 18/180-18/189 */,
- 18 /* 18/190-18/199 */,
- 19 /* 18/200-18/209 */,
- 19 /* 18/210-18/219 */,
- 20 /* 18/220+ */
-};
-
-
-/*
* Stat Table (DEX) -- bonus to ac (plus 128)
*/
byte adj_dex_ta[] =
@@ -1144,29 +1055,6 @@ s32b player_exp[PY_MAX_LEVEL] =
/*
- * Player Sexes
- *
- * Title,
- * Winner
- */
-player_sex sex_info[MAX_SEXES] =
-{
- {
- "Female",
- "Queen"
- },
-
-{
-"Male",
-"King"
-},
-{
-"Neuter",
-"Ruler"
-}
-};
-
-/*
* Hack -- the "basic" color names (see "TERM_xxx")
*/
cptr color_names[16] =
@@ -1258,230 +1146,6 @@ cptr window_flag_desc[32] =
};
-/*
- * Available Options
- *
- * Option Screen Sets:
- *
- * Set 1: User Interface
- * Set 2: Disturbance
- * Set 3: Inventory
- * Set 4: Game Play
- * Set 5: ToME
- * Set 6: Birth
- *
- * Note that bits 28-31 of set 0 are currently unused.
- */
-option_type option_info[] =
-{
- /*** User-Interface ***/
-
- { &rogue_like_commands, FALSE, 1, 0,
- "rogue_like_commands", "Rogue-like commands" },
-
- { &quick_messages, TRUE, 1, 1,
- "quick_messages", "Activate quick messages" },
-
- { &carry_query_flag, FALSE, 1, 3,
- "carry_query_flag", "Prompt before picking things up" },
-
- { &use_old_target, FALSE, 1, 4,
- "use_old_target", "Use old target by default" },
-
- { &always_pickup, FALSE, 1, 5,
- "always_pickup", "Pick things up by default" },
-
- { &always_repeat, TRUE, 1, 7,
- "always_repeat", "Repeat obvious commands" },
-
- { &ring_bell, FALSE, 1, 18,
- "ring_bell", "Audible bell (on errors, etc)" },
- /* Changed to default to FALSE -- it's so extremely annoying!!! -TY */
-
- /*** Disturbance ***/
-
- { &find_ignore_stairs, FALSE, 2, 0,
- "find_ignore_stairs", "Run past stairs" },
-
- { &find_ignore_doors, TRUE, 2, 1,
- "find_ignore_doors", "Run through open doors" },
-
- { &find_cut, FALSE, 2, 2,
- "find_cut", "Run past known corners" },
-
- { &find_examine, TRUE, 2, 3,
- "find_examine", "Run into potential corners" },
-
- { &disturb_move, FALSE, 2, 4,
- "disturb_move", "Disturb whenever any monster moves" },
-
- { &disturb_near, TRUE, 2, 5,
- "disturb_near", "Disturb whenever viewable monster moves" },
-
- { &disturb_panel, TRUE, 2, 6,
- "disturb_panel", "Disturb whenever map panel changes" },
-
- { &disturb_detect, TRUE, 2, 21,
- "disturb_detect", "Disturb whenever leaving trap-detected area" },
-
- { &disturb_state, TRUE, 2, 7,
- "disturb_state", "Disturb whenever player state changes" },
-
- { &disturb_minor, TRUE, 2, 8,
- "disturb_minor", "Disturb whenever boring things happen" },
-
- { &disturb_other, FALSE, 2, 9,
- "disturb_other", "Disturb whenever random things happen" },
-
- { &alert_hitpoint, FALSE, 2, 10,
- "alert_hitpoint", "Alert user to critical hitpoints" },
-
- { &alert_failure, FALSE, 2, 11,
- "alert_failure", "Alert user to various failures" },
-
- { &last_words, TRUE, 2, 12,
- "last_words", "Get last words when the character dies" },
-
- { &wear_confirm, TRUE, 2, 15,
- "confirm_wear", "Confirm to wear/wield known cursed items" },
-
- { &confirm_stairs, FALSE, 2, 16,
- "confirm_stairs", "Prompt before exiting a dungeon level" },
-
- { &disturb_pets, FALSE, 2, 17,
- "disturb_pets", "Disturb when visible pets move" },
-
- /*** Game-Play ***/
-
- { &auto_scum, TRUE, 3, 1,
- "auto_scum", "Auto-scum for good levels" },
-
- { &view_perma_grids, TRUE, 3, 6,
- "view_perma_grids", "Map remembers all perma-lit grids" },
-
- { &view_torch_grids, FALSE, 3, 7,
- "view_torch_grids", "Map remembers all torch-lit grids" },
-
- { &dungeon_align, TRUE, 3, 8,
- "dungeon_align", "Generate dungeons with aligned rooms" },
-
- { &dungeon_stair, TRUE, 3, 9,
- "dungeon_stair", "Generate dungeons with connected stairs" },
-
- { &flow_by_sound, FALSE, 3, 10,
- "flow_by_sound", "Monsters chase current location (v.slow)" },
-
- { &smart_learn, FALSE, 3, 14,
- "smart_learn", "Monsters learn from their mistakes" },
-
- { &small_levels, TRUE, 3, 17,
- "small_levels", "Allow unusually small dungeon levels" },
-
- { &empty_levels, TRUE, 3, 18,
- "empty_levels", "Allow empty 'arena' levels" },
-
- /*** Efficiency ***/
-
- { &view_reduce_lite, FALSE, 4, 0,
- "view_reduce_lite", "Reduce lite-radius when running" },
-
- { &avoid_abort, FALSE, 4, 2,
- "avoid_abort", "Avoid checking for user abort" },
-
- { &avoid_shimmer, FALSE, 4, 17,
- "avoid_shimmer", "Avoid extra shimmering (fast)" },
-
- { &avoid_other, FALSE, 4, 3,
- "avoid_other", "Avoid processing special colors (fast)" },
-
- { &flush_failure, TRUE, 4, 4,
- "flush_failure", "Flush input on various failures" },
-
- { &flush_disturb, FALSE, 4, 5,
- "flush_disturb", "Flush input whenever disturbed" },
-
- { &flush_command, FALSE, 4, 6,
- "flush_command", "Flush input before every command" },
-
- { &fresh_before, TRUE, 4, 7,
- "fresh_before", "Flush output before every command" },
-
- { &fresh_after, FALSE, 4, 8,
- "fresh_after", "Flush output after every command" },
-
- { &fresh_message, FALSE, 4, 9,
- "fresh_message", "Flush output after every message" },
-
- { &hilite_player, FALSE, 4, 11,
- "hilite_player", "Hilite the player with the cursor" },
-
- { &view_yellow_lite, FALSE, 4, 12,
- "view_yellow_lite", "Use special colors for torch-lit grids" },
-
- { &view_bright_lite, FALSE, 4, 13,
- "view_bright_lite", "Use special colors for 'viewable' grids" },
-
- { &view_granite_lite, FALSE, 4, 14,
- "view_granite_lite", "Use special colors for wall grids (slow)" },
-
- { &view_special_lite, FALSE, 4, 15,
- "view_special_lite", "Use special colors for floor grids (slow)" },
-
- { &center_player, FALSE, 4, 16,
- "center_player", "Center the view on the player (very slow)" },
-
- /*** ToME options ***/
-
- { &option_ingame_help, TRUE, 5, 1,
- "ingame_help", "Ingame contextual help" },
-
- { &auto_more, FALSE, 5, 4,
- "auto_more", "Automatically clear '-more-' prompts" },
-
- { &player_char_health, TRUE, 5, 6,
- "player_char_health", "Player char represent his/her health" },
-
- { &linear_stats, TRUE, 5, 7,
- "linear_stats", "Stats are represented in a linear way" },
-
- { &inventory_no_move, FALSE, 5, 8,
- "inventory_no_move", "In option windows, just omit the select char" },
-
-
- /*** Birth Options ***/
-
- { &preserve, TRUE, 6, 2,
- "preserve", "Preserve artifacts" },
-
- { &autoroll, TRUE, 6, 3,
- "autoroll", "Specify 'minimal' stats" },
-
- { &point_based, FALSE, 6, 17,
- "point_based", "Generate character using a point system" },
-
- { &ironman_rooms, FALSE, 6, 6,
- "ironman_rooms", "Always generate very unusual rooms" },
-
- { &joke_monsters, FALSE, 6, 14,
- "joke_monsters", "Allow use of some 'joke' monsters" },
-
- { &always_small_level, FALSE, 6, 16,
- "always_small_level", "Always make small levels" },
-
- { &fate_option, TRUE, 6, 18,
- "fate_option", "You can receive fates, good or bad" },
-
- { &no_selling, FALSE, 6, 20,
- "no_selling", "Items always sell for 0 gold" },
-
- /*** End of Table ***/
-
- { NULL, 0, 0, 0,
- NULL, NULL }
-};
-
-
-
/* Names used for random artifact name generation */
cptr artifact_names_list =
"adanedhel\n"
@@ -2505,16 +2169,16 @@ deity_type deity_info[MAX_GODS] =
/* as far as I know. */
tactic_info_type tactic_info[9] =
{
- /* hit dam ac stl dis sav */
- { -10, -10, + 15, + 3, + 15, + 14, "coward"}, /* 4-4 */
- { -8, -8, + 10, + 2, + 9, + 9, "meek"}, /* 4-3 */
- { -4, -4, + 5, + 1, + 5, + 5, "wary"}, /* 4-2 */
- { -2, -2, + 2, + 1, + 2, + 2, "careful"}, /* 4-1 */
- { 0, 0, 0, 0, 0, 0, "normal"}, /* 4+0 */
- { 2, 2, -2, -1, -2, -3, "confident"}, /* 4+1 */
- { 4, 4, -5, -2, -5, -7, "aggressive"}, /* 4+2 */
- { 6, 6, -10, -3, -11, -12, "furious"}, /* 4+3 */
- { 8, 12, -25, -5, -18, -18, "berserker"} /* 4+4 */
+ /* hit dam ac stl sav */
+ { -10, -10, +15, +3, +14, "coward" },
+ { -8, -8, +10, +2, +9, "meek" },
+ { -4, -4, +5, +1, +5, "wary" },
+ { -2, -2, +2, +1, +2, "careful" },
+ { 0, 0, 0, 0, 0, "normal" },
+ { 2, 2, -2, -1, -3, "confident" },
+ { 4, 4, -5, -2, -7, "aggressive" },
+ { 6, 6, -10, -3, -12, "furious" },
+ { 8, 12, -25, -5, -18, "berserker" }
};
/*
@@ -2597,52 +2261,44 @@ move_info_type move_info[9] =
*/
inscription_info_type inscription_info[MAX_INSCRIPTIONS] =
{
- { /* Nothing */
+ { /* Padding; 0 index is used to signify "no inscription" */
"",
0,
- TRUE,
0,
},
{ /* Light up the room(Adunaic) */
"ure nimir", /* sun shine */
INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK,
- FALSE,
30,
},
{ /* Darkness in room(Adunaic) */
"lomi gimli", /* night stars */
INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK,
- FALSE,
10,
},
{ /* Storm(Adunaic) */
"dulgi bawiba", /* black winds */
INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK,
- FALSE,
40,
},
{ /* Protection(Sindarin) */
"pedo mellon a minno", /* say friend and enter */
INSCRIP_EXEC_MONST_WALK,
- FALSE,
8,
},
{ /* Dwarves summoning(Khuzdul) */
"Baruk Khazad! Khazad aimenu!", /* Axes of the Dwarves, the Dwarves are upon you! */
INSCRIP_EXEC_ENGRAVE,
- FALSE,
100,
},
{ /* Open Chasm(Nandorin) */
"dunna hrassa", /* black precipice */
INSCRIP_EXEC_MONST_WALK,
- FALSE,
50,
},
{ /* Blast of Black Fire(Orcish) */
"burz ghash ronk", /* black fire pool */
INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK,
- FALSE,
60,
},
};
@@ -2676,128 +2332,103 @@ cptr sense_desc[] =
* Flags 4,
* ESP,
*/
-flags_group flags_groups[MAX_FLAG_GROUP] =
+std::vector<flags_group> const &flags_groups()
{
- {
- "Fire",
- TERM_L_RED,
- 1,
- TR1_SLAY_UNDEAD | TR1_BRAND_FIRE,
- TR2_RES_FIRE,
- TR3_SH_FIRE | TR3_LITE1 | TR3_IGNORE_FIRE,
- 0,
- 0,
- },
- {
- "Cold",
- TERM_WHITE,
- 1,
- TR1_SLAY_DRAGON | TR1_SLAY_DEMON | TR1_BRAND_COLD,
- TR2_RES_COLD | TR2_INVIS,
- TR3_SLOW_DIGEST | TR3_IGNORE_COLD,
- 0,
- 0,
- },
- {
- "Acid",
- TERM_GREEN,
- 3,
- TR1_SLAY_ANIMAL | TR1_IMPACT | TR1_TUNNEL | TR1_BRAND_ACID,
- TR2_RES_ACID,
- TR3_IGNORE_ACID,
- 0,
- 0,
- },
- {
- "Lightning",
- TERM_L_BLUE,
- 1,
- TR1_SLAY_EVIL | TR1_BRAND_ELEC,
- TR2_RES_ELEC,
- TR3_IGNORE_ELEC | TR3_SH_ELEC | TR3_TELEPORT,
- 0,
- 0,
- },
- {
- "Poison",
- TERM_L_GREEN,
- 2,
- TR1_CHR | TR1_VAMPIRIC | TR1_SLAY_ANIMAL | TR1_BRAND_POIS,
- TR2_SUST_CHR | TR2_RES_POIS,
- TR3_DRAIN_EXP,
- 0,
- ESP_TROLL | ESP_GIANT,
- },
- {
- "Air",
- TERM_BLUE,
- 5,
- TR1_WIS | TR1_STEALTH | TR1_INFRA | TR1_SPEED,
- TR2_RES_LITE | TR2_RES_DARK | TR2_RES_BLIND | TR2_SUST_WIS,
- TR3_FEATHER | TR3_SEE_INVIS | TR3_BLESSED,
- 0,
- ESP_GOOD,
- },
- {
- "Earth",
- TERM_L_UMBER,
- 5,
- TR1_STR | TR1_CON | TR1_TUNNEL | TR1_BLOWS | TR1_SLAY_TROLL | TR1_SLAY_GIANT | TR1_IMPACT,
- TR2_SUST_STR | TR2_SUST_CON | TR2_FREE_ACT | TR2_RES_FEAR | TR2_RES_SHARDS,
- TR3_REGEN,
- 0,
- ESP_TROLL | ESP_GIANT,
- },
- {
- "Mind",
- TERM_YELLOW,
- 7,
- TR1_INT | TR1_SEARCH,
- TR2_SUST_INT | TR2_RES_CONF | TR2_RES_FEAR,
- 0,
- 0,
- ESP_ORC | ESP_TROLL | ESP_GIANT | ESP_ANIMAL | ESP_UNIQUE | ESP_SPIDER | ESP_DEMON,
- },
- {
- "Shield",
- TERM_RED,
- 7,
- TR1_DEX,
- TR2_SUST_DEX | TR2_INVIS | TR2_REFLECT | TR2_HOLD_LIFE | TR2_RES_SOUND | TR2_RES_NEXUS,
- TR3_REGEN,
- 0,
- 0,
- },
- {
- "Chaos",
- TERM_VIOLET,
- 7,
- TR1_CHAOTIC | TR1_IMPACT,
- TR2_RES_CHAOS | TR2_RES_DISEN,
- TR3_REGEN,
- 0,
- ESP_ALL,
- },
- {
- "Magic",
- TERM_L_BLUE,
- 10,
- TR1_MANA | TR1_SPELL,
- TR2_RES_CHAOS | TR2_RES_DISEN,
- TR3_WRAITH,
- TR4_PRECOGNITION | TR4_FLY | TR4_CLONE,
- 0,
- },
- {
- "Antimagic",
- TERM_L_DARK,
- 10,
- TR1_VAMPIRIC | TR1_CHAOTIC | TR1_BLOWS | TR1_SPEED,
- TR2_LIFE | TR2_REFLECT | TR2_FREE_ACT | TR2_HOLD_LIFE,
- TR3_NO_MAGIC | TR3_NO_TELE | TR3_SEE_INVIS,
- TR4_ANTIMAGIC_50,
- 0,
- },
+ static auto *instance = new std::vector<flags_group> {
+ flags_group {
+ "Fire",
+ TERM_L_RED,
+ 1,
+ TR_SLAY_UNDEAD | TR_BRAND_FIRE | TR_RES_FIRE |
+ TR_SH_FIRE | TR_LITE1 | TR_IGNORE_FIRE,
+ },
+ flags_group {
+ "Cold",
+ TERM_WHITE,
+ 1,
+ TR_SLAY_DRAGON | TR_SLAY_DEMON | TR_BRAND_COLD | TR_RES_COLD |
+ TR_INVIS | TR_SLOW_DIGEST | TR_IGNORE_COLD,
+ },
+ flags_group {
+ "Acid",
+ TERM_GREEN,
+ 3,
+ TR_SLAY_ANIMAL | TR_IMPACT | TR_TUNNEL |
+ TR_BRAND_ACID | TR_RES_ACID | TR_IGNORE_ACID,
+ },
+ flags_group {
+ "Lightning",
+ TERM_L_BLUE,
+ 1,
+ TR_SLAY_EVIL | TR_BRAND_ELEC | TR_RES_ELEC |
+ TR_IGNORE_ELEC | TR_SH_ELEC | TR_TELEPORT,
+ },
+ flags_group {
+ "Poison",
+ TERM_L_GREEN,
+ 2,
+ TR_CHR | TR_VAMPIRIC | TR_SLAY_ANIMAL | TR_BRAND_POIS |
+ TR_SUST_CHR | TR_RES_POIS | TR_DRAIN_EXP |
+ ESP_TROLL | ESP_GIANT,
+ },
+ flags_group {
+ "Air",
+ TERM_BLUE,
+ 5,
+ TR_WIS | TR_STEALTH | TR_INFRA | TR_SPEED |
+ TR_RES_LITE | TR_RES_DARK | TR_RES_BLIND | TR_SUST_WIS |
+ TR_FEATHER | TR_SEE_INVIS | TR_BLESSED |
+ ESP_GOOD,
+ },
+ flags_group {
+ "Earth",
+ TERM_L_UMBER,
+ 5,
+ TR_STR | TR_CON | TR_TUNNEL | TR_BLOWS | TR_SLAY_TROLL |
+ TR_SLAY_GIANT | TR_IMPACT | TR_SUST_STR | TR_SUST_CON |
+ TR_FREE_ACT | TR_RES_FEAR | TR_RES_SHARDS | TR_REGEN |
+ ESP_TROLL | ESP_GIANT,
+ },
+ flags_group {
+ "Mind",
+ TERM_YELLOW,
+ 7,
+ TR_INT | TR_SUST_INT | TR_RES_CONF | TR_RES_FEAR |
+ ESP_ORC | ESP_TROLL | ESP_GIANT | ESP_ANIMAL | ESP_UNIQUE | ESP_SPIDER | ESP_DEMON,
+ },
+ flags_group {
+ "Shield",
+ TERM_RED,
+ 7,
+ TR_DEX | TR_SUST_DEX | TR_INVIS | TR_REFLECT |
+ TR_HOLD_LIFE | TR_RES_SOUND | TR_RES_NEXUS |
+ TR_REGEN,
+ },
+ flags_group {
+ "Chaos",
+ TERM_VIOLET,
+ 7,
+ TR_CHAOTIC | TR_IMPACT | TR_RES_CHAOS | TR_RES_DISEN | TR_REGEN |
+ ESP_ALL,
+ },
+ flags_group {
+ "Magic",
+ TERM_L_BLUE,
+ 10,
+ TR_MANA | TR_SPELL | TR_RES_CHAOS | TR_RES_DISEN | TR_WRAITH |
+ TR_PRECOGNITION | TR_FLY | TR_CLONE,
+ },
+ flags_group {
+ "Antimagic",
+ TERM_L_DARK,
+ 10,
+ TR_VAMPIRIC | TR_CHAOTIC | TR_BLOWS | TR_SPEED | TR_LIFE |
+ TR_REFLECT | TR_FREE_ACT | TR_HOLD_LIFE | TR_NO_MAGIC |
+ TR_NO_TELE | TR_SEE_INVIS | TR_ANTIMAGIC_50,
+ }
+ };
+
+ return *instance;
};
/* Powers */
@@ -3954,107 +3585,148 @@ quest_type quest[MAX_Q_IDX] =
/* List of powers for Symbiants/Powers */
-monster_power monster_powers[96] =
- {
- { RF4_SHRIEK, "Aggravate Monster", 1, FALSE },
- { RF4_MULTIPLY, "Multiply", 10, FALSE },
- { RF4_S_ANIMAL, "Summon Animal", 30, FALSE },
- { RF4_ROCKET, "Fire a Rocket", 40, TRUE },
- { RF4_ARROW_1, "Light Arrow", 1, FALSE },
- { RF4_ARROW_2, "Minor Arrow", 3, FALSE },
- { RF4_ARROW_3, "Major Arrow", 7, TRUE },
- { RF4_ARROW_4, "Great Arrow", 9, TRUE },
- { RF4_BR_ACID, "Breathe Acid", 10, FALSE },
- { RF4_BR_ELEC, "Breathe Lightning", 10, FALSE },
- { RF4_BR_FIRE, "Breathe Fire", 10, FALSE },
- { RF4_BR_COLD, "Breathe Cold", 10, FALSE },
- { RF4_BR_POIS, "Breathe Poison", 15, TRUE },
- { RF4_BR_NETH, "Breathe Nether", 30, TRUE },
- { RF4_BR_LITE, "Breathe Light", 20, TRUE },
- { RF4_BR_DARK, "Breathe Dark", 20, TRUE },
- { RF4_BR_CONF, "Breathe Confusion", 15, TRUE },
- { RF4_BR_SOUN, "Breathe Sound", 30, TRUE },
- { RF4_BR_CHAO, "Breathe Chaos", 30, TRUE },
- { RF4_BR_DISE, "Breathe Disenchantment", 30, TRUE },
- { RF4_BR_NEXU, "Breathe Nexus", 30, TRUE },
- { RF4_BR_TIME, "Breathe Time", 30, TRUE },
- { RF4_BR_INER, "Breathe Inertia", 30, TRUE },
- { RF4_BR_GRAV, "Breathe Gravity", 30, TRUE },
- { RF4_BR_SHAR, "Breathe Shards", 30, TRUE },
- { RF4_BR_PLAS, "Breathe Plasma", 30, TRUE },
- { RF4_BR_WALL, "Breathe Force", 30, TRUE },
- { RF4_BR_MANA, "Breathe Mana", 40, TRUE },
- { RF4_BA_NUKE, "Nuke Ball", 30, TRUE },
- { RF4_BR_NUKE, "Breathe Nuke", 40, TRUE },
- { RF4_BA_CHAO, "Chaos Ball", 30, TRUE },
- { RF4_BR_DISI, "Breathe Disintegration", 40, TRUE },
+monster_power monster_powers[] =
+ {
+ { SF_SHRIEK_IDX, "Aggravate Monster", 1, FALSE },
+ { SF_MULTIPLY_IDX, "Multiply", 10, FALSE },
+ { SF_S_ANIMAL_IDX, "Summon Animal", 30, FALSE },
+ { SF_ROCKET_IDX, "Fire a Rocket", 40, TRUE },
+ { SF_ARROW_1_IDX, "Light Arrow", 1, FALSE },
+ { SF_ARROW_2_IDX, "Minor Arrow", 3, FALSE },
+ { SF_ARROW_3_IDX, "Major Arrow", 7, TRUE },
+ { SF_ARROW_4_IDX, "Great Arrow", 9, TRUE },
+ { SF_BR_ACID_IDX, "Breathe Acid", 10, FALSE },
+ { SF_BR_ELEC_IDX, "Breathe Lightning", 10, FALSE },
+ { SF_BR_FIRE_IDX, "Breathe Fire", 10, FALSE },
+ { SF_BR_COLD_IDX, "Breathe Cold", 10, FALSE },
+ { SF_BR_POIS_IDX, "Breathe Poison", 15, TRUE },
+ { SF_BR_NETH_IDX, "Breathe Nether", 30, TRUE },
+ { SF_BR_LITE_IDX, "Breathe Light", 20, TRUE },
+ { SF_BR_DARK_IDX, "Breathe Dark", 20, TRUE },
+ { SF_BR_CONF_IDX, "Breathe Confusion", 15, TRUE },
+ { SF_BR_SOUN_IDX, "Breathe Sound", 30, TRUE },
+ { SF_BR_CHAO_IDX, "Breathe Chaos", 30, TRUE },
+ { SF_BR_DISE_IDX, "Breathe Disenchantment", 30, TRUE },
+ { SF_BR_NEXU_IDX, "Breathe Nexus", 30, TRUE },
+ { SF_BR_TIME_IDX, "Breathe Time", 30, TRUE },
+ { SF_BR_INER_IDX, "Breathe Inertia", 30, TRUE },
+ { SF_BR_GRAV_IDX, "Breathe Gravity", 30, TRUE },
+ { SF_BR_SHAR_IDX, "Breathe Shards", 30, TRUE },
+ { SF_BR_PLAS_IDX, "Breathe Plasma", 30, TRUE },
+ { SF_BR_WALL_IDX, "Breathe Force", 30, TRUE },
+ { SF_BR_MANA_IDX, "Breathe Mana", 40, TRUE },
+ { SF_BA_NUKE_IDX, "Nuke Ball", 30, TRUE },
+ { SF_BR_NUKE_IDX, "Breathe Nuke", 40, TRUE },
+ { SF_BA_CHAO_IDX, "Chaos Ball", 30, TRUE },
+ { SF_BR_DISI_IDX, "Breathe Disintegration", 40, TRUE },
+ { SF_BA_ACID_IDX, "Acid Ball", 8, FALSE },
+ { SF_BA_ELEC_IDX, "Lightning Ball", 8, FALSE },
+ { SF_BA_FIRE_IDX, "Fire Ball", 8, FALSE },
+ { SF_BA_COLD_IDX, "Cold Ball", 8, FALSE },
+ { SF_BA_POIS_IDX, "Poison Ball", 20, TRUE },
+ { SF_BA_NETH_IDX, "Nether Ball", 20, TRUE },
+ { SF_BA_WATE_IDX, "Water Ball", 20, TRUE },
+ { SF_BA_MANA_IDX, "Mana Ball", 50, TRUE },
+ { SF_BA_DARK_IDX, "Darkness Ball", 20, TRUE },
+ { SF_CAUSE_1_IDX, "Cause Light Wounds", 20, FALSE },
+ { SF_CAUSE_2_IDX, "Cause Medium Wounds", 30, FALSE },
+ { SF_CAUSE_3_IDX, "Cause Critical Wounds", 35, TRUE },
+ { SF_CAUSE_4_IDX, "Cause Mortal Wounds", 45, TRUE },
+ { SF_BO_ACID_IDX, "Acid Bolt", 5, FALSE },
+ { SF_BO_ELEC_IDX, "Lightning Bolt", 5, FALSE },
+ { SF_BO_FIRE_IDX, "Fire Bolt", 5, FALSE },
+ { SF_BO_COLD_IDX, "Cold Bolt", 5, FALSE },
+ { SF_BO_POIS_IDX, "Poison Bolt", 10, TRUE },
+ { SF_BO_NETH_IDX, "Nether Bolt", 15, TRUE },
+ { SF_BO_WATE_IDX, "Water Bolt", 20, TRUE },
+ { SF_BO_MANA_IDX, "Mana Bolt", 25, TRUE },
+ { SF_BO_PLAS_IDX, "Plasma Bolt", 20, TRUE },
+ { SF_BO_ICEE_IDX, "Ice Bolt", 20, TRUE },
+ { SF_MISSILE_IDX, "Magic Missile", 1, FALSE },
+ { SF_SCARE_IDX, "Scare", 4, FALSE },
+ { SF_BLIND_IDX, "Blindness", 6, FALSE },
+ { SF_CONF_IDX, "Confusion", 7, FALSE },
+ { SF_SLOW_IDX, "Slowness", 10, FALSE },
+ { SF_HOLD_IDX, "Paralyse", 10, FALSE },
+ { SF_HASTE_IDX, "Haste Self", 50, FALSE },
+ { SF_HAND_DOOM_IDX, "Hand of Doom", 30, TRUE },
+ { SF_HEAL_IDX, "Healing", 60, FALSE },
+ { SF_S_ANIMALS_IDX, "Summon Animals", 60, TRUE },
+ { SF_BLINK_IDX, "Phase Door", 2, FALSE },
+ { SF_TPORT_IDX, "Teleport", 10, FALSE },
+ { SF_TELE_TO_IDX, "Teleport To", 20, TRUE },
+ { SF_TELE_AWAY_IDX, "Teleport Away", 20, FALSE },
+ { SF_TELE_LEVEL_IDX, "Teleport Level", 20, TRUE },
+ { SF_DARKNESS_IDX, "Darkness", 3, FALSE },
+ { SF_RAISE_DEAD_IDX, "Raise the Dead", 400, TRUE },
+ { SF_S_THUNDERLORD_IDX, "Summon Thunderlords", 90, TRUE },
+ { SF_S_KIN_IDX, "Summon Kin", 80, FALSE },
+ { SF_S_HI_DEMON_IDX, "Summon Greater Demons", 90, TRUE },
+ { SF_S_MONSTER_IDX, "Summon Monster", 50, FALSE },
+ { SF_S_MONSTERS_IDX, "Summon Monsters", 60, TRUE },
+ { SF_S_ANT_IDX, "Summon Ants", 30, FALSE },
+ { SF_S_SPIDER_IDX, "Summon Spider", 30, FALSE },
+ { SF_S_HOUND_IDX, "Summon Hound", 50, TRUE },
+ { SF_S_HYDRA_IDX, "Summon Hydra", 40, TRUE },
+ { SF_S_ANGEL_IDX, "Summon Angel", 60, TRUE },
+ { SF_S_DEMON_IDX, "Summon Demon", 60, TRUE },
+ { SF_S_UNDEAD_IDX, "Summon Undead", 70, TRUE },
+ { SF_S_DRAGON_IDX, "Summon Dragon", 70, TRUE },
+ { SF_S_HI_UNDEAD_IDX, "Summon High Undead", 90, TRUE },
+ { SF_S_HI_DRAGON_IDX, "Summon High Dragon", 90, TRUE },
+ { SF_S_WRAITH_IDX, "Summon Wraith", 90, TRUE },
+ };
- { RF5_BA_ACID, "Acid Ball", 8, FALSE },
- { RF5_BA_ELEC, "Lightning Ball", 8, FALSE },
- { RF5_BA_FIRE, "Fire Ball", 8, FALSE },
- { RF5_BA_COLD, "Cold Ball", 8, FALSE },
- { RF5_BA_POIS, "Poison Ball", 20, TRUE },
- { RF5_BA_NETH, "Nether Ball", 20, TRUE },
- { RF5_BA_WATE, "Water Ball", 20, TRUE },
- { RF5_BA_MANA, "Mana Ball", 50, TRUE },
- { RF5_BA_DARK, "Darkness Ball", 20, TRUE },
- { 0, "(none)", 0, FALSE },
- { 0, "(none)", 0, FALSE },
- { 0, "(none)", 0, FALSE },
- { RF5_CAUSE_1, "Cause Light Wounds", 20, FALSE },
- { RF5_CAUSE_2, "Cause Medium Wounds", 30, FALSE },
- { RF5_CAUSE_3, "Cause Critical Wounds", 35, TRUE },
- { RF5_CAUSE_4, "Cause Mortal Wounds", 45, TRUE },
- { RF5_BO_ACID, "Acid Bolt", 5, FALSE },
- { RF5_BO_ELEC, "Lightning Bolt", 5, FALSE },
- { RF5_BO_FIRE, "Fire Bolt", 5, FALSE },
- { RF5_BO_COLD, "Cold Bolt", 5, FALSE },
- { RF5_BO_POIS, "Poison Bolt", 10, TRUE },
- { RF5_BO_NETH, "Nether Bolt", 15, TRUE },
- { RF5_BO_WATE, "Water Bolt", 20, TRUE },
- { RF5_BO_MANA, "Mana Bolt", 25, TRUE },
- { RF5_BO_PLAS, "Plasma Bolt", 20, TRUE },
- { RF5_BO_ICEE, "Ice Bolt", 20, TRUE },
- { RF5_MISSILE, "Magic Missile", 1, FALSE },
- { RF5_SCARE, "Scare", 4, FALSE },
- { RF5_BLIND, "Blindness", 6, FALSE },
- { RF5_CONF, "Confusion", 7, FALSE },
- { RF5_SLOW, "Slowness", 10, FALSE },
- { RF5_HOLD, "Paralyse", 10, FALSE },
- { RF6_HASTE, "Haste Self", 50, FALSE },
- { RF6_HAND_DOOM, "Hand of Doom", 30, TRUE },
- { RF6_HEAL, "Healing", 60, FALSE },
- { RF6_S_ANIMALS, "Summon Animals", 60, TRUE },
- { RF6_BLINK, "Phase Door", 2, FALSE },
- { RF6_TPORT, "Teleport", 10, FALSE },
- { RF6_TELE_TO, "Teleport To", 20, TRUE },
- { RF6_TELE_AWAY, "Teleport Away", 20, FALSE },
- { RF6_TELE_LEVEL, "Teleport Level", 20, TRUE },
- { RF6_DARKNESS, "Darkness", 3, FALSE },
- { RF6_TRAPS, "Create Traps", 10, TRUE },
- { 0, "(none)", 0, FALSE },
- { RF6_RAISE_DEAD, "Raise the Dead", 400, TRUE },
- { 0, "(none)", 0, FALSE },
- { 0, "(none)", 0, FALSE },
- { RF6_S_THUNDERLORD, "Summon Thunderlords", 90, TRUE },
- { RF6_S_KIN, "Summon Kin", 80, FALSE },
- { RF6_S_HI_DEMON, "Summon Greater Demons", 90, TRUE },
- { RF6_S_MONSTER, "Summon Monster", 50, FALSE },
- { RF6_S_MONSTERS, "Summon Monsters", 60, TRUE },
- { RF6_S_ANT, "Summon Ants", 30, FALSE },
- { RF6_S_SPIDER, "Summon Spider", 30, FALSE },
- { RF6_S_HOUND, "Summon Hound", 50, TRUE },
- { RF6_S_HYDRA, "Summon Hydra", 40, TRUE },
- { RF6_S_ANGEL, "Summon Angel", 60, TRUE },
- { RF6_S_DEMON, "Summon Demon", 60, TRUE },
- { RF6_S_UNDEAD, "Summon Undead", 70, TRUE },
- { RF6_S_DRAGON, "Summon Dragon", 70, TRUE },
- { RF6_S_HI_UNDEAD, "Summon High Undead", 90, TRUE },
- { RF6_S_HI_DRAGON, "Summon High Dragon", 90, TRUE },
- { RF6_S_WRAITH, "Summon Wraith", 90, TRUE },
- { 0, "(none)", 0, FALSE },
- };
+/*
+ * A list of tvals and their textual names
+ */
+tval_desc tvals[] =
+{
+ { TV_SWORD, "Sword" },
+ { TV_POLEARM, "Polearm" },
+ { TV_HAFTED, "Hafted Weapon" },
+ { TV_AXE, "Axe" },
+ { TV_BOW, "Bow" },
+ { TV_BOOMERANG, "Boomerang" },
+ { TV_ARROW, "Arrows" },
+ { TV_BOLT, "Bolts" },
+ { TV_SHOT, "Shots" },
+ { TV_SHIELD, "Shield" },
+ { TV_CROWN, "Crown" },
+ { TV_HELM, "Helm" },
+ { TV_GLOVES, "Gloves" },
+ { TV_BOOTS, "Boots" },
+ { TV_CLOAK, "Cloak" },
+ { TV_DRAG_ARMOR, "Dragon Scale Mail" },
+ { TV_HARD_ARMOR, "Hard Armor" },
+ { TV_SOFT_ARMOR, "Soft Armor" },
+ { TV_RING, "Ring" },
+ { TV_AMULET, "Amulet" },
+ { TV_LITE, "Lite" },
+ { TV_POTION, "Potion" },
+ { TV_POTION2, "Potion" },
+ { TV_SCROLL, "Scroll" },
+ { TV_WAND, "Wand" },
+ { TV_STAFF, "Staff" },
+ { TV_ROD_MAIN, "Rod" },
+ { TV_ROD, "Rod Tip" },
+ { TV_BOOK, "Schools Spellbook", },
+ { TV_SYMBIOTIC_BOOK, "Symbiotic Spellbook", },
+ { TV_DRUID_BOOK, "Elemental Stone" },
+ { TV_MUSIC_BOOK, "Music Book" },
+ { TV_DAEMON_BOOK, "Daemon Book" },
+ { TV_SPIKE, "Spikes" },
+ { TV_DIGGING, "Digger" },
+ { TV_CHEST, "Chest" },
+ { TV_FOOD, "Food" },
+ { TV_FLASK, "Flask" },
+ { TV_MSTAFF, "Mage Staff" },
+ { TV_PARCHMENT, "Parchment" },
+ { TV_INSTRUMENT, "Musical Instrument" },
+ { TV_JUNK, "Junk" },
+ { 0, NULL }
+};
/* Tval descriptions */
tval_desc tval_descs[] =
@@ -4156,11 +3828,6 @@ tval_desc tval_descs[] =
"arcane magics."
},
{
- TV_TRAPKIT,
- "Trapping kits are used with the trapping ability to set "
- "deadly monster traps."
- },
- {
TV_STAFF,
"Staves are objects imbued with mystical powers."
},
@@ -4217,14 +3884,6 @@ tval_desc tval_descs[] =
"they can be activated for great or strange effects..."
},
{
- TV_RUNE1,
- "Runes are used with the Runecraft skill to create brand new spells."
- },
- {
- TV_RUNE2,
- "Runes are used with the Runecraft skill to create brand new spells."
- },
- {
TV_JUNK,
"Junk is usually worthless, though experienced archers can "
"create ammo with them."
@@ -4390,10 +4049,8 @@ gf_name_type gf_names[] =
{ GF_GRAVITY, "gravity" },
{ GF_KILL_WALL, "wall destruction" },
{ GF_KILL_DOOR, "door destruction" },
- { GF_KILL_TRAP, "trap destruction" },
{ GF_MAKE_WALL, "wall creation" },
{ GF_MAKE_DOOR, "door creation" },
- { GF_MAKE_TRAP, "trap creation" },
{ GF_OLD_CLONE, "clone" },
{ GF_OLD_POLY, "polymorph" },
{ GF_OLD_HEAL, "healing" },
@@ -4432,7 +4089,6 @@ gf_name_type gf_names[] =
{ GF_JAM_DOOR, "door jamming" },
{ GF_DOMINATION, "domination" },
{ GF_DISP_GOOD, "dispel good" },
- { GF_IDENTIFY, "identification" },
{ GF_RAISE, "raise dead" },
{ GF_STAR_IDENTIFY, "*identification*" },
{ GF_DESTRUCTION, "destruction" },
@@ -4470,8 +4126,6 @@ module_type modules[MAX_MODULES] =
},
/* Randarts: */
{ 30, 20, 20 },
- /* Max player level: */
- 50,
/* Skills: */
{ 6, 4, },
/* Intro function */
@@ -4492,8 +4146,6 @@ module_type modules[MAX_MODULES] =
},
/* Randarts: */
{ 30, 30, 30 },
- /* Max player level: */
- 50,
/* Skill overage: */
{ 6, 5, },
/* Intro function */
diff --git a/src/tables.hpp b/src/tables.hpp
index 4a3e33d6..613dbddb 100644
--- a/src/tables.hpp
+++ b/src/tables.hpp
@@ -15,13 +15,14 @@
#include "move_info_type.hpp"
#include "option_type.hpp"
#include "player_defs.hpp"
-#include "player_sex.hpp"
#include "power_type.hpp"
#include "powers.hpp"
#include "quest_type.hpp"
#include "tactic_info_type.hpp"
#include "tval_desc.hpp"
+#include <vector>
+
extern s16b ddd[9];
extern s16b ddx[10];
extern s16b ddy[10];
@@ -32,8 +33,6 @@ extern byte adj_mag_fail[];
extern byte adj_mag_stat[];
extern byte adj_chr_gold[];
extern byte adj_wis_sav[];
-extern byte adj_dex_dis[];
-extern byte adj_int_dis[];
extern byte adj_dex_ta[];
extern byte adj_str_td[];
extern byte adj_dex_th[];
@@ -49,12 +48,10 @@ extern byte adj_con_mhp[];
extern byte blows_table[12][12];
extern byte extract_energy[300];
extern s32b player_exp[PY_MAX_LEVEL];
-extern player_sex sex_info[MAX_SEXES];
extern cptr color_names[16];
extern cptr stat_names[6];
extern cptr stat_names_reduced[6];
extern cptr window_flag_desc[32];
-extern option_type option_info[];
extern martial_arts bear_blows[MAX_BEAR];
extern martial_arts ma_blows[MAX_MA];
extern magic_power mindcraft_powers[MAX_MINDCRAFT_POWERS];
@@ -66,10 +63,11 @@ extern tactic_info_type tactic_info[9];
extern activation activation_info[MAX_T_ACT];
extern inscription_info_type inscription_info[MAX_INSCRIPTIONS];
extern cptr sense_desc[];
-extern flags_group flags_groups[MAX_FLAG_GROUP];
+std::vector<flags_group> const &flags_groups();
extern power_type powers_type[POWER_MAX];
extern cptr artifact_names_list;
-extern monster_power monster_powers[96];
+extern monster_power monster_powers[MONSTER_POWERS_MAX];
+extern tval_desc tvals[];
extern tval_desc tval_descs[];
extern between_exit between_exits[MAX_BETWEEN_EXITS];
extern int month_day[9];
diff --git a/src/tactic_info_type.hpp b/src/tactic_info_type.hpp
index da94767d..4cb330f4 100644
--- a/src/tactic_info_type.hpp
+++ b/src/tactic_info_type.hpp
@@ -11,7 +11,6 @@ struct tactic_info_type
s16b to_dam;
s16b to_ac;
s16b to_stealth;
- s16b to_disarm;
s16b to_saving;
cptr name;
};
diff --git a/src/timer_type.hpp b/src/timer_type.hpp
index 0ce6b095..d682b3bd 100644
--- a/src/timer_type.hpp
+++ b/src/timer_type.hpp
@@ -2,17 +2,80 @@
#include "h-basic.h"
+#include <functional>
+
/*
* Timer descriptor and runtime data.
*/
struct timer_type
{
- timer_type *next; /* The next timer in the list */
+private:
+ std::function<void ()> m_callback;
+
+public:
+ //
+ // XXX Currently need public access for loading and saving.
+ //
+ bool m_enabled;
+ s32b m_delay = 0;
+ s32b m_countdown = 0;
+
+public:
+ /**
+ * Create a new timer
+ */
+ timer_type(std::function<void()> callback, s32b delay)
+ : m_callback(callback)
+ , m_enabled(false)
+ , m_delay(delay)
+ , m_countdown(delay)
+ {
+ }
+
+ timer_type(timer_type const &other) = delete;
+ timer_type &operator =(timer_type const &other) = delete;
+
+ /**
+ * Enable the timer.
+ */
+ void enable()
+ {
+ m_enabled = true;
+ }
+
+ /**
+ * Disable the timer.
+ */
+ void disable()
+ {
+ m_enabled = false;
+ }
+
+ /**
+ * Change delay and reset.
+ */
+ void set_delay_and_reset(s32b delay)
+ {
+ m_delay = delay;
+ m_countdown = delay;
+ }
- bool_ enabled; /* Is it currently counting? */
+ /**
+ * Count down.
+ */
+ void count_down()
+ {
+ if (!m_enabled)
+ {
+ return;
+ }
- s32b delay; /* Delay between activations */
- s32b countdown; /* The current number of turns passed, when it reaches delay it fires */
+ m_countdown--;
+ if (m_countdown <= 0)
+ {
+ m_countdown = m_delay;
+ m_callback();
+ }
+ }
- void (*callback)(); /* The C function to call upon firing */
};
diff --git a/src/town_type.hpp b/src/town_type.hpp
index f8458c60..0b903138 100644
--- a/src/town_type.hpp
+++ b/src/town_type.hpp
@@ -1,21 +1,25 @@
#pragma once
#include "h-basic.h"
+#include "seed.hpp"
#include "store_type_fwd.hpp"
+#include <vector>
+
/**
* Town descriptor.
*/
struct town_type
{
- cptr name;
- u32b seed; /* Seed for RNG */
- store_type *store; /* The stores [max_st_idx] */
- byte numstores;
+ cptr name = nullptr;
+
+ seed_t seed = seed_t::system(); /* Seed for RNG */
+
+ std::vector<store_type> store; /* The stores [max_st_idx] */
+
+ byte flags = 0; /* Town flags */
- byte flags; /* Town flags */
- /* Left this for the sake of compatibility */
- bool_ stocked; /* Is the town actualy stocked ? */
+ bool_ stocked = FALSE; /* Is the town actualy stocked ? */
- bool_ destroyed; /* Is the town destroyed? */
+ bool_ destroyed = FALSE; /* Is the town destroyed? */
};
diff --git a/src/trap_type.hpp b/src/trap_type.hpp
deleted file mode 100644
index d82c925b..00000000
--- a/src/trap_type.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-
-/**
- * Trap descriptor.
- */
-struct trap_type
-{
- s16b probability; /* probability of existence */
- s16b another; /* does this trap easily combine */
- s16b p1valinc; /* how much does this trap attribute to p1val */
- byte difficulty; /* how difficult to disarm */
- byte minlevel; /* what is the minimum level on which the traps should be */
- byte color; /* what is the color on screen */
- u32b flags; /* where can these traps go - and perhaps other flags */
- bool_ ident; /* do we know the name */
- s16b known; /* how well is this trap known */
- const char *name; /* normal name like weakness */
- s16b dd, ds; /* base damage */
- char *text; /* longer description once you've met this trap */
- byte g_attr; /* Overlay graphic attribute */
- char g_char; /* Overlay graphic character */
-};
diff --git a/src/trap_type_fwd.hpp b/src/trap_type_fwd.hpp
deleted file mode 100644
index 480edfef..00000000
--- a/src/trap_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct trap_type;
diff --git a/src/traps.cc b/src/traps.cc
deleted file mode 100644
index 99428cf9..00000000
--- a/src/traps.cc
+++ /dev/null
@@ -1,3174 +0,0 @@
-/* the below copyright probably still applies, but it is heavily changed
- * copied, adapted & re-engineered by JK.
- * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
- *
- * This software may be copied and distributed for educational, research, and
- * not for profit purposes provided that this copyright and statement are
- * included in all such copies.
- */
-
-#include "traps.hpp"
-
-#include "artifact_type.hpp"
-#include "cave.hpp"
-#include "cave_type.hpp"
-#include "cmd1.hpp"
-#include "cmd2.hpp"
-#include "dungeon_info_type.hpp"
-#include "feature_type.hpp"
-#include "files.hpp"
-#include "gods.hpp"
-#include "monster2.hpp"
-#include "monster_race.hpp"
-#include "monster_type.hpp"
-#include "object1.hpp"
-#include "object2.hpp"
-#include "object_kind.hpp"
-#include "player_race.hpp"
-#include "player_race_mod.hpp"
-#include "player_spec.hpp"
-#include "player_type.hpp"
-#include "spells1.hpp"
-#include "spells2.hpp"
-#include "stats.hpp"
-#include "tables.hpp"
-#include "trap_type.hpp"
-#include "util.hpp"
-#include "variable.hpp"
-#include "xtra1.hpp"
-#include "xtra2.hpp"
-#include "z-rand.hpp"
-
-bool_ do_player_trap_call_out(void)
-{
- s16b i, sn, cx, cy;
- s16b h_index = 0;
- s16b h_level = 0;
- monster_type *m_ptr;
- char m_name[80];
- bool_ ident = FALSE;
-
- for (i = 1; i < m_max; i++)
- {
- m_ptr = &m_list[i];
-
- /* Paranoia -- Skip dead monsters */
- if (!m_ptr->r_idx) continue;
-
- if (m_ptr->level >= h_level)
- {
- h_level = m_ptr->level;
- h_index = i;
- }
- }
-
- /* if the level is empty of monsters, h_index will be 0 */
- if (!h_index) return (FALSE);
-
- m_ptr = &m_list[h_index];
-
- sn = 0;
- for (i = 0; i < 8; i++)
- {
- cx = p_ptr->px + ddx[i];
- cy = p_ptr->py + ddy[i];
-
- /* Skip non-empty grids */
- if (!cave_valid_bold(cy, cx)) continue;
- if (cave[cy][cx].feat == FEAT_GLYPH) continue;
- if ((cx == p_ptr->px) && (cy == p_ptr->py)) continue;
- sn++;
-
- /* Randomize choice */
- if (rand_int(sn) > 0) continue;
- cave[cy][cx].m_idx = h_index;
- cave[m_ptr->fy][m_ptr->fx].m_idx = 0;
- m_ptr->fx = cx;
- m_ptr->fy = cy;
-
- /* we do not change the sublevel! */
- ident = TRUE;
- update_mon(h_index, TRUE);
- monster_desc(m_name, m_ptr, 0x08);
- msg_format("You hear a rapid-shifting wail, and %s appears!", m_name);
- break;
- }
-
- return (ident);
-}
-
-static bool_ do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x)
-{
- bool_ ident = FALSE;
- char o_name[80];
-
- s16b o_idx = 0;
- object_type *o_ptr;
- cave_type *c_ptr;
-
- s16b x1;
- s16b y1;
-
- if (i_ptr == NULL) return (FALSE);
-
- if (i_ptr->name1 == ART_POWER) return (FALSE);
-
- while (o_idx == 0)
- {
- x1 = rand_int(cur_wid);
- y1 = rand_int(cur_hgt);
-
- /* Obtain grid */
- c_ptr = &cave[y1][x1];
-
- /* Require floor space (or shallow terrain) -KMW- */
- if (!(f_info[c_ptr->feat].flags1 & FF1_FLOOR)) continue;
-
- o_idx = drop_near(i_ptr, 0, y1, x1);
- }
-
- o_ptr = &o_list[o_idx];
-
- x1 = o_ptr->ix;
- y1 = o_ptr->iy;
-
- if (!p_ptr->blind)
- {
- note_spot(y, x);
- lite_spot(y, x);
- ident = TRUE;
- object_desc(o_name, i_ptr, FALSE, 0);
- if (player_has_los_bold(y1, x1))
- {
- lite_spot(y1, x1);
- msg_format("The %s suddenly stands elsewhere.", o_name);
-
- }
- else
- {
- msg_format("You suddenly don't see the %s any more!", o_name);
- }
- }
- else
- {
- msg_print("You hear something move.");
- }
- return (ident);
-}
-
-/*
- * this handles a trap that places walls around the player
- */
-static bool_ player_handle_trap_of_walls(void)
-{
- bool_ ident;
-
- s16b dx, dy, cx, cy;
- s16b sx = 0, sy = 0, sn, i;
- cave_type *cv_ptr;
- bool_ map[5][5] =
- {
- {FALSE, FALSE, FALSE, FALSE, FALSE},
- {FALSE, FALSE, FALSE, FALSE, FALSE},
- {FALSE, FALSE, FALSE, FALSE, FALSE},
- {FALSE, FALSE, FALSE, FALSE, FALSE},
- {FALSE, FALSE, FALSE, FALSE, FALSE}
- };
-
- for (dy = -2; dy <= 2; dy++)
- for (dx = -2; dx <= 2; dx++)
- {
- /* Extract the location */
- cx = p_ptr->px + dx;
- cy = p_ptr->py + dy;
-
- if (!in_bounds(cy, cx)) continue;
-
- cv_ptr = &cave[cy][cx];
-
- if (cv_ptr->m_idx) continue;
-
- /* Lose room and vault */
- cv_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY);
- /* Lose light and knowledge */
- cv_ptr->info &= ~(CAVE_GLOW | CAVE_MARK);
-
- /* Skip the center */
- if (!dx && !dy) continue;
-
- /* test for dungeon level */
- if (randint(100) > 10 + max_dlv[dungeon_type]) continue;
-
- /* Damage this grid */
- map[2 + dx][2 + dy] = TRUE;
- }
-
- for (dy = -2; dy <= 2; dy++)
- for (dx = -2; dx <= 2; dx++)
- {
- /* Extract the location */
- cx = p_ptr->px + dx;
- cy = p_ptr->py + dy;
-
- /* Skip unaffected grids */
- if (!map[2 + dx][2 + dy]) continue;
-
- cv_ptr = &cave[cy][cx];
-
- if (cv_ptr->m_idx)
- {
- monster_type *m_ptr = &m_list[cv_ptr->m_idx];
- auto const r_ptr = m_ptr->race();
-
- /* Most monsters cannot co-exist with rock */
- if ((!(r_ptr->flags2 & RF2_KILL_WALL)) &&
- (!(r_ptr->flags2 & RF2_PASS_WALL)))
- {
- char m_name[80];
-
- /* Assume not safe */
- sn = 0;
-
- /* Monster can move to escape the wall */
- if (!(r_ptr->flags1 & RF1_NEVER_MOVE))
- {
- /* Look for safety */
- for (i = 0; i < 8; i++)
- {
- /* Access the grid */
- cy = p_ptr->py + ddy[i];
- cx = p_ptr->px + ddx[i];
-
- /* Skip non-empty grids */
- if (!cave_clean_bold(cy, cx)) continue;
-
- /* Hack -- no safety on glyph of warding */
- if (cave[cy][cx].feat == FEAT_GLYPH) continue;
-
- /* Important -- Skip "quake" grids */
- if (map[2 + (cx - p_ptr->px)][2 + (cy - p_ptr->py)]) continue;
-
- /* Count "safe" grids */
- sn++;
-
- /* Randomize choice */
- if (rand_int(sn) > 0) continue;
-
- /* Save the safe grid */
- sx = cx;
- sy = cy;
-
- ident = TRUE;
-
- break; /* discontinue for loop - safe grid found */
- }
- }
-
- /* Describe the monster */
- monster_desc(m_name, m_ptr, 0);
-
- /* Scream in pain */
- msg_format("%^s wails out in pain!", m_name);
-
- /* Monster is certainly awake */
- m_ptr->csleep = 0;
-
- /* Apply damage directly */
- m_ptr->hp -= (sn ? damroll(4, 8) : 200);
-
- /* Delete (not kill) "dead" monsters */
- if (m_ptr->hp < 0)
- {
- /* Message */
- msg_format("%^s is entombed in the rock!", m_name);
-
- /* Delete the monster */
- delete_monster_idx(cave[cy][cx].m_idx);
-
- /* No longer safe */
- sn = 0;
- }
-
- /* Hack -- Escape from the rock */
- if (sn)
- {
- s16b m_idx = cave[cy][cx].m_idx;
-
- /* Update the new location */
- cave[sy][sx].m_idx = m_idx;
-
- /* Update the old location */
- cave[cy][cx].m_idx = 0;
-
- /* Move the monster */
- m_ptr->fy = sy;
- m_ptr->fx = sx;
-
- /* do not change fz */
- /* don't make rock on that square! */
- if ((sx >= (p_ptr->px - 2)) && (sx <= (p_ptr->px + 2)) &&
- (sy >= (p_ptr->py - 2)) && (sy <= (p_ptr->py + 2)))
- {
- map[2 + (sx - p_ptr->px)][2 + (sy - p_ptr->py)] = FALSE;
- }
-
- /* Update the monster (new location) */
- update_mon(m_idx, TRUE);
-
- /* Redraw the old grid */
- lite_spot(cy, cx);
-
- /* Redraw the new grid */
- lite_spot(sy, sx);
- } /* if sn */
- } /* if monster can co-exist with rock */
- } /* if monster on square */
- }
-
- /* Examine the quaked region */
- for (dy = -2; dy <= 2; dy++)
- for (dx = -2; dx <= 2; dx++)
- {
- /* Extract the location */
- cx = p_ptr->px + dx;
- cy = p_ptr->py + dy;
-
- /* Skip unaffected grids */
- if (!map[2 + dx][2 + dy]) continue;
-
- /* Access the cave grid */
- cv_ptr = &cave[cy][cx];
-
- /* Paranoia -- never affect player */
- if (!dy && !dx) continue;
-
- /* Destroy location (if valid) */
- if ((cx < cur_wid) && (cy < cur_hgt) && cave_valid_bold(cy, cx))
- {
- bool_ floor = (f_info[cave[cy][cx].feat].flags1 & FF1_FLOOR);
-
- /* Delete any object that is still there */
- delete_object(cy, cx);
-
- if (floor)
- {
- cave_set_feat(cy, cx, FEAT_WALL_OUTER);
- }
- else
- {
- /* Clear previous contents, add floor */
- cave_set_feat(cy, cx, FEAT_FLOOR);
- }
- }
- }
-
- /* Mega-Hack -- Forget the view and lite */
- p_ptr->update |= PU_UN_VIEW;
-
- /* Update stuff */
- p_ptr->update |= (PU_VIEW | PU_FLOW | PU_MON_LITE);
-
- /* Update the monsters */
- p_ptr->update |= (PU_DISTANCE);
-
- /* Update the health bar */
- p_ptr->redraw |= (PR_FRAME);
-
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
-
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
- handle_stuff();
-
- msg_print("Suddenly the cave shifts around you. The air is getting stale!");
-
- ident = TRUE;
-
- return (ident);
-}
-
-
-/*
- * this function handles arrow & dagger traps, in various types.
- * num = number of missiles
- * tval, sval = kind of missiles
- * dd,ds = damage roll for missiles
- * poison_dam = additional poison damage
- * name = name given if you should die from it...
- *
- * return value = ident (always TRUE)
- */
-static bool_ player_handle_missile_trap(s16b num, s16b tval, s16b sval, s16b dd, s16b ds,
- s16b pdam, cptr name)
-{
- object_type *o_ptr, forge;
- s16b i, k_idx = lookup_kind(tval, sval);
- char i_name[80];
-
- o_ptr = &forge;
- object_prep(o_ptr, k_idx);
- o_ptr->number = num;
- apply_magic(o_ptr, max_dlv[dungeon_type], FALSE, FALSE, FALSE);
- object_desc(i_name, o_ptr, TRUE, 0);
-
- msg_format("Suddenly %s hit%s you!", i_name,
- ((num == 1) ? "" : "s"));
-
- for (i = 0; i < num; i++)
- {
- take_hit(damroll(dd, ds), name);
-
- redraw_stuff();
-
- if (pdam > 0)
- {
- if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
- {
- (void)set_poisoned(p_ptr->poisoned + pdam);
- }
- }
- }
-
- drop_near(o_ptr, -1, p_ptr->py, p_ptr->px);
-
- return TRUE;
-}
-
-/*
- * this function handles a "breath" type trap - acid bolt, lightning balls etc.
- */
-static bool_ player_handle_breath_trap(s16b rad, s16b type, u16b trap)
-{
- trap_type *t_ptr = &t_info[trap];
- bool_ ident;
- s16b my_dd, my_ds, dam;
-
- my_dd = t_ptr->dd;
- my_ds = t_ptr->ds;
-
- /* these traps gets nastier as levels progress */
- if (max_dlv[dungeon_type] > (2 * t_ptr->minlevel))
- {
- my_dd += (max_dlv[dungeon_type] / 15);
- my_ds += (max_dlv[dungeon_type] / 15);
- }
- dam = damroll(my_dd, my_ds);
-
- ident = project( -2, rad, p_ptr->py, p_ptr->px, dam, type, PROJECT_KILL | PROJECT_JUMP);
-
- return (ident);
-}
-
-/*
- * This function damages the player by a trap
- */
-static void trap_hit(s16b trap)
-{
- trap_type *t_ptr = &t_info[trap];
- s16b dam = damroll(t_ptr->dd, t_ptr->ds);
- take_hit(dam, t_ptr->name);
-}
-
-/*
- * this function activates one trap type, and returns
- * a bool_ indicating if this trap is now identified
- */
-bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
-{
- bool_ ident = FALSE;
- s16b trap;
-
- s16b k, l;
-
- trap = cave[y][x].t_idx;
-
- if (i_ptr != NULL)
- {
- trap = i_ptr->pval;
- }
-
- switch (trap)
- {
- /* stat traps */
- case TRAP_OF_WEAKNESS_I:
- ident = do_dec_stat(A_STR, STAT_DEC_TEMPORARY);
- break;
- case TRAP_OF_WEAKNESS_II:
- ident = do_dec_stat(A_STR, STAT_DEC_NORMAL);
- break;
- case TRAP_OF_WEAKNESS_III:
- ident = do_dec_stat(A_STR, STAT_DEC_PERMANENT);
- break;
- case TRAP_OF_INTELLIGENCE_I:
- ident = do_dec_stat(A_INT, STAT_DEC_TEMPORARY);
- break;
- case TRAP_OF_INTELLIGENCE_II:
- ident = do_dec_stat(A_INT, STAT_DEC_NORMAL);
- break;
- case TRAP_OF_INTELLIGENCE_III:
- ident = do_dec_stat(A_INT, STAT_DEC_PERMANENT);
- break;
- case TRAP_OF_WISDOM_I:
- ident = do_dec_stat(A_WIS, STAT_DEC_TEMPORARY);
- break;
- case TRAP_OF_WISDOM_II:
- ident = do_dec_stat(A_WIS, STAT_DEC_NORMAL);
- break;
- case TRAP_OF_WISDOM_III:
- ident = do_dec_stat(A_WIS, STAT_DEC_PERMANENT);
- break;
- case TRAP_OF_FUMBLING_I:
- ident = do_dec_stat(A_DEX, STAT_DEC_TEMPORARY);
- break;
- case TRAP_OF_FUMBLING_II:
- ident = do_dec_stat(A_DEX, STAT_DEC_NORMAL);
- break;
- case TRAP_OF_FUMBLING_III:
- ident = do_dec_stat(A_DEX, STAT_DEC_PERMANENT);
- break;
- case TRAP_OF_WASTING_I:
- ident = do_dec_stat(A_CON, STAT_DEC_TEMPORARY);
- break;
- case TRAP_OF_WASTING_II:
- ident = do_dec_stat(A_CON, STAT_DEC_NORMAL);
- break;
- case TRAP_OF_WASTING_III:
- ident = do_dec_stat(A_CON, STAT_DEC_PERMANENT);
- break;
- case TRAP_OF_BEAUTY_I:
- ident = do_dec_stat(A_CHR, STAT_DEC_TEMPORARY);
- break;
- case TRAP_OF_BEAUTY_II:
- ident = do_dec_stat(A_CHR, STAT_DEC_NORMAL);
- break;
- case TRAP_OF_BEAUTY_III:
- ident = do_dec_stat(A_CHR, STAT_DEC_PERMANENT);
- break;
-
- /* Trap of Curse Weapon */
- case TRAP_OF_CURSE_WEAPON:
- {
- ident = curse_weapon();
- break;
- }
-
- /* Trap of Curse Armor */
- case TRAP_OF_CURSE_ARMOR:
- {
- ident = curse_armor();
- break;
- }
-
- /* Earthquake Trap */
- case TRAP_OF_EARTHQUAKE:
- {
- msg_print("As you touch the trap, the ground starts to shake.");
- earthquake(y, x, 10);
- ident = TRUE;
- break;
- }
-
- /* Poison Needle Trap */
- case TRAP_OF_POISON_NEEDLE:
- {
- if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
- {
- msg_print("You prick yourself on a poisoned needle.");
- (void)set_poisoned(p_ptr->poisoned + rand_int(15) + 10);
- ident = TRUE;
- }
- else
- {
- msg_print("You prick yourself on a needle.");
- }
- break;
- }
-
- /* Summon Monster Trap */
- case TRAP_OF_SUMMON_MONSTER:
- {
- msg_print("A spell hangs in the air.");
- for (k = 0; k < randint(3); k++)
- {
- ident |= summon_specific(y, x, max_dlv[dungeon_type], 0);
- }
- break;
- }
-
- /* Summon Undead Trap */
- case TRAP_OF_SUMMON_UNDEAD:
- {
- msg_print("A mighty spell hangs in the air.");
- for (k = 0; k < randint(3); k++)
- {
- ident |= summon_specific(y, x, max_dlv[dungeon_type],
- SUMMON_UNDEAD);
- }
- break;
- }
-
- /* Summon Greater Undead Trap */
- case TRAP_OF_SUMMON_GREATER_UNDEAD:
- {
- msg_print("An old and evil spell hangs in the air.");
- for (k = 0; k < randint(3); k++)
- {
- ident |= summon_specific(y, x, max_dlv[dungeon_type],
- SUMMON_HI_UNDEAD);
- }
- break;
- }
-
- /* Teleport Trap */
- case TRAP_OF_TELEPORT:
- {
- msg_print("The world whirls around you.");
- teleport_player(RATIO * 67);
- ident = TRUE;
- break;
- }
-
- /* Paralyzing Trap */
- case TRAP_OF_PARALYZING:
- {
- if (!p_ptr->free_act)
- {
- msg_print("You touch a poisoned part and can't move.");
- (void)set_paralyzed(rand_int(10) + 10);
- ident = TRUE;
- }
- else
- {
- msg_print("You prick yourself on a needle.");
- }
- break;
- }
-
- /* Explosive Device */
- case TRAP_OF_EXPLOSIVE_DEVICE:
- {
- msg_print("A hidden explosive device explodes in your face.");
- take_hit(damroll(5, 8), "an explosion");
- ident = TRUE;
- break;
- }
-
- /* Teleport Away Trap */
- case TRAP_OF_TELEPORT_AWAY:
- {
- /* teleport away all items */
- while (!cave[y][x].o_idxs.empty())
- {
- auto item = cave[y][x].o_idxs.front();
-
- object_type *o_ptr = &o_list[item];
-
- int amt = o_ptr->number;
-
- ident = do_trap_teleport_away(o_ptr, y, x);
-
- floor_item_increase(item, -amt);
- floor_item_optimize(item);
- }
- break;
- }
-
- /* Lose Memory Trap */
- case TRAP_OF_LOSE_MEMORY:
- {
- lose_exp(p_ptr->exp / 4);
-
- ident |= dec_stat(A_WIS, rand_int(20) + 10, STAT_DEC_NORMAL);
- ident |= dec_stat(A_INT, rand_int(20) + 10, STAT_DEC_NORMAL);
-
- if (!p_ptr->resist_conf)
- {
- ident |= set_confused(p_ptr->confused + rand_int(100) + 50);
- }
-
- if (ident)
- {
- msg_print("You suddenly don't remember what you were doing.");
- }
- else
- {
- msg_print("You feel an alien force probing your mind.");
- }
- break;
- }
- /* Bitter Regret Trap */
- case TRAP_OF_BITTER_REGRET:
- {
- msg_print("An age-old and hideous-sounding spell reverberates off the walls.");
-
- ident |= dec_stat(A_DEX, 25, TRUE);
- ident |= dec_stat(A_WIS, 25, TRUE);
- ident |= dec_stat(A_CON, 25, TRUE);
- ident |= dec_stat(A_STR, 25, TRUE);
- ident |= dec_stat(A_CHR, 25, TRUE);
- ident |= dec_stat(A_INT, 25, TRUE);
- break;
- }
-
- /* Bowel Cramps Trap */
- case TRAP_OF_BOWEL_CRAMPS:
- {
- msg_print("A wretched-smelling gas cloud upsets your stomach.");
-
- (void)set_food(PY_FOOD_STARVE - 1);
- (void)set_poisoned(0);
-
- if (!p_ptr->free_act)
- {
- (void)set_paralyzed(rand_int(dun_level) + 6);
- }
- ident = TRUE;
- break;
- }
-
- /* Blindness/Confusion Trap */
- case TRAP_OF_BLINDNESS_CONFUSION:
- {
- msg_print("A powerful magic protected this.");
-
- if (!p_ptr->resist_blind)
- {
- ident |= set_blind(p_ptr->blind + rand_int(100) + 100);
- }
- if (!p_ptr->resist_conf)
- {
- ident |= set_confused(p_ptr->confused + rand_int(20) + 15);
- }
- break;
- }
-
- /* Aggravation Trap */
- case TRAP_OF_AGGRAVATION:
- {
- msg_print("You hear a hollow noise echoing through the dungeons.");
- aggravate_monsters(1);
- break;
- }
-
- /* Multiplication Trap */
- case TRAP_OF_MULTIPLICATION:
- {
- msg_print("You hear a loud click.");
- for (k = -1; k <= 1; k++)
- for (l = -1; l <= 1; l++)
- {
- if ((in_bounds(p_ptr->py + l, p_ptr->px + k)) &&
- (!cave[p_ptr->py + l][p_ptr->px + k].t_idx))
- {
- place_trap(p_ptr->py + l, p_ptr->px + k);
- }
- }
- ident = TRUE;
- break;
- }
-
- /* Steal Item Trap */
- case TRAP_OF_STEAL_ITEM:
- {
- /*
- * please note that magical stealing is not so
- * easily circumvented
- */
- if (!p_ptr->paralyzed &&
- (rand_int(160) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
- p_ptr->lev)))
- {
- /* Saving throw message */
- msg_print("Your backpack seems to vibrate strangely!");
- break;
- }
-
- /* Find an item */
- for (k = 0; k < rand_int(10); k++)
- {
- char i_name[80];
- object_type *j_ptr, *q_ptr, forge;
-
- /* Pick an item */
- s16b i = rand_int(INVEN_PACK);
-
- /* Obtain the item */
- j_ptr = &p_ptr->inventory[i];
-
- /* Accept real items */
- if (!j_ptr->k_idx) continue;
-
- /* Don't steal artifacts -CFT */
- if (artifact_p(j_ptr)) continue;
-
- /* Get a description */
- object_desc(i_name, j_ptr, FALSE, 3);
-
- /* Message */
- msg_format("%sour %s (%c) was stolen!",
- ((j_ptr->number > 1) ? "One of y" : "Y"),
- i_name, index_to_label(i));
-
- /* Create the item */
- q_ptr = &forge;
- object_copy(q_ptr, j_ptr);
- q_ptr->number = 1;
-
- /* Drop it somewhere */
- do_trap_teleport_away(q_ptr, y, x);
-
- inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
-
- ident = TRUE;
- }
- break;
- }
-
- /* Summon Fast Quylthulgs Trap */
- case TRAP_OF_SUMMON_FAST_QUYLTHULGS:
- {
- for (k = 0; k < randint(3); k++)
- {
- ident |= summon_specific(y, x, max_dlv[dungeon_type], SUMMON_QUYLTHULG);
- }
-
- if (ident)
- {
- msg_print("You suddenly have company.");
- (void)set_slow(p_ptr->slow + randint(25) + 15);
- }
- break;
- }
-
- /* Trap of Sinking */
- case TRAP_OF_SINKING:
- {
- msg_print("You fell through a trap door!");
-
- if (p_ptr->ffall)
- {
- if (dungeon_flags1 & DF1_TOWER)
- {
- msg_print("You float gently down to the previous level.");
- }
- else
- {
- msg_print("You float gently down to the next level.");
- }
- }
- else
- {
- take_hit(damroll(2, 8), "a trap door");
- }
-
- /* Still alive and autosave enabled */
- if (p_ptr->chp >= 0)
- {
- autosave_checkpoint();
- }
-
- if (dungeon_flags1 & DF1_TOWER) dun_level--;
- else dun_level++;
-
- /* Leaving */
- p_ptr->leaving = TRUE;
- break;
- }
-
- /* Trap of Mana Drain */
- case TRAP_OF_MANA_DRAIN:
- {
- if (p_ptr->csp > 0)
- {
- p_ptr->csp = 0;
- p_ptr->csp_frac = 0;
- p_ptr->redraw |= (PR_FRAME);
- msg_print("You sense a great loss.");
- ident = TRUE;
- }
- else if (p_ptr->msp == 0)
- {
- /* no sense saying this unless you never have mana */
- msg_format("Suddenly you feel glad you're a mere %s",
- spp_ptr->title);
- }
- else
- {
- msg_print("Your head feels dizzy for a moment.");
- }
- break;
- }
- /* Trap of Missing Money */
- case TRAP_OF_MISSING_MONEY:
- {
- s32b gold = (p_ptr->au / 10) + randint(25);
-
- if (gold < 2) gold = 2;
- if (gold > 5000) gold = (p_ptr->au / 20) + randint(3000);
- if (gold > p_ptr->au) gold = p_ptr->au;
-
- p_ptr->au -= gold;
- if (gold <= 0)
- {
- msg_print("You feel something touching you.");
- }
- else if (p_ptr->au)
- {
- msg_print("Your purse feels lighter.");
- msg_format("%ld coins were stolen!", (long)gold);
- ident = TRUE;
- }
- else
- {
- msg_print("Your purse feels empty.");
- msg_print("All of your coins were stolen!");
- ident = TRUE;
- }
- p_ptr->redraw |= (PR_FRAME);
- break;
- }
-
- /* Trap of No Return */
- case TRAP_OF_NO_RETURN:
- {
- object_type *j_ptr;
- s16b j;
-
- for (j = 0; j < INVEN_WIELD; j++)
- {
- if (!p_ptr->inventory[j].k_idx) continue;
-
- j_ptr = &p_ptr->inventory[j];
-
- if ((j_ptr->tval == TV_SCROLL) &&
- (j_ptr->sval == SV_SCROLL_WORD_OF_RECALL))
- {
- inc_stack_size_ex(j, -j_ptr->number, OPTIMIZE, NO_DESCRIBE);
-
- combine_pack();
- reorder_pack();
-
- if (!ident)
- {
- msg_print("A small fire works its way through your backpack. "
- "Some scrolls are burnt.");
- }
- else
- {
- msg_print("The fire hasn't finished.");
- }
- ident = TRUE;
- }
- else if ((j_ptr->tval == TV_ROD_MAIN) &&
- (j_ptr->pval == SV_ROD_RECALL))
- {
- j_ptr->timeout = 0; /* a long time */
- if (!ident) msg_print("You feel the air stabilise around you.");
- ident = TRUE;
- }
- }
- if ((!ident) && (p_ptr->word_recall))
- {
- msg_print("You feel like staying around.");
- p_ptr->word_recall = 0;
- ident = TRUE;
- }
- break;
- }
-
- /* Trap of Silent Switching */
- case TRAP_OF_SILENT_SWITCHING:
- {
- s16b i, j, slot1, slot2;
- object_type *j_ptr, *k_ptr;
- u32b f1, f2, f3, f4, f5, esp;
-
- for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
- {
- j_ptr = &p_ptr->inventory[i];
-
- if (!j_ptr->k_idx) continue;
-
- /* Do not allow this trap to touch the One Ring */
- object_flags(j_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if(f3 & TR3_PERMA_CURSE) continue;
-
- slot1 = wield_slot(j_ptr);
-
- for (j = 0; j < INVEN_WIELD; j++)
- {
- k_ptr = &p_ptr->inventory[j];
-
- if (!k_ptr->k_idx) continue;
-
- /* Do not allow this trap to touch the One Ring */
- object_flags(k_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if(f3 & TR3_PERMA_CURSE) continue;
-
- /* this is a crude hack, but it prevent wielding 6 torches... */
- if (k_ptr->number > 1) continue;
-
- slot2 = wield_slot(k_ptr);
-
- /* a chance of 4 in 5 of switching something, then 2 in 5 to do it again */
- if ((slot1 == slot2) &&
- (rand_int(100) < (80 - (ident * 40))))
- {
- object_type tmp_obj;
-
- if (p_ptr->inventory[j].name1)
- wield_set(p_ptr->inventory[j].name1, a_info[p_ptr->inventory[j].name1].set, FALSE);
- if (p_ptr->inventory[i].name1)
- takeoff_set(p_ptr->inventory[i].name1, a_info[p_ptr->inventory[i].name1].set);
-
- tmp_obj = p_ptr->inventory[j];
- p_ptr->inventory[j] = p_ptr->inventory[i];
- p_ptr->inventory[i] = tmp_obj;
- ident = TRUE;
- }
- }
- }
-
- if (ident)
- {
- p_ptr->update |= (PU_BONUS);
- p_ptr->update |= (PU_TORCH);
- p_ptr->update |= (PU_MANA);
- msg_print("You somehow feel like another person.");
- }
- else
- {
- msg_print("You feel a lack of useful items.");
- }
- break;
- }
-
- /* Trap of Walls */
- case TRAP_OF_WALLS:
- {
- ident = player_handle_trap_of_walls();
- break;
- }
-
- /* Trap of Calling Out */
- case TRAP_OF_CALLING_OUT:
- {
- ident = do_player_trap_call_out();
-
- if (!ident)
- {
- /* Increase "afraid" */
- if (p_ptr->resist_fear)
- {
- msg_print("You feel as if you had a nightmare!");
- }
- else if (rand_int(100) < p_ptr->skill_sav)
- {
- msg_print("You remember having a nightmare!");
- }
- else
- {
- if (set_afraid(p_ptr->afraid + 3 + randint(40)))
- {
- msg_print("You have a vision of a powerful enemy.");
- }
- }
- }
- break;
- }
-
- /* Trap of Sliding */
- case TRAP_OF_SLIDING:
- break;
-
- /* Trap of Charges Drain */
- case TRAP_OF_CHARGES_DRAIN:
- {
- /* Find an item */
- for (k = 0; k < 10; k++)
- {
- s16b i = rand_int(INVEN_PACK);
-
- object_type *j_ptr = &p_ptr->inventory[i];
-
- /* Drain charged wands/staffs
- Hack -- don't let artifacts get drained */
- if (((j_ptr->tval == TV_STAFF) ||
- (j_ptr->tval == TV_WAND)) &&
- (j_ptr->pval) &&
- !artifact_p(j_ptr))
- {
- ident = TRUE;
- j_ptr->pval = j_ptr->pval / (randint(4) + 1);
-
- /* 60% chance of only 1 */
- if (randint(10) > 3) break;
- }
- }
-
- if (ident)
- {
- /* Window stuff */
- p_ptr->window |= PW_INVEN;
- /* Combine / Reorder the pack */
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
-
- msg_print("Your backpack seems to be turned upside down.");
- }
- else
- {
- msg_print("You hear a wail of great disappointment.");
- }
- break;
- }
-
- /* Trap of Stair Movement */
- case TRAP_OF_STAIR_MOVEMENT:
- {
- s16b cx, cy, i, j;
- s16b cnt = 0;
- s16b cnt_seen = 0;
- s16b tmps, tmpx;
- s16b tmpspecial, tmpspecial2;
- u32b tmpf;
- bool_ seen = FALSE;
- s16b index_x[20], index_y[20]; /* 20 stairs per level is enough? */
- cave_type *cv_ptr;
-
- if (max_dlv[dungeon_type] == 99)
- {
- /* no sense in relocating that stair! */
- msg_print("You have a feeling that this trap could be dangerous.");
- break;
- }
-
- for (cx = 0; cx < cur_wid; cx++)
- for (cy = 0; cy < cur_hgt; cy++)
- {
- cv_ptr = &cave[cy][cx];
-
- if ((cv_ptr->feat != FEAT_LESS) &&
- (cv_ptr->feat != FEAT_MORE) &&
- (cv_ptr->feat != FEAT_SHAFT_UP) &&
- (cv_ptr->feat != FEAT_SHAFT_DOWN)) continue;
-
- index_x[cnt] = cx;
- index_y[cnt] = cy;
- cnt++;
- }
-
- if (cnt == 0)
- {
- if (wizard) msg_print("Executing moving stairs trap on level with no stairs!");
- break;
- }
-
- for (i = 0; i < cnt; i++)
- {
- seen = FALSE;
-
- for (j = 0; j < 10; j++) /* try 10 times to relocate */
- {
- cave_type *cv_ptr = &cave[index_y[i]][index_x[i]];
- cave_type *cv_ptr2;
-
- cx = rand_int(cur_wid);
- cy = rand_int(cur_hgt);
-
- if ((cx == index_x[i]) || (cy == index_y[i])) continue;
-
- cv_ptr2 = &cave[cy][cx];
-
- if (!cave_valid_bold(cy, cx) || (!cv_ptr2->o_idxs.empty())) continue;
-
- /* don't put anything in vaults */
- if (cv_ptr2->info & CAVE_ICKY) continue;
-
- tmpx = cv_ptr2->mimic;
- tmps = cv_ptr2->info;
- tmpf = cv_ptr2->feat;
- tmpspecial = cv_ptr2->special;
- tmpspecial2 = cv_ptr2->special2;
- cave[cy][cx].mimic = cv_ptr->mimic;
- cave[cy][cx].info = cv_ptr->info;
- cave[cy][cx].special = cv_ptr->special;
- cave[cy][cx].special2 = cv_ptr->special2;
- cave_set_feat(cy, cx, cv_ptr->feat);
- cv_ptr->mimic = tmpx;
- cv_ptr->info = tmps;
- cv_ptr->special = tmpspecial;
- cv_ptr->special2 = tmpspecial2;
- cave_set_feat(index_y[i], index_x[i], tmpf);
-
- /* if we are placing walls in rooms, make them rubble instead */
- if ((cv_ptr->info & CAVE_ROOM) &&
- (cv_ptr->feat >= FEAT_WALL_EXTRA) &&
- (cv_ptr->feat <= FEAT_PERM_SOLID))
- {
- cave_set_feat(index_y[i], index_x[i], FEAT_RUBBLE);
- }
-
- if (player_has_los_bold(cy, cx))
- {
- note_spot(cy, cx);
- lite_spot(cy, cx);
- seen = TRUE;
- }
- else
- {
- cv_ptr2->info &= ~CAVE_MARK;
- }
-
- if (player_has_los_bold(index_y[i], index_x[i]))
- {
- note_spot(index_y[i], index_x[i]);
- lite_spot(index_y[i], index_x[i]);
- seen = TRUE;
- }
- else
- {
- cv_ptr->info &= ~CAVE_MARK;
- }
- break;
- }
-
- if (seen) cnt_seen++;
- }
-
- ident = (cnt_seen > 0);
-
- if ((ident) && (cnt_seen > 1))
- {
- msg_print("You see some stairs move.");
- }
- else if (ident)
- {
- msg_print("You see a stair move.");
- }
- else
- {
- msg_print("You hear distant scraping noises.");
- }
- p_ptr->redraw |= PR_MAP;
- break;
- }
-
- /* Trap of New Trap */
- case TRAP_OF_NEW:
- {
- /* if we're on a floor or on a door, place a new trap */
- if ((item == -1) || (item == -2))
- {
- place_trap(y, x);
- if (player_has_los_bold(y, x))
- {
- note_spot(y, x);
- lite_spot(y, x);
- }
- }
- else
- {
- /* re-trap the chest */
- place_trap(y, x);
- }
- msg_print("You hear a noise, and then its echo.");
- ident = FALSE;
- break;
- }
-
- /* Trap of Acquirement */
- case TRAP_OF_ACQUIREMENT:
- {
- /* Get a nice thing */
- msg_print("You notice something falling off the trap.");
- acquirement(y, x, 1, TRUE, FALSE);
-
- /* If we're on a floor or on a door, place a new trap */
- if ((item == -1) || (item == -2))
- {
- place_trap(y, x);
- if (player_has_los_bold(y, x))
- {
- note_spot(y, x);
- lite_spot(y, x);
- }
- }
- else
- {
- /* Re-trap the chest */
- place_trap(y, x);
- }
- msg_print("You hear a noise, and then its echo.");
-
- /* Never known */
- ident = FALSE;
- }
- break;
-
- /* Trap of Scatter Items */
- case TRAP_OF_SCATTER_ITEMS:
- {
- s16b i, j;
- bool_ message = FALSE;
-
- for (i = 0; i < INVEN_PACK; i++)
- {
-
- if (!p_ptr->inventory[i].k_idx) continue;
-
- if (rand_int(10) < 3) continue;
-
- for (j = 0; j < 10; j++)
- {
- object_type tmp_obj, *j_ptr = &tmp_obj;
- s16b cx = x + 15 - rand_int(30);
- s16b cy = y + 15 - rand_int(30);
-
- if (!in_bounds(cy, cx)) continue;
-
- if (!cave_floor_bold(cy, cx)) continue;
-
- object_copy(j_ptr, &p_ptr->inventory[i]);
-
- inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
-
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
-
- (void)floor_carry(cy, cx, j_ptr);
-
- if (!message)
- {
- msg_print("You feel light-footed.");
- message = TRUE;
- }
-
- if (player_has_los_bold(cy, cx))
- {
- char i_name[80];
-
- object_desc(i_name, &tmp_obj, TRUE, 3);
- note_spot(cy, cx);
- lite_spot(cy, cx);
- ident = TRUE;
- msg_format("Suddenly %s appear%s!", i_name,
- (j_ptr->number > 1) ? "" : "s");
- }
- break;
- }
- }
- ident = message;
- break;
- }
-
- /* Trap of Decay */
- case TRAP_OF_DECAY:
- break;
-
- /* Trap of Wasting Wands */
- case TRAP_OF_WASTING_WANDS:
- {
- s16b i;
- object_type *j_ptr;
-
- for (i = 0; i < INVEN_PACK; i++)
- {
- if (!p_ptr->inventory[i].k_idx) continue;
-
- j_ptr = &p_ptr->inventory[i];
-
- if ((j_ptr->tval == TV_WAND) && (rand_int(5) == 1))
- {
- if (object_known_p(j_ptr)) ident = TRUE;
-
- /* Create a Wand of Nothing */
- object_prep(j_ptr, lookup_kind(TV_WAND, SV_WAND_NOTHING));
- apply_magic(j_ptr, 0, FALSE, FALSE, FALSE, boost::make_optional(0));
- j_ptr->ident &= ~IDENT_KNOWN;
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
- }
- else if ((j_ptr->tval == TV_STAFF) && (rand_int(5) == 1))
- {
- if (object_known_p(j_ptr)) ident = TRUE;
-
- /* Create a Staff of Nothing */
- object_prep(j_ptr, lookup_kind(TV_STAFF, SV_STAFF_NOTHING));
- apply_magic(j_ptr, 0, FALSE, FALSE, FALSE, boost::make_optional(0));
- j_ptr->ident &= ~IDENT_KNOWN;
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
- }
- }
- if (ident)
- {
- msg_print("You have lost trust in your backpack!");
- }
- else
- {
- msg_print("You hear an echoing cry of rage.");
- }
- break;
- }
-
- /* Trap of Filling */
- case TRAP_OF_FILLING:
- {
- s16b nx, ny;
-
- for (nx = x - 8; nx <= x + 8; nx++)
- for (ny = y - 8; ny <= y + 8; ny++)
- {
- if (!in_bounds (ny, nx)) continue;
-
- if (rand_int(distance(ny, nx, y, x)) > 3)
- {
- place_trap(ny, nx);
- }
- }
-
- msg_print("The floor vibrates in a strange way.");
- ident = FALSE;
- break;
- }
-
- case TRAP_OF_DRAIN_SPEED:
- {
- object_type *j_ptr;
- s16b j, chance = 75;
- u32b f1, f2, f3, f4, f5, esp;
-
- for (j = 0; j < INVEN_TOTAL; j++)
- {
- /* don't bother the overflow slot */
- if (j == INVEN_PACK) continue;
-
- if (!p_ptr->inventory[j].k_idx) continue;
-
- j_ptr = &p_ptr->inventory[j];
- object_flags(j_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- /* is it a non-artifact speed item? */
- if ((!j_ptr->name1) && (f1 & TR1_SPEED))
- {
- if (randint(100) < chance)
- {
- j_ptr->pval = j_ptr->pval / 2;
- if (j_ptr->pval == 0)
- {
- j_ptr->pval--;
- }
- chance /= 2;
- ident = TRUE;
- }
- inven_item_optimize(j);
- }
- }
- if (!ident)
- {
- msg_print("You feel some things in your pack vibrating.");
- }
- else
- {
- combine_pack();
- reorder_pack();
- msg_print("You suddenly feel you have time for self-reflection.");
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Recalculate mana */
- p_ptr->update |= (PU_MANA);
-
- /* Window stuff */
- p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
- }
- break;
- }
-
- /*
- * single missile traps
- */
- case TRAP_OF_ARROW_I:
- ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_NORMAL, 4, 8, 0, "Arrow Trap");
- break;
- case TRAP_OF_ARROW_II:
- ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_NORMAL, 5, 8, 0, "Bolt Trap");
- break;
- case TRAP_OF_ARROW_III:
- ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_HEAVY, 6, 8, 0, "Seeker Arrow Trap");
- break;
- case TRAP_OF_ARROW_IV:
- ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_HEAVY, 8, 10, 0, "Seeker Bolt Trap");
- break;
- case TRAP_OF_POISON_ARROW_I:
- ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_NORMAL, 4, 8, 10 + randint(20), "Poison Arrow Trap");
- break;
- case TRAP_OF_POISON_ARROW_II:
- ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_NORMAL, 5, 8, 15 + randint(30), "Poison Bolt Trap");
- break;
- case TRAP_OF_POISON_ARROW_III:
- ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_HEAVY, 6, 8, 30 + randint(50), "Poison Seeker Arrow Trap");
- break;
- case TRAP_OF_POISON_ARROW_IV:
- ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_HEAVY, 8, 10, 40 + randint(70), "Poison Seeker Bolt Trap");
- break;
- case TRAP_OF_DAGGER_I:
- ident = player_handle_missile_trap(1, TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 0, "Dagger Trap");
- break;
- case TRAP_OF_DAGGER_II:
- ident = player_handle_missile_trap(1, TV_SWORD, SV_DAGGER, 3, 8, 0, "Dagger Trap");
- break;
- case TRAP_OF_POISON_DAGGER_I:
- ident = player_handle_missile_trap(1, TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 15 + randint(20), "Poison Dagger Trap");
- break;
- case TRAP_OF_POISON_DAGGER_II:
- ident = player_handle_missile_trap(1, TV_SWORD, SV_DAGGER, 3, 8, 20 + randint(30), "Poison Dagger Trap");
- break;
-
- /*
- * multiple missile traps
- * numbers range from 2 (level 0 to 14) to 10 (level 120 and up)
- */
- case TRAP_OF_ARROWS_I:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_NORMAL, 4, 8, 0, "Arrow Trap");
- break;
- case TRAP_OF_ARROWS_II:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_NORMAL, 5, 8, 0, "Bolt Trap");
- break;
- case TRAP_OF_ARROWS_III:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_HEAVY, 6, 8, 0, "Seeker Arrow Trap");
- break;
- case TRAP_OF_ARROWS_IV:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_HEAVY, 8, 10, 0, "Seeker Bolt Trap");
- break;
- case TRAP_OF_POISON_ARROWS_I:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_NORMAL, 4, 8, 10 + randint(20), "Poison Arrow Trap");
- break;
- case TRAP_OF_POISON_ARROWS_II:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_NORMAL, 5, 8, 15 + randint(30), "Poison Bolt Trap");
- break;
- case TRAP_OF_POISON_ARROWS_III:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_HEAVY, 6, 8, 30 + randint(50), "Poison Seeker Arrow Trap");
- break;
- case TRAP_OF_POISON_ARROWS_IV:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_HEAVY, 8, 10, 40 + randint(70), "Poison Seeker Bolt Trap");
- break;
- case TRAP_OF_DAGGERS_I:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 0, "Dagger Trap");
- break;
- case TRAP_OF_DAGGERS_II:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_DAGGER, 3, 8, 0, "Dagger Trap");
- break;
- case TRAP_OF_POISON_DAGGERS_I:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 15 + randint(20), "Poison Dagger Trap");
- break;
- case TRAP_OF_POISON_DAGGERS_II:
- ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_DAGGER, 3, 8, 20 + randint(30), "Poison Dagger Trap");
- break;
-
- case TRAP_OF_DROP_ITEMS:
- {
- s16b i;
- bool_ message = FALSE;
-
- for (i = 0; i < INVEN_PACK; i++)
- {
- object_type tmp_obj;
-
- if (!p_ptr->inventory[i].k_idx) continue;
- if (randint(100) < 80) continue;
- if (p_ptr->inventory[i].name1 == ART_POWER) continue;
-
- tmp_obj = p_ptr->inventory[i];
-
- /* drop carefully */
- drop_near(&tmp_obj, 0, y, x);
-
- inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
-
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
-
- if (!message)
- {
- msg_print("You are startled by a sudden sound.");
- message = TRUE;
- }
- ident = TRUE;
- }
- if (!ident)
- {
- msg_print("You hear a sudden, strange sound.");
- }
- break;
- }
-
- case TRAP_OF_DROP_ALL_ITEMS:
- {
- s16b i;
- bool_ message = FALSE;
-
- for (i = 0; i < INVEN_PACK; i++)
- {
- object_type tmp_obj;
-
- if (!p_ptr->inventory[i].k_idx) continue;
- if (randint(100) < 10) continue;
- if (p_ptr->inventory[i].name1 == ART_POWER) continue;
-
- tmp_obj = p_ptr->inventory[i];
-
- /* drop carefully */
- drop_near(&tmp_obj, 0, y, x);
-
- inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
-
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
-
- if (!message)
- {
- msg_print("You are greatly startled by a sudden sound.");
- message = TRUE;
- }
- ident = TRUE;
- }
- if (!ident)
- {
- msg_print("You hear a sudden, strange sound.");
- }
- break;
- }
-
- case TRAP_OF_DROP_EVERYTHING:
- {
- s16b i;
- bool_ message = FALSE;
-
- for (i = 0; i < INVEN_TOTAL; i++)
- {
- object_type tmp_obj;
- if (!p_ptr->inventory[i].k_idx) continue;
- if (randint(100) < 30) continue;
- if (p_ptr->inventory[i].name1 == ART_POWER) continue;
-
- tmp_obj = p_ptr->inventory[i];
- /* drop carefully */
-
- drop_near(&tmp_obj, 0, y, x);
-
- inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
-
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
-
- if (!message)
- {
- msg_print("You are completely startled by a sudden sound.");
- message = TRUE;
- }
- ident = TRUE;
- }
- if (!ident)
- {
- msg_print("You hear a sudden, strange sound.");
- }
- break;
- }
-
- /* Bolt Trap */
- case TRAP_G_ELEC_BOLT:
- ident = player_handle_breath_trap(1, GF_ELEC, TRAP_G_ELEC_BOLT);
- break;
- case TRAP_G_POIS_BOLT:
- ident = player_handle_breath_trap(1, GF_POIS, TRAP_G_POIS_BOLT);
- break;
- case TRAP_G_ACID_BOLT:
- ident = player_handle_breath_trap(1, GF_ACID, TRAP_G_ACID_BOLT);
- break;
- case TRAP_G_COLD_BOLT:
- ident = player_handle_breath_trap(1, GF_COLD, TRAP_G_COLD_BOLT);
- break;
- case TRAP_G_FIRE_BOLT:
- ident = player_handle_breath_trap(1, GF_FIRE, TRAP_G_FIRE_BOLT);
- break;
- case TRAP_OF_ELEC_BOLT:
- ident = player_handle_breath_trap(1, GF_ELEC, TRAP_OF_ELEC_BOLT);
- break;
- case TRAP_OF_POIS_BOLT:
- ident = player_handle_breath_trap(1, GF_POIS, TRAP_OF_POIS_BOLT);
- break;
- case TRAP_OF_ACID_BOLT:
- ident = player_handle_breath_trap(1, GF_ACID, TRAP_OF_ACID_BOLT);
- break;
- case TRAP_OF_COLD_BOLT:
- ident = player_handle_breath_trap(1, GF_COLD, TRAP_OF_COLD_BOLT);
- break;
- case TRAP_OF_FIRE_BOLT:
- ident = player_handle_breath_trap(1, GF_FIRE, TRAP_OF_FIRE_BOLT);
- break;
- case TRAP_OF_PLASMA_BOLT:
- ident = player_handle_breath_trap(1, GF_PLASMA, TRAP_OF_PLASMA_BOLT);
- break;
- case TRAP_OF_WATER_BOLT:
- ident = player_handle_breath_trap(1, GF_WATER, TRAP_OF_WATER_BOLT);
- break;
- case TRAP_OF_LITE_BOLT:
- ident = player_handle_breath_trap(1, GF_LITE, TRAP_OF_LITE_BOLT);
- break;
- case TRAP_OF_DARK_BOLT:
- ident = player_handle_breath_trap(1, GF_DARK, TRAP_OF_DARK_BOLT);
- break;
- case TRAP_OF_SHARDS_BOLT:
- ident = player_handle_breath_trap(1, GF_SHARDS, TRAP_OF_SHARDS_BOLT);
- break;
- case TRAP_OF_SOUND_BOLT:
- ident = player_handle_breath_trap(1, GF_SOUND, TRAP_OF_SOUND_BOLT);
- break;
- case TRAP_OF_CONFUSION_BOLT:
- ident = player_handle_breath_trap(1, GF_CONFUSION, TRAP_OF_CONFUSION_BOLT);
- break;
- case TRAP_OF_FORCE_BOLT:
- ident = player_handle_breath_trap(1, GF_FORCE, TRAP_OF_FORCE_BOLT);
- break;
- case TRAP_OF_INERTIA_BOLT:
- ident = player_handle_breath_trap(1, GF_INERTIA, TRAP_OF_INERTIA_BOLT);
- break;
- case TRAP_OF_MANA_BOLT:
- ident = player_handle_breath_trap(1, GF_MANA, TRAP_OF_MANA_BOLT);
- break;
- case TRAP_OF_ICE_BOLT:
- ident = player_handle_breath_trap(1, GF_ICE, TRAP_OF_ICE_BOLT);
- break;
- case TRAP_OF_CHAOS_BOLT:
- ident = player_handle_breath_trap(1, GF_CHAOS, TRAP_OF_CHAOS_BOLT);
- break;
- case TRAP_OF_NETHER_BOLT:
- ident = player_handle_breath_trap(1, GF_NETHER, TRAP_OF_NETHER_BOLT);
- break;
- case TRAP_OF_DISENCHANT_BOLT:
- ident = player_handle_breath_trap(1, GF_DISENCHANT, TRAP_OF_DISENCHANT_BOLT);
- break;
- case TRAP_OF_NEXUS_BOLT:
- ident = player_handle_breath_trap(1, GF_NEXUS, TRAP_OF_NEXUS_BOLT);
- break;
- case TRAP_OF_TIME_BOLT:
- ident = player_handle_breath_trap(1, GF_TIME, TRAP_OF_TIME_BOLT);
- break;
- case TRAP_OF_GRAVITY_BOLT:
- ident = player_handle_breath_trap(1, GF_GRAVITY, TRAP_OF_GRAVITY_BOLT);
- break;
-
- /* Ball Trap */
- case TRAP_OF_ELEC_BALL:
- ident = player_handle_breath_trap(3, GF_ELEC, TRAP_OF_ELEC_BALL);
- break;
- case TRAP_OF_POIS_BALL:
- ident = player_handle_breath_trap(3, GF_POIS, TRAP_OF_POIS_BALL);
- break;
- case TRAP_OF_ACID_BALL:
- ident = player_handle_breath_trap(3, GF_ACID, TRAP_OF_ACID_BALL);
- break;
- case TRAP_OF_COLD_BALL:
- ident = player_handle_breath_trap(3, GF_COLD, TRAP_OF_COLD_BALL);
- break;
- case TRAP_OF_FIRE_BALL:
- ident = player_handle_breath_trap(3, GF_FIRE, TRAP_OF_FIRE_BALL);
- break;
- case TRAP_OF_PLASMA_BALL:
- ident = player_handle_breath_trap(3, GF_PLASMA, TRAP_OF_PLASMA_BALL);
- break;
- case TRAP_OF_WATER_BALL:
- ident = player_handle_breath_trap(3, GF_WATER, TRAP_OF_WATER_BALL);
- break;
- case TRAP_OF_LITE_BALL:
- ident = player_handle_breath_trap(3, GF_LITE, TRAP_OF_LITE_BALL);
- break;
- case TRAP_OF_DARK_BALL:
- ident = player_handle_breath_trap(3, GF_DARK, TRAP_OF_DARK_BALL);
- break;
- case TRAP_OF_SHARDS_BALL:
- ident = player_handle_breath_trap(3, GF_SHARDS, TRAP_OF_SHARDS_BALL);
- break;
- case TRAP_OF_SOUND_BALL:
- ident = player_handle_breath_trap(3, GF_SOUND, TRAP_OF_SOUND_BALL);
- break;
- case TRAP_OF_CONFUSION_BALL:
- ident = player_handle_breath_trap(3, GF_CONFUSION, TRAP_OF_CONFUSION_BALL);
- break;
- case TRAP_OF_FORCE_BALL:
- ident = player_handle_breath_trap(3, GF_FORCE, TRAP_OF_FORCE_BALL);
- break;
- case TRAP_OF_INERTIA_BALL:
- ident = player_handle_breath_trap(3, GF_INERTIA, TRAP_OF_INERTIA_BALL);
- break;
- case TRAP_OF_MANA_BALL:
- ident = player_handle_breath_trap(3, GF_MANA, TRAP_OF_MANA_BALL);
- break;
- case TRAP_OF_ICE_BALL:
- ident = player_handle_breath_trap(3, GF_ICE, TRAP_OF_ICE_BALL);
- break;
- case TRAP_OF_CHAOS_BALL:
- ident = player_handle_breath_trap(3, GF_CHAOS, TRAP_OF_CHAOS_BALL);
- break;
- case TRAP_OF_NETHER_BALL:
- ident = player_handle_breath_trap(3, GF_NETHER, TRAP_OF_NETHER_BALL);
- break;
- case TRAP_OF_DISENCHANT_BALL:
- ident = player_handle_breath_trap(3, GF_DISENCHANT, TRAP_OF_DISENCHANT_BALL);
- break;
- case TRAP_OF_NEXUS_BALL:
- ident = player_handle_breath_trap(3, GF_NEXUS, TRAP_OF_NEXUS_BALL);
- break;
- case TRAP_OF_TIME_BALL:
- ident = player_handle_breath_trap(3, GF_TIME, TRAP_OF_TIME_BALL);
- break;
- case TRAP_OF_GRAVITY_BALL:
- ident = player_handle_breath_trap(3, GF_GRAVITY, TRAP_OF_GRAVITY_BALL);
- break;
-
- /* -SC- */
- case TRAP_OF_FEMINITY:
- {
- msg_print("Gas sprouts out... you feel yourself transmute.");
- p_ptr->psex = SEX_FEMALE;
- sp_ptr = &sex_info[p_ptr->psex];
- ident = TRUE;
- trap_hit(trap);
- break;
- }
-
- case TRAP_OF_MASCULINITY:
- {
- msg_print("Gas sprouts out... you feel yourself transmute.");
- p_ptr->psex = SEX_MALE;
- sp_ptr = &sex_info[p_ptr->psex];
- ident = TRUE;
- trap_hit(trap);
- break;
- }
-
- case TRAP_OF_NEUTRALITY:
- {
- msg_print("Gas sprouts out... you feel yourself transmute.");
- p_ptr->psex = SEX_NEUTER;
- sp_ptr = &sex_info[p_ptr->psex];
- ident = TRUE;
- trap_hit(trap);
- break;
- }
-
- case TRAP_OF_AGING:
- {
- msg_print("Colors are scintillating around you. "
- "You see your past running before your eyes.");
- p_ptr->age += randint((rp_ptr->b_age + rmp_ptr->b_age) / 2);
- ident = TRUE;
- trap_hit(trap);
- break;
- }
-
- case TRAP_OF_GROWING:
- {
- s16b tmp;
-
- msg_print("Heavy fumes sprout out... you feel yourself transmute.");
- if (p_ptr->psex == SEX_FEMALE) tmp = rp_ptr->f_b_ht + rmp_ptr->f_b_ht;
- else tmp = rp_ptr->m_b_ht + rmp_ptr->m_b_ht;
-
- p_ptr->ht += randint(tmp / 4);
- ident = TRUE;
- trap_hit(trap);
- break;
- }
-
- case TRAP_OF_SHRINKING:
- {
- s16b tmp;
-
- msg_print("Heavy fumes sprout out... you feel yourself transmute.");
- if (p_ptr->psex == SEX_FEMALE) tmp = rp_ptr->f_b_ht + rmp_ptr->f_b_ht;
- else tmp = rp_ptr->m_b_ht + rmp_ptr->m_b_ht;
-
- p_ptr->ht -= randint(tmp / 4);
- if (p_ptr->ht <= tmp / 4) p_ptr->ht = tmp / 4;
- ident = TRUE;
- trap_hit(trap);
- break;
- }
-
- /* Trap of Divine Anger */
- case TRAP_OF_DIVINE_ANGER:
- {
- if (p_ptr->pgod == 0)
- {
- msg_format("Suddenly you feel glad you're a mere %s", spp_ptr->title);
- }
- else
- {
- cptr name;
-
- name = deity_info[p_ptr->pgod].name;
- msg_format("You feel you have angered %s.", name);
- inc_piety(p_ptr->pgod, -3000);
- }
- break;
- }
-
- /* Trap of Divine Wrath */
- case TRAP_OF_DIVINE_WRATH:
- {
- if (p_ptr->pgod == 0)
- {
- msg_format("Suddenly you feel glad you're a mere %s", spp_ptr->title);
- }
- else
- {
- cptr name;
-
- name = deity_info[p_ptr->pgod].name;
-
- msg_format("%s quakes in rage: ``Thou art supremely insolent, mortal!!''", name);
- inc_piety(p_ptr->pgod, -500 * p_ptr->lev);
- }
- break;
- }
-
- /* Trap of hallucination */
- case TRAP_OF_HALLUCINATION:
- {
- msg_print("Scintillating colors hypnotise you for a moment.");
-
- set_image(80);
- }
- break;
-
- /* Bolt Trap */
- case TRAP_OF_ROCKET:
- ident = player_handle_breath_trap(1, GF_ROCKET, trap);
- break;
- case TRAP_OF_NUKE_BOLT:
- ident = player_handle_breath_trap(1, GF_NUKE, trap);
- break;
- case TRAP_OF_HOLY_FIRE:
- ident = player_handle_breath_trap(1, GF_HOLY_FIRE, trap);
- break;
- case TRAP_OF_HELL_FIRE:
- ident = player_handle_breath_trap(1, GF_HELL_FIRE, trap);
- break;
- case TRAP_OF_PSI_BOLT:
- ident = player_handle_breath_trap(1, GF_PSI, trap);
- break;
- case TRAP_OF_PSI_DRAIN:
- ident = player_handle_breath_trap(1, GF_PSI_DRAIN, trap);
- break;
-
- /* Ball Trap */
- case TRAP_OF_NUKE_BALL:
- ident = player_handle_breath_trap(3, GF_NUKE, TRAP_OF_NUKE_BALL);
- break;
- case TRAP_OF_PSI_BALL:
- ident = player_handle_breath_trap(3, GF_PSI, TRAP_OF_NUKE_BALL);
- break;
-
- default:
- {
- msg_print(format("Executing unknown trap %d", trap));
- }
- }
- return ident;
-}
-
-void player_activate_door_trap(s16b y, s16b x)
-{
- cave_type *c_ptr;
- bool_ ident = FALSE;
-
- c_ptr = &cave[y][x];
-
- /* Return if trap or door not found */
- if ((c_ptr->t_idx == 0) ||
- !(f_info[c_ptr->feat].flags1 & FF1_DOOR)) return;
-
- /* Disturb */
- disturb(0);
-
- /* Message */
- msg_print("You found a trap!");
-
- /* Pick a trap */
- pick_trap(y, x);
-
- /* Hit the trap */
- ident = player_activate_trap_type(y, x, NULL, -1);
- if (ident)
- {
- t_info[c_ptr->t_idx].ident = TRUE;
- msg_format("You identified that trap as %s.",
- t_info[c_ptr->t_idx].name);
- }
-}
-
-
-/*
- * Places a random trap at the given location.
- *
- * The location must be a valid, empty, clean, floor grid.
- */
-void place_trap(int y, int x)
-{
- s16b trap;
- trap_type *t_ptr;
- int cnt;
- u32b flags;
- cave_type *c_ptr = &cave[y][x];
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
-
- /* No traps in town or on first level */
- if (dun_level <= 1) return;
-
- /*
- * Avoid open doors -- because DOOR flag is added to make much more
- * important processing faster
- */
- if (c_ptr->feat == FEAT_OPEN) return;
- if (c_ptr->feat == FEAT_BROKEN) return;
-
- /* Traps only appears on empty floor */
- if (!cave_floor_grid(c_ptr) &&
- !(f_info[c_ptr->feat].flags1 & (FF1_DOOR))) return;
-
- /* Set flags */
- if (f_info[c_ptr->feat].flags1 & FF1_DOOR) flags = FTRAP_DOOR;
- else flags = FTRAP_FLOOR;
-
- /* Try 100 times */
- cnt = 100;
- while (cnt--)
- {
- trap = randint(max_t_idx - 1);
- t_ptr = &t_info[trap];
-
- /* No traps below their minlevel */
- if (t_ptr->minlevel > dun_level) continue;
-
- /* is this a correct trap now? */
- if (!(t_ptr->flags & flags)) continue;
-
- /*
- * Hack -- No trap door at the bottom of dungeon or in flat
- * (non dungeon) places or on quest levels
- */
- if ((trap == TRAP_OF_SINKING) &&
- ((d_ptr->maxdepth == dun_level) ||
- (dungeon_flags1 & DF1_FLAT) || (is_quest(dun_level))) )
- {
- continue;
- }
-
- /* How probable is this trap */
- if (rand_int(100) < t_ptr->probability)
- {
- c_ptr->t_idx = trap;
- break;
- }
- }
-
- return;
-}
-
-
-/*
- * Place a leveled trap at given position
- */
-void place_trap_leveled(int y, int x, int lev)
-{
- int prev_dun_level = dun_level;
- dun_level = lev;
- place_trap(y,x);
- dun_level = prev_dun_level;
-}
-
-/*
- * Places a random trap on the given chest.
- *
- * The object must be a valid chest.
- */
-void place_trap_object(object_type *o_ptr)
-{
- s16b trap;
- trap_type *t_ptr;
- int cnt;
-
- /* No traps in town or on first level */
- if (dun_level <= 1)
- {
- /* empty chest were already looted, therefore known */
- o_ptr->ident |= IDENT_KNOWN;
- return;
- }
-
- /* Try 100 times */
- cnt = 100;
- while (cnt--)
- {
- trap = randint(max_t_idx - 1);
- t_ptr = &t_info[trap];
-
- /* no traps below their minlevel */
- if (t_ptr->minlevel > dun_level) continue;
-
- /* Is this a correct trap now? */
- if (!(t_ptr->flags & FTRAP_CHEST)) continue;
-
- /* How probable is this trap */
- if (rand_int(100) < t_ptr->probability)
- {
- o_ptr->pval = trap;
- break;
- }
- }
-
- return;
-}
-
-/* Dangerous trap placing function */
-void wiz_place_trap(int y, int x, int idx)
-{
- cave_type *c_ptr = &cave[y][x];
-
- /* Dangerous enough as it is... */
- if (!cave_floor_grid(c_ptr) && (!(f_info[c_ptr->feat].flags1 & FF1_DOOR))) return;
-
- c_ptr->t_idx = idx;
-}
-
-/*
- * Here begin monster traps code
- */
-
-/*
- * Hook to determine if an object is a device
- */
-static bool item_tester_hook_device(object_type const *o_ptr)
-{
- return (((o_ptr->tval == TV_ROD_MAIN) && (o_ptr->pval != 0)) ||
- (o_ptr->tval == TV_STAFF) ||
- (o_ptr->tval == TV_WAND));
-}
-
-/*
- * The trap setting code for rogues -MWK-
- *
- * Also, it will fail or give weird results if the tvals are resorted!
- */
-void do_cmd_set_trap(void)
-{
- int item_kit, item_load, i;
- int num;
-
- object_type *o_ptr, *j_ptr, *i_ptr;
-
- cptr q, s, c;
-
- object_type object_type_body;
-
- u32b f1, f2, f3, f4, f5, esp;
-
- /* Check some conditions */
- if (p_ptr->blind)
- {
- msg_print("You can't see anything.");
- return;
- }
- if (no_lite())
- {
- msg_print("You don't dare to set a trap in the darkness.");
- return;
- }
- if (p_ptr->confused)
- {
- msg_print("You are too confused!");
- return;
- }
-
- /* Only set traps on clean floor grids */
- if (!cave_clean_bold(p_ptr->py, p_ptr->px))
- {
- msg_print("You cannot set a trap on this.");
- return;
- }
-
- /* Get an item */
- q = "Use which trapping kit? ";
- s = "You have no trapping kits.";
- if (!get_item(&item_kit,
- q, s,
- USE_INVEN,
- object_filter::TVal(TV_TRAPKIT)))
- {
- return;
- }
-
- o_ptr = &p_ptr->inventory[item_kit];
-
- /* Trap kits need a second object */
- object_filter_t object_filter = object_filter::Or(
- object_filter::And(
- object_filter::SVal(SV_TRAPKIT_BOW),
- object_filter::TVal(TV_ARROW)),
- object_filter::And(
- object_filter::SVal(SV_TRAPKIT_XBOW),
- object_filter::TVal(TV_BOLT)),
- object_filter::And(
- object_filter::SVal(SV_TRAPKIT_SLING),
- object_filter::TVal(TV_SHOT)),
- object_filter::And(
- object_filter::SVal(SV_TRAPKIT_POTION),
- object_filter::Or(
- object_filter::TVal(TV_POTION),
- object_filter::TVal(TV_POTION2))),
- object_filter::And(
- object_filter::SVal(SV_TRAPKIT_SCROLL),
- object_filter::TVal(TV_SCROLL)),
- object_filter::And(
- object_filter::SVal(SV_TRAPKIT_DEVICE),
- &item_tester_hook_device));
-
- /* Get the second item */
- q = "Load with what? ";
- s = "You have nothing to load that trap with.";
- if (!get_item(&item_load, q, s, USE_INVEN, object_filter)) return;
-
- /* Get the second object */
- j_ptr = &p_ptr->inventory[item_load];
-
- /* Assume a single object */
- num = 1;
-
- /* In some cases, take multiple objects to load */
- if (o_ptr->sval != SV_TRAPKIT_DEVICE)
- {
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- if ((f3 & TR3_XTRA_SHOTS) && (o_ptr->pval > 0)) num += o_ptr->pval;
-
- if (f2 & (TRAP2_AUTOMATIC_5 | TRAP2_AUTOMATIC_99)) num = 99;
-
- if (num > j_ptr->number) num = j_ptr->number;
-
- c = format("How many (1-%d)? ", num);
-
- /* Ask for number of items to use */
- num = get_quantity(c, num);
- }
-
- /* Canceled */
- if (!num) return;
-
- /* Take a turn */
- energy_use = 100;
-
- /* Get local object */
- i_ptr = &object_type_body;
-
- /* Obtain local object for trap content */
- object_copy(i_ptr, j_ptr);
-
- /* Set number */
- i_ptr->number = num;
-
- /* Drop it here */
- cave[p_ptr->py][p_ptr->px].special = floor_carry(p_ptr->py, p_ptr->px, i_ptr);
-
- /* Obtain local object for trap trigger kit */
- object_copy(i_ptr, o_ptr);
-
- /* Set number */
- i_ptr->number = 1;
-
- /* Drop it here */
- cave[p_ptr->py][p_ptr->px].special2 = floor_carry(p_ptr->py, p_ptr->px, i_ptr);
-
- /* Modify, Describe, Optimize */
- inc_stack_size_ex(item_kit, -1, NO_OPTIMIZE, DESCRIBE);
- inc_stack_size_ex(item_load, -num, NO_OPTIMIZE, DESCRIBE);
-
- for (i = 0; i < INVEN_WIELD; i++)
- {
- if (inven_item_optimize(i)) break;
- }
- for (i = 0; i < INVEN_WIELD; i++)
- {
- inven_item_optimize(i);
- }
-
- /* Actually set the trap */
- cave_set_feat(p_ptr->py, p_ptr->px, FEAT_MON_TRAP);
-}
-
-/*
- * Monster hitting a rod trap -MWK-
- *
- * Return TRUE if the monster died
- */
-bool_ mon_hit_trap_aux_rod(int m_idx, object_type *o_ptr)
-{
- int dam = 0, typ = 0;
- int rad = 0;
- monster_type *m_ptr = &m_list[m_idx];
- int y = m_ptr->fy;
- int x = m_ptr->fx;
-
- /* Depend on rod type */
- switch (o_ptr->pval)
- {
- case SV_ROD_DETECT_TRAP:
- m_ptr->smart |= SM_NOTE_TRAP;
- break;
- case SV_ROD_DETECTION:
- m_ptr->smart |= SM_NOTE_TRAP;
- break;
- case SV_ROD_ILLUMINATION:
- typ = GF_LITE_WEAK;
- dam = damroll(2, 15);
- rad = 3;
- lite_room(y, x);
- break;
- case SV_ROD_CURING:
- typ = GF_OLD_HEAL;
- dam = damroll(3, 4); /* and heal conf? */
- break;
- case SV_ROD_HEALING:
- typ = GF_OLD_HEAL;
- dam = 300;
- break;
- case SV_ROD_SPEED:
- typ = GF_OLD_SPEED;
- dam = 50;
- break;
- case SV_ROD_TELEPORT_AWAY:
- typ = GF_AWAY_ALL;
- dam = MAX_SIGHT * 5;
- break;
- case SV_ROD_DISARMING:
- break;
- case SV_ROD_LITE:
- typ = GF_LITE_WEAK;
- dam = damroll(6, 8);
- break;
- case SV_ROD_SLEEP_MONSTER:
- typ = GF_OLD_SLEEP;
- dam = 50;
- break;
- case SV_ROD_SLOW_MONSTER:
- typ = GF_OLD_SLOW;
- dam = 50;
- break;
- case SV_ROD_DRAIN_LIFE:
- typ = GF_OLD_DRAIN;
- dam = 75;
- break;
- case SV_ROD_POLYMORPH:
- typ = GF_OLD_POLY;
- dam = 50;
- break;
- case SV_ROD_ACID_BOLT:
- typ = GF_ACID;
- dam = damroll(6, 8);
- break;
- case SV_ROD_ELEC_BOLT:
- typ = GF_ELEC;
- dam = damroll(3, 8);
- break;
- case SV_ROD_FIRE_BOLT:
- typ = GF_FIRE;
- dam = damroll(8, 8);
- break;
- case SV_ROD_COLD_BOLT:
- typ = GF_COLD;
- dam = damroll(5, 8);
- break;
- case SV_ROD_ACID_BALL:
- typ = GF_ACID;
- dam = 60;
- rad = 2;
- break;
- case SV_ROD_ELEC_BALL:
- typ = GF_ELEC;
- dam = 32;
- rad = 2;
- break;
- case SV_ROD_FIRE_BALL:
- typ = GF_FIRE;
- dam = 72;
- rad = 2;
- break;
- case SV_ROD_COLD_BALL:
- typ = GF_COLD;
- dam = 48;
- rad = 2;
- break;
- default:
- return (FALSE);
- }
-
- /* Actually hit the monster */
- if (typ) (void) project( -2, rad, y, x, dam, typ, PROJECT_KILL | PROJECT_ITEM | PROJECT_JUMP);
- return (cave[y][x].m_idx == 0 ? TRUE : FALSE);
-}
-
-/*
- * Monster hitting a staff trap -MWK-
- *
- * Return TRUE if the monster died
- */
-bool_ mon_hit_trap_aux_staff(int m_idx, object_type *o_ptr)
-{
- return (FALSE);
-}
-
-/*
- * Monster hitting a scroll trap -MWK-
- *
- * Return TRUE if the monster died
- */
-bool_ mon_hit_trap_aux_scroll(int m_idx, int sval)
-{
- monster_type *m_ptr = &m_list[m_idx];
- int dam = 0, typ = 0;
- int rad = 0;
- int y = m_ptr->fy;
- int x = m_ptr->fx;
- int k;
-
- /* Depend on scroll type */
- switch (sval)
- {
- case SV_SCROLL_CURSE_ARMOR:
- case SV_SCROLL_CURSE_WEAPON:
- case SV_SCROLL_TRAP_CREATION: /* these don't work :-( */
- case SV_SCROLL_WORD_OF_RECALL: /* should these? */
- case SV_SCROLL_IDENTIFY:
- case SV_SCROLL_STAR_IDENTIFY:
- case SV_SCROLL_MAPPING:
- case SV_SCROLL_DETECT_GOLD:
- case SV_SCROLL_DETECT_ITEM:
- case SV_SCROLL_REMOVE_CURSE:
- case SV_SCROLL_STAR_REMOVE_CURSE:
- case SV_SCROLL_ENCHANT_ARMOR:
- case SV_SCROLL_ENCHANT_WEAPON_TO_HIT:
- case SV_SCROLL_ENCHANT_WEAPON_TO_DAM:
- case SV_SCROLL_STAR_ENCHANT_ARMOR:
- case SV_SCROLL_STAR_ENCHANT_WEAPON:
- case SV_SCROLL_RECHARGING:
- case SV_SCROLL_DETECT_DOOR:
- case SV_SCROLL_DETECT_INVIS:
- case SV_SCROLL_SATISFY_HUNGER:
- case SV_SCROLL_RUNE_OF_PROTECTION:
- case SV_SCROLL_TRAP_DOOR_DESTRUCTION:
- case SV_SCROLL_PROTECTION_FROM_EVIL:
- return (FALSE);
- case SV_SCROLL_DARKNESS:
- unlite_room(y, x);
- typ = GF_DARK_WEAK;
- dam = 10;
- rad = 3;
- break;
- case SV_SCROLL_AGGRAVATE_MONSTER:
- aggravate_monsters(m_idx);
- return (FALSE);
- case SV_SCROLL_SUMMON_MONSTER:
- for (k = 0; k < randint(3) ; k++) summon_specific(y, x, dun_level, 0);
- return (FALSE);
- case SV_SCROLL_SUMMON_UNDEAD:
- for (k = 0; k < randint(3) ; k++) summon_specific(y, x, dun_level, SUMMON_UNDEAD);
- return (FALSE);
- case SV_SCROLL_PHASE_DOOR:
- typ = GF_AWAY_ALL;
- dam = 10;
- break;
- case SV_SCROLL_TELEPORT:
- typ = GF_AWAY_ALL;
- dam = 100;
- break;
- case SV_SCROLL_TELEPORT_LEVEL:
- delete_monster(y, x);
- return (TRUE);
- case SV_SCROLL_LIGHT:
- lite_room(y, x);
- typ = GF_LITE_WEAK;
- dam = damroll(2, 8);
- rad = 2;
- break;
- case SV_SCROLL_DETECT_TRAP:
- m_ptr->smart |= SM_NOTE_TRAP;
- return (FALSE);
- case SV_SCROLL_BLESSING:
- typ = GF_HOLY_FIRE;
- dam = damroll(1, 4);
- break;
- case SV_SCROLL_HOLY_CHANT:
- typ = GF_HOLY_FIRE;
- dam = damroll(2, 4);
- break;
- case SV_SCROLL_HOLY_PRAYER:
- typ = GF_HOLY_FIRE;
- dam = damroll(4, 4);
- break;
- case SV_SCROLL_MONSTER_CONFUSION:
- typ = GF_OLD_CONF;
- dam = damroll(5, 10);
- break;
- case SV_SCROLL_STAR_DESTRUCTION:
- destroy_area(y, x, 15);
- return (FALSE);
- case SV_SCROLL_DISPEL_UNDEAD:
- typ = GF_DISP_UNDEAD;
- rad = 5;
- dam = 60;
- break;
- case SV_SCROLL_GENOCIDE:
- {
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
- genocide_aux(FALSE, r_ptr->d_char);
- /* although there's no point in a multiple genocide trap... */
- return (!(r_ptr->flags1 & RF1_UNIQUE));
- }
- case SV_SCROLL_MASS_GENOCIDE:
- for (k = 0; k < 8; k++)
- delete_monster(y + ddy[k], x + ddx[k]);
- delete_monster(y, x);
- return (TRUE);
- case SV_SCROLL_ACQUIREMENT:
- acquirement(y, x, 1, TRUE, FALSE);
- return (FALSE);
- case SV_SCROLL_STAR_ACQUIREMENT:
- acquirement(y, x, randint(2) + 1, TRUE, FALSE);
- return (FALSE);
- default:
- return (FALSE);
- }
-
- /* Actually hit the monster */
- (void) project( -2, rad, y, x, dam, typ, PROJECT_KILL | PROJECT_ITEM | PROJECT_JUMP);
- return (cave[y][x].m_idx == 0 ? TRUE : FALSE);
-}
-
-/*
- * Monster hitting a wand trap -MWK-
- *
- * Return TRUE if the monster died
- */
-bool_ mon_hit_trap_aux_wand(int m_idx, object_type *o_ptr)
-{
- return (FALSE);
-}
-
-/*
- * Monster hitting a potions trap -MWK-
- *
- * Return TRUE if the monster died
- */
-bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr)
-{
- monster_type *m_ptr = &m_list[m_idx];
- int dam = 0, typ = 0;
- int y = m_ptr->fy;
- int x = m_ptr->fx;
- int sval = o_ptr->sval;
-
- /* Depend on potion type */
- if (o_ptr->tval == TV_POTION)
- {
- switch (sval)
- {
- /* Nothing happens */
- case SV_POTION_WATER:
- case SV_POTION_APPLE_JUICE:
- case SV_POTION_SLIME_MOLD:
- case SV_POTION_SALT_WATER:
- case SV_POTION_DEC_STR:
- case SV_POTION_DEC_INT:
- case SV_POTION_DEC_WIS:
- case SV_POTION_DEC_DEX:
- case SV_POTION_DEC_CON:
- case SV_POTION_DEC_CHR:
- case SV_POTION_INFRAVISION:
- case SV_POTION_DETECT_INVIS:
- case SV_POTION_SLOW_POISON:
- case SV_POTION_CURE_POISON:
- case SV_POTION_RESIST_HEAT:
- case SV_POTION_RESIST_COLD:
- case SV_POTION_RESTORE_MANA:
- case SV_POTION_RESTORE_EXP:
- case SV_POTION_RES_STR:
- case SV_POTION_RES_INT:
- case SV_POTION_RES_WIS:
- case SV_POTION_RES_DEX:
- case SV_POTION_RES_CON:
- case SV_POTION_RES_CHR:
- case SV_POTION_INC_STR:
- case SV_POTION_INC_INT:
- case SV_POTION_INC_WIS:
- case SV_POTION_INC_DEX:
- case SV_POTION_INC_CON:
- case SV_POTION_INC_CHR:
- case SV_POTION_AUGMENTATION:
- case SV_POTION_RUINATION: /* ??? */
- case SV_POTION_ENLIGHTENMENT:
- case SV_POTION_STAR_ENLIGHTENMENT:
- case SV_POTION_SELF_KNOWLEDGE:
- return (FALSE);
-
- case SV_POTION_EXPERIENCE:
- if (m_ptr->level < MONSTER_LEVEL_MAX)
- {
- m_ptr->exp = monster_exp(m_ptr->level + 1);
- monster_check_experience(m_idx, FALSE);
- }
- return (FALSE);
- case SV_POTION_SLOWNESS:
- typ = GF_OLD_SLOW;
- dam = damroll(4, 6);
- break;
- case SV_POTION_POISON:
- typ = GF_POIS;
- dam = damroll(8, 6);
- break;
- case SV_POTION_CONFUSION:
- typ = GF_CONFUSION;
- dam = damroll(4, 6);
- break;
- case SV_POTION_BLINDNESS:
- typ = GF_DARK;
- dam = 10;
- break;
- case SV_POTION_SLEEP:
- typ = GF_OLD_SLEEP;
- dam = damroll (4, 6);
- break;
- case SV_POTION_LOSE_MEMORIES:
- typ = GF_OLD_CONF;
- dam = damroll(10, 10);
- break;
- case SV_POTION_DETONATIONS:
- typ = GF_DISINTEGRATE;
- dam = damroll(20, 20);
- break;
- case SV_POTION_DEATH:
- typ = GF_NETHER;
- dam = damroll(100, 20);
- break;
- case SV_POTION_BOLDNESS:
- m_ptr->monfear = 0;
- return (FALSE);
- case SV_POTION_SPEED:
- typ = GF_OLD_SPEED;
- dam = damroll(5, 10);
- break;
- case SV_POTION_HEROISM:
- case SV_POTION_BESERK_STRENGTH:
- m_ptr->monfear = 0;
- typ = GF_OLD_HEAL;
- dam = damroll(2, 10);
- break;
- case SV_POTION_CURE_LIGHT:
- typ = GF_OLD_HEAL;
- dam = damroll(3, 4);
- break;
- case SV_POTION_CURE_SERIOUS:
- typ = GF_OLD_HEAL;
- dam = damroll(4, 6);
- break;
- case SV_POTION_CURE_CRITICAL:
- typ = GF_OLD_HEAL;
- dam = damroll(6, 8);
- break;
- case SV_POTION_HEALING:
- typ = GF_OLD_HEAL;
- dam = 300;
- break;
- case SV_POTION_STAR_HEALING:
- typ = GF_OLD_HEAL;
- dam = 1000;
- break;
- case SV_POTION_LIFE:
- {
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
- if (r_ptr->flags3 & RF3_UNDEAD)
- {
- typ = GF_HOLY_FIRE;
- dam = damroll(20, 20);
- }
- else
- {
- typ = GF_OLD_HEAL;
- dam = 5000;
- }
- break;
- }
- default:
- return (FALSE);
-
- }
- }
- else
- {}
-
- /* Actually hit the monster */
- (void) project_m( -2, 0, y, x, dam, typ);
- return (cave[y][x].m_idx == 0 ? TRUE : FALSE);
-}
-
-/*
- * Monster hitting a monster trap -MWK-
- * Returns True if the monster died, false otherwise
- */
-bool_ mon_hit_trap(int m_idx)
-{
- monster_type *m_ptr = &m_list[m_idx];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
- u32b f1, f2, f3, f4, f5, esp;
-
- object_type object_type_body;
-
- int mx = m_ptr->fx;
- int my = m_ptr->fy;
-
- int difficulty;
- int smartness;
-
- char m_name[80];
-
- bool_ notice = FALSE;
- bool_ disarm = FALSE;
- bool_ remove = FALSE;
- bool_ dead = FALSE;
- bool_ fear = FALSE;
- s32b special = 0;
-
- int dam, chance, shots;
- int mul = 0;
- int breakage = -1;
-
- int cost = 0;
-
- /* Get the trap objects */
- auto kit_o_idx = cave[my][mx].special2;
- auto kit_o_ptr = &o_list[kit_o_idx];
- auto load_o_ptr = &o_list[cave[my][mx].special];
- auto j_ptr = &object_type_body;
-
- /* Get trap properties */
- object_flags(kit_o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- /* Can set off check */
- /* Ghosts only set off Ghost traps */
- if ((r_ptr->flags2 & RF2_PASS_WALL) && !(f2 & TRAP2_KILL_GHOST)) return (FALSE);
-
- /* Some traps are specialized to some creatures */
- if (f2 & TRAP2_ONLY_MASK)
- {
- bool_ affect = FALSE;
- if ((f2 & TRAP2_ONLY_DRAGON) && (r_ptr->flags3 & RF3_DRAGON)) affect = TRUE;
- if ((f2 & TRAP2_ONLY_DEMON) && (r_ptr->flags3 & RF3_DEMON)) affect = TRUE;
- if ((f2 & TRAP2_ONLY_UNDEAD) && (r_ptr->flags3 & RF3_UNDEAD)) affect = TRUE;
- if ((f2 & TRAP2_ONLY_EVIL) && (r_ptr->flags3 & RF3_EVIL)) affect = TRUE;
- if ((f2 & TRAP2_ONLY_ANIMAL) && (r_ptr->flags3 & RF3_ANIMAL)) affect = TRUE;
-
- /* Don't set it off if forbidden */
- if (!affect) return (FALSE);
- }
-
- /* Get detection difficulty */
- difficulty = 25;
-
- /* Some traps are well-hidden */
- if (f1 & TR1_STEALTH)
- {
- difficulty += 10 * (kit_o_ptr->pval);
- }
-
- /* Get monster smartness for trap detection */
- /* Higher level monsters are smarter */
- smartness = r_ptr->level;
-
- /* Smart monsters are better at detecting traps */
- if (r_ptr->flags2 & RF2_SMART) smartness += 10;
-
- /* Some monsters have already noticed one of out traps */
- if (m_ptr->smart & SM_NOTE_TRAP) smartness += 20;
-
- /* Stupid monsters are no good at detecting traps */
- if (r_ptr->flags2 & (RF2_STUPID | RF2_EMPTY_MIND)) smartness = -150;
-
- /* Check if the monster notices the trap */
- if (randint(300) > (difficulty - smartness + 150)) notice = TRUE;
-
- /* Disarm check */
- if (notice)
- {
- /* The next traps will be easier to spot! */
- m_ptr->smart |= SM_NOTE_TRAP;
-
- /* Get trap disarming difficulty */
- difficulty = (kit_o_ptr->ac + kit_o_ptr->to_a);
-
- /* Get monster disarming ability */
- /* Higher level monsters are better */
- smartness = r_ptr->level / 5;
-
- /* Smart monsters are better at disarming */
- if (r_ptr->flags2 & RF2_SMART) smartness *= 2;
-
- /* Stupid monsters never disarm traps */
- if (r_ptr->flags2 & RF2_STUPID) smartness = -150;
-
- /* Nonsmart animals never disarm traps */
- if ((r_ptr->flags3 & RF3_ANIMAL) && !(r_ptr->flags2 & RF2_SMART)) smartness = -150;
-
- /* Check if the monster disarms the trap */
- if (randint(120) > (difficulty - smartness + 80)) disarm = TRUE;
- }
-
- /* If disarmed, remove the trap and print a message */
- if (disarm)
- {
- remove = TRUE;
-
- if (m_ptr->ml)
- {
- /* Get the name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Print a message */
- msg_format("%^s disarms a trap!", m_name);
- }
- }
-
- /* Otherwise, activate the trap! */
- else
- {
- /* Message for visible monster */
- if (m_ptr->ml)
- {
- /* Get the name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Print a message */
- msg_format("%^s sets off a trap!", m_name);
- }
- else
- {
- /* No message if monster isn't visible ? */
- }
-
- /* Next time be more careful */
- if (randint(100) < 80) m_ptr->smart |= SM_NOTE_TRAP;
-
- /* Actually activate the trap */
- switch (kit_o_ptr->sval)
- {
- case SV_TRAPKIT_BOW:
- case SV_TRAPKIT_XBOW:
- case SV_TRAPKIT_SLING:
- {
- /* Get number of shots */
- shots = 1;
- if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval;
- if (shots <= 0) shots = 1;
- if (shots > load_o_ptr->number) shots = load_o_ptr->number;
-
- while (shots-- && !dead)
- {
- /* Total base damage */
- dam = damroll(load_o_ptr->dd, load_o_ptr->ds) + load_o_ptr->to_d + kit_o_ptr->to_d;
-
- /* Total hit probability */
- chance = (kit_o_ptr->to_h + load_o_ptr->to_h + 20) * BTH_PLUS_ADJ;
-
- /* Damage multiplier */
- if (kit_o_ptr->sval == SV_TRAPKIT_BOW) mul = 3;
- if (kit_o_ptr->sval == SV_TRAPKIT_XBOW) mul = 4;
- if (kit_o_ptr->sval == SV_TRAPKIT_SLING) mul = 2;
- if (f3 & TR3_XTRA_MIGHT) mul += kit_o_ptr->pval;
- if (mul < 0) mul = 0;
-
- /* Multiply damage */
- dam *= mul;
-
- /* Check if we hit the monster */
- if (test_hit_fire(chance, r_ptr->ac, TRUE))
- {
- /* Assume a default death */
- cptr note_dies = " dies.";
-
- /* Some monsters get "destroyed" */
- if ((r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags2 & (RF2_STUPID)) ||
- (strchr("Evg", r_ptr->d_char)))
- {
- /* Special note at death */
- note_dies = " is destroyed.";
- }
-
- /* Message if visible */
- if (m_ptr->ml)
- {
- /* describe the monster (again, just in case :-) */
- monster_desc(m_name, m_ptr, 0);
-
- /* Print a message */
- msg_format("%^s is hit by a missile.", m_name);
- }
-
- /* Apply slays, brand, critical hits */
- dam = tot_dam_aux(load_o_ptr, dam, m_ptr, &special);
- dam = critical_shot(load_o_ptr->weight, load_o_ptr->to_h, dam, SKILL_ARCHERY);
-
- /* No negative damage */
- if (dam < 0) dam = 0;
-
- /* Hit the monster, check for death */
- if (mon_take_hit(m_idx, dam, &fear, note_dies))
- {
- /* Dead monster */
- dead = TRUE;
- }
-
- /* No death */
- else
- {
- /* Message */
- message_pain(m_idx, dam);
-
- if (special) attack_special(m_ptr, special, dam);
-
- /* Take note */
- if (fear && m_ptr->ml)
- {
- /* Message */
- msg_format("%^s flees in terror!", m_name);
- }
- }
-
- }
-
- /* Exploding ammo */
- if (load_o_ptr->pval2 != 0)
- {
- int rad = 0;
- int dam = (damroll(load_o_ptr->dd, load_o_ptr->ds) + load_o_ptr->to_d)*2;
- int flag = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL |
- PROJECT_JUMP;
-
- switch (load_o_ptr->sval)
- {
- case SV_AMMO_LIGHT:
- rad = 2;
- dam /= 2;
- break;
- case SV_AMMO_NORMAL:
- rad = 3;
- break;
- case SV_AMMO_HEAVY:
- rad = 4;
- dam *= 2;
- break;
- }
-
- project(0, rad, my, mx, dam, load_o_ptr->pval2, flag);
-
- breakage = 100;
- }
- else
- {
- breakage = breakage_chance(load_o_ptr);
- }
-
- /* Copy and decrease ammo */
- object_copy(j_ptr, load_o_ptr);
-
- j_ptr->number = 1;
-
- load_o_ptr->number--;
-
- if (load_o_ptr->number <= 0)
- {
- remove = TRUE;
- delete_object_idx(kit_o_idx);
- }
-
- /* Drop (or break) near that location */
- drop_near(j_ptr, breakage, my, mx);
-
- }
-
- break;
- }
-
- case SV_TRAPKIT_POTION:
- {
- /* Get number of shots */
- shots = 1;
- if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval;
- if (shots <= 0) shots = 1;
- if (shots > load_o_ptr->number) shots = load_o_ptr->number;
-
- while (shots-- && !dead)
- {
-
- /* Message if visible */
- if (m_ptr->ml)
- {
- /* describe the monster (again, just in case :-) */
- monster_desc(m_name, m_ptr, 0);
-
- /* Print a message */
- msg_format("%^s is hit by fumes.", m_name);
- }
-
- /* Get the potion effect */
- dead = mon_hit_trap_aux_potion(m_idx, load_o_ptr);
-
- /* Copy and decrease ammo */
- object_copy(j_ptr, load_o_ptr);
-
- j_ptr->number = 1;
-
- load_o_ptr->number--;
-
- if (load_o_ptr->number <= 0)
- {
- remove = TRUE;
- delete_object_idx(kit_o_idx);
- }
- }
-
- break;
- }
-
- case SV_TRAPKIT_SCROLL:
- {
- /* Get number of shots */
- shots = 1;
- if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval;
- if (shots <= 0) shots = 1;
- if (shots > load_o_ptr->number) shots = load_o_ptr->number;
-
- while (shots-- && !dead)
- {
-
- /* Message if visible */
- if (m_ptr->ml)
- {
- /* describe the monster (again, just in case :-) */
- monster_desc(m_name, m_ptr, 0);
-
- /* Print a message */
- msg_format("%^s activates a spell!", m_name);
- }
-
- /* Get the potion effect */
- dead = mon_hit_trap_aux_scroll(m_idx, load_o_ptr->sval);
-
- /* Copy and decrease ammo */
- object_copy(j_ptr, load_o_ptr);
-
- j_ptr->number = 1;
-
- load_o_ptr->number--;
-
- if (load_o_ptr->number <= 0)
- {
- remove = TRUE;
- delete_object_idx(kit_o_idx);
- }
- }
-
- break;
- }
-
- case SV_TRAPKIT_DEVICE:
- {
- if (load_o_ptr->tval == TV_ROD_MAIN)
- {
- /* Extract mana cost of the rod tip */
- u32b tf1, tf2, tf3, tf4, tf5, tesp;
- object_kind *tip_o_ptr = &k_info[lookup_kind(TV_ROD, load_o_ptr->pval)];
- object_flags(load_o_ptr, &tf1, &tf2, &tf3, &tf4, &tf5, &tesp);
- cost = (tf4 & TR4_CHEAPNESS) ? tip_o_ptr->pval / 2 : tip_o_ptr->pval;
- if (cost <= 0) cost = 1;
- }
-
- /* Get number of shots */
- shots = 1;
- if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval;
- if (shots <= 0) shots = 1;
-
- if (load_o_ptr->tval == TV_ROD_MAIN)
- {
- if (shots > load_o_ptr->timeout / cost) shots = load_o_ptr->timeout / cost;
- }
- else
- {
- if (shots > load_o_ptr->pval) shots = load_o_ptr->pval;
- }
-
- while (shots-- && !dead)
- {
- /* Get the effect effect */
- switch (load_o_ptr->tval)
- {
- case TV_ROD_MAIN:
- dead = mon_hit_trap_aux_rod(m_idx, load_o_ptr);
- break;
- case TV_WAND:
- dead = mon_hit_trap_aux_wand(m_idx, load_o_ptr);
- break;
- case TV_STAFF:
- dead = mon_hit_trap_aux_staff(m_idx, load_o_ptr);
- break;
- }
-
- if (load_o_ptr->tval == TV_ROD_MAIN)
- {
- /* decrease stored mana (timeout) for rods */
- load_o_ptr->timeout -= cost;
- }
- else
- {
- /* decrease charges for wands and staves */
- load_o_ptr->pval--;
- }
- }
-
- break;
- }
-
- default:
- msg_print("oops! nonexistant trap!");
-
- }
-
- /* Non-automatic traps are removed */
- if (!(f2 & (TRAP2_AUTOMATIC_5 | TRAP2_AUTOMATIC_99)))
- {
- remove = TRUE;
- }
- else if (f2 & TRAP2_AUTOMATIC_5) remove = (randint(5) == 1);
-
- }
-
- /* Special trap effect -- teleport to */
- if ((f2 & TRAP2_TELEPORT_TO) && (!disarm) && (!dead))
- {
- teleport_monster_to(m_idx, p_ptr->py, p_ptr->px);
- }
-
- /* Remove the trap if inactive now */
- if (remove) place_floor_convert_glass(my, mx);
-
- /* did it die? */
- return (dead);
-}
-
diff --git a/src/traps.hpp b/src/traps.hpp
deleted file mode 100644
index 3df1e430..00000000
--- a/src/traps.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#pragma once
-
-#include "h-basic.h"
-#include "object_type_fwd.hpp"
-
-extern bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item);
-extern void player_activate_door_trap(s16b y, s16b x);
-extern void place_trap(int y, int x);
-extern void place_trap_leveled(int y, int x, int lev);
-extern void place_trap_object(object_type *o_ptr);
-extern void wiz_place_trap(int y, int x, int idx);
-extern void do_cmd_set_trap(void);
-extern bool_ mon_hit_trap(int);
diff --git a/src/util.cc b/src/util.cc
index 08af0658..7d795828 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -8,6 +8,7 @@
#include "cli_comm.hpp"
#include "cmd3.hpp"
#include "cmd4.hpp"
+#include "game.hpp"
#include "init1.hpp"
#include "messages.hpp"
#include "monster_ego.hpp"
@@ -17,7 +18,6 @@
#include "player_race.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
#include "tables.h"
#include "tables.hpp"
#include "timer_type.hpp"
@@ -27,6 +27,7 @@
#include <boost/algorithm/string/predicate.hpp>
#include <chrono>
+#include <sstream>
#include <thread>
using boost::algorithm::iequals;
@@ -36,23 +37,23 @@ using std::chrono::milliseconds;
/*
* Find a default user name from the system.
*/
-void user_name(char *buf, int id)
+std::string user_name()
{
#ifdef SET_UID
+ /* Get the user id (?) */
+ int player_uid = getuid();
+
struct passwd *pw;
/* Look up the user name */
- if ((pw = getpwuid(id)))
+ if ((pw = getpwuid(player_uid)))
{
- (void)strcpy(buf, pw->pw_name);
- buf[16] = '\0';
-
- return;
+ return pw->pw_name;
}
#endif /* SET_UID */
- /* Oops. Hack -- default to "PLAYER" */
- strcpy(buf, "PLAYER");
+ /* Default to "PLAYER" if we don't have platform support */
+ return "PLAYER";
}
@@ -70,8 +71,6 @@ void user_name(char *buf, int id)
* to assume that all filenames are "Unix" filenames, and explicitly "extract"
* such filenames if needed (by "path_parse()", or perhaps "path_canon()").
*
-* Note that "path_temp" should probably return a "canonical" filename.
-*
* Note that "my_fopen()" and "my_open()" and "my_make()" and "my_kill()"
* and "my_move()" and "my_copy()" should all take "canonical" filenames.
*
@@ -126,7 +125,7 @@ errr path_parse(char *buf, int max, cptr file)
if (!u) return (1);
- (void)strcpy(buf, u);
+ strcpy(buf, u);
#else
/* Look up password data for user */
pw = getpwuid(getuid());
@@ -135,11 +134,11 @@ errr path_parse(char *buf, int max, cptr file)
if (!pw) return (1);
/* Make use of the info */
- (void)strcpy(buf, pw->pw_dir);
+ strcpy(buf, pw->pw_dir);
#endif
/* Append the rest of the filename, if any */
- if (s) (void)strcat(buf, s);
+ if (s) strcat(buf, s);
/* Success */
return (0);
@@ -169,42 +168,6 @@ errr path_parse(char *buf, int max, cptr file)
/*
-* Hack -- acquire a "temporary" file name if possible
-*
-* This filename is always in "system-specific" form.
-*/
-errr path_temp(char *buf, int max)
-{
-#ifdef WINDOWS
- static u32b tmp_counter;
- static char valid_characters[] =
- "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- char rand_ext[4];
-
- rand_ext[0] = valid_characters[rand_int(sizeof (valid_characters))];
- rand_ext[1] = valid_characters[rand_int(sizeof (valid_characters))];
- rand_ext[2] = valid_characters[rand_int(sizeof (valid_characters))];
- rand_ext[3] = '\0';
- strnfmt(buf, max, "%s/t_%ud.%s", ANGBAND_DIR_XTRA, tmp_counter, rand_ext);
- tmp_counter++;
-#else
- cptr s;
-
- /* Temp file */
- s = tmpnam(NULL);
-
- /* Oops */
- if (!s) return ( -1);
-
- /* Format to length */
- strnfmt(buf, max, "%s", s);
-#endif
- /* Success */
- return (0);
-}
-
-
-/*
* Create a new path by appending a file (or directory) to a path
*
* This requires no special processing on simple machines, except
@@ -381,7 +344,7 @@ errr fd_kill(cptr file)
if (path_parse(buf, 1024, file)) return ( -1);
/* Remove */
- (void)remove(buf);
+ remove(buf);
/* XXX XXX XXX */
return (0);
@@ -403,7 +366,7 @@ errr fd_move(cptr file, cptr what)
if (path_parse(aux, 1024, what)) return ( -1);
/* Rename */
- (void)rename(buf, aux);
+ rename(buf, aux);
/* XXX XXX XXX */
return (0);
@@ -551,7 +514,7 @@ errr fd_close(int fd)
if (fd < 0) return ( -1);
/* Close */
- (void)close(fd);
+ close(fd);
/* XXX XXX XXX */
return (0);
@@ -1250,7 +1213,7 @@ static bool_ parse_under = FALSE;
* This is not only more efficient, but also necessary to make sure
* that various "inkey()" codes are not "lost" along the way.
*/
-void flush(void)
+void flush()
{
/* Do it later */
flush_later = TRUE;
@@ -1258,15 +1221,27 @@ void flush(void)
/*
+ * Flush input if the 'flush_failure' option is set.
+ */
+void flush_on_failure()
+{
+ if (options->flush_failure)
+ {
+ flush();
+ }
+}
+
+
+/*
* Flush the screen, make a noise
*/
-void bell(void)
+void bell()
{
/* Mega-Hack -- Flush the output */
Term_fresh();
/* Make a bell noise (if allowed) */
- if (ring_bell)
+ if (options->ring_bell)
{
Term_bell();
}
@@ -1276,16 +1251,6 @@ void bell(void)
}
-/*
-* Hack -- Make a (relevant?) sound
-*/
-void sound(int val)
-{
- /* Ignore; sound not currently supported. */
- return;
-}
-
-
/*
* Helper function called only from "inkey()"
@@ -1304,7 +1269,7 @@ void sound(int val)
* macro trigger, 500 milliseconds must pass before the key sequence is
* known not to be that macro trigger. XXX XXX XXX
*/
-static char inkey_aux(void)
+static char inkey_aux()
{
int k = 0, n, p = 0, w = 0;
@@ -1316,7 +1281,7 @@ static char inkey_aux(void)
/* Wait for a keypress */
- (void)(Term_inkey(&ch, TRUE, TRUE));
+ (Term_inkey(&ch, TRUE, TRUE));
/* End "macro action" */
@@ -1393,7 +1358,7 @@ static char inkey_aux(void)
}
/* Wait for (and remove) a pending key */
- (void)Term_inkey(&ch, TRUE, TRUE);
+ Term_inkey(&ch, TRUE, TRUE);
/* Return the key */
return (ch);
@@ -1538,13 +1503,13 @@ static char inkey_real(bool_ inkey_scan)
/* Access cursor state */
- (void)Term_get_cursor(&v);
+ Term_get_cursor(&v);
/* Show the cursor if waiting, except sometimes in "command" mode */
- if (!inkey_scan && (!inkey_flag || hilite_player || character_icky))
+ if (!inkey_scan && (!inkey_flag || options->hilite_player || character_icky))
{
/* Show the cursor */
- (void)Term_set_cursor(1);
+ Term_set_cursor(1);
}
@@ -1633,7 +1598,7 @@ static char inkey_real(bool_ inkey_scan)
/* Handle "control-right-bracket" */
- if ((ch == 29) || ((!rogue_like_commands) && (ch == KTRL('D'))))
+ if ((ch == 29) || ((!options->rogue_like_commands) && (ch == KTRL('D'))))
{
/* Strip this key */
ch = 0;
@@ -1704,7 +1669,7 @@ static char inkey_real(bool_ inkey_scan)
return (ch);
}
-char inkey(void) {
+char inkey() {
return inkey_real(FALSE);
}
@@ -1726,7 +1691,7 @@ static void msg_flush(int x)
while (1)
{
int cmd = inkey();
- if (quick_messages) break;
+ if (options->quick_messages) break;
if ((cmd == ESCAPE) || (cmd == ' ')) break;
if ((cmd == '\n') || (cmd == '\r')) break;
bell();
@@ -1793,15 +1758,15 @@ void display_message(int x, int y, int split, byte color, cptr t)
*/
void cmsg_print(byte color, cptr msg)
{
- static int p = 0;
+ auto &messages = game->messages;
- int n;
- int wid;
+ static int p = 0;
char *t;
char buf[1024];
+ int wid;
Term_get_size(&wid, nullptr);
int lim = wid - 8;
@@ -1809,7 +1774,7 @@ void cmsg_print(byte color, cptr msg)
if (!msg_flag) p = 0;
/* Message Length */
- n = (msg ? strlen(msg) : 0);
+ int n = (msg ? strlen(msg) : 0);
/* Hack -- flush when requested or needed */
if (p && (!msg || ((p + n) > lim)))
@@ -1833,10 +1798,13 @@ void cmsg_print(byte color, cptr msg)
/* Memorize the message */
- if (character_generated) message_add(msg, color);
+ if (character_generated)
+ {
+ messages.add(msg, color);
+ }
/* Handle "auto_more" */
- if (auto_more)
+ if (options->auto_more)
{
/* Window stuff */
p_ptr->window |= (PW_MESSAGE);
@@ -1902,11 +1870,11 @@ void cmsg_print(byte color, cptr msg)
/* Display the tail of the message */
display_message(p, 0, n, color, t);
- /* Memorize the tail */
- /* if (character_generated) message_add(t); */
-
/* Window stuff */
- p_ptr->window |= (PW_MESSAGE);
+ if (p_ptr)
+ {
+ p_ptr->window |= (PW_MESSAGE);
+ }
/* Remember the message */
msg_flag = TRUE;
@@ -1915,7 +1883,12 @@ void cmsg_print(byte color, cptr msg)
p += n + 1;
/* Optional refresh */
- if (fresh_message) Term_fresh();
+ if (options->fresh_message) Term_fresh();
+}
+
+void cmsg_print(byte color, std::string const &msg)
+{
+ cmsg_print(color, msg.c_str());
}
/* Hack -- for compatibility and easy sake */
@@ -1936,7 +1909,7 @@ static int screen_depth = 0;
*
* This function must match exactly one call to "screen_load()".
*/
-void screen_save(void)
+void screen_save()
{
/* Hack -- Flush messages */
msg_print(NULL);
@@ -1954,7 +1927,7 @@ void screen_save(void)
*
* This function must match exactly one call to "screen_save()".
*/
-void screen_load(void)
+void screen_load()
{
/* Hack -- Flush messages */
msg_print(NULL);
@@ -1980,7 +1953,7 @@ void msg_format(cptr fmt, ...)
va_start(vp, fmt);
/* Format the args, save the length */
- (void)vstrnfmt(buf, 1024, fmt, vp);
+ vstrnfmt(buf, 1024, fmt, vp);
/* End the Varargs Stuff */
va_end(vp);
@@ -1999,7 +1972,7 @@ void cmsg_format(byte color, cptr fmt, ...)
va_start(vp, fmt);
/* Format the args, save the length */
- (void)vstrnfmt(buf, 1024, fmt, vp);
+ vstrnfmt(buf, 1024, fmt, vp);
/* End the Varargs Stuff */
va_end(vp);
@@ -2008,29 +1981,25 @@ void cmsg_format(byte color, cptr fmt, ...)
cmsg_print(color, buf);
}
-
-
-/*
-* Display a string on the screen using an attribute.
-*
-* At the given location, using the given attribute, if allowed,
-* add the given string. Do not clear the line.
-*/
void c_put_str(byte attr, cptr str, int row, int col)
{
- /* Position cursor, Dump the attr/text */
Term_putstr(col, row, -1, attr, str);
}
-/*
-* As above, but in "white"
-*/
+void c_put_str(byte attr, std::string const &str, int row, int col)
+{
+ Term_putstr(col, row, -1, attr, str.c_str());
+}
+
void put_str(cptr str, int row, int col)
{
- /* Spawn */
Term_putstr(col, row, -1, TERM_WHITE, str);
}
+void put_str(std::string const &str, int row, int col)
+{
+ Term_putstr(col, row, -1, TERM_WHITE, str.c_str());
+}
/*
@@ -2046,16 +2015,20 @@ void c_prt(byte attr, cptr str, int row, int col)
Term_addstr( -1, attr, str);
}
-/*
-* As above, but in "white"
-*/
+void c_prt(byte attr, std::string const &s, int row, int col)
+{
+ c_prt(attr, s.c_str(), row, col);
+}
+
void prt(cptr str, int row, int col)
{
- /* Spawn */
c_prt(TERM_WHITE, str, row, col);
}
-
+void prt(std::string const &s, int row, int col)
+{
+ prt(s.c_str(), row, col);
+}
/*
* Print some (colored) text to the screen at the current cursor position,
@@ -2083,10 +2056,10 @@ void text_out_to_screen(byte a, cptr str)
/* Obtain the size */
- (void)Term_get_size(&wid, &h);
+ Term_get_size(&wid, &h);
/* Obtain the cursor */
- (void)Term_locate(&x, &y);
+ Term_locate(&x, &y);
/* Wrapping boundary */
wrap = wid;
@@ -2193,7 +2166,7 @@ void text_out_to_file(byte a, cptr str)
cptr s = str;
/* Unused parameter */
- (void)a;
+ a;
/* Process the string */
while (*s)
@@ -2381,6 +2354,23 @@ static int complete_command(char *buf, int clen, int mlen)
}
+bool askfor_aux(std::string *buf, std::size_t max_len)
+{
+ // Buffer
+ char cstr[1024];
+ // Sanity
+ assert(max_len < sizeof(cstr));
+ // Copy into temporary buffer
+ cstr[buf->size()] = '\0';
+ buf->copy(cstr, std::string::npos);
+ // Delegate
+ bool result = askfor_aux(cstr, max_len);
+ // Copy back
+ (*buf) = cstr;
+ // Done
+ return result;
+}
+
/*
* Get some input at the cursor location.
* Assume the buffer is initialized to a default string.
@@ -2574,7 +2564,7 @@ bool_ get_check(cptr prompt)
while (TRUE)
{
i = inkey();
- if (quick_messages) break;
+ if (options->quick_messages) break;
if (i == ESCAPE) break;
if (strchr("YyNn", i)) break;
bell();
@@ -2728,7 +2718,6 @@ static char request_command_buffer[256];
* request_command(). This MUST have at least twice as many characters as
* there are building actions in the actions[] array in store_info_type.
*/
-#define MAX_IGNORE_KEYMAPS 12
char request_command_ignore_keymaps[MAX_IGNORE_KEYMAPS];
/*
@@ -2925,7 +2914,7 @@ void request_command(int shopping)
if (cmd == '\\')
{
/* Get a real command */
- (void)get_com("Command: ", &cmd_char);
+ get_com("Command: ", &cmd_char);
cmd = cmd_char;
@@ -2983,7 +2972,7 @@ void request_command(int shopping)
}
/* Hack -- Auto-repeat certain commands */
- if (always_repeat && (command_arg <= 0))
+ if (options->always_repeat && (command_arg <= 0))
{
/* Hack -- auto repeat certain commands */
if (strchr("TBDoc+", command_cmd))
@@ -2996,18 +2985,19 @@ void request_command(int shopping)
/* Hack -- Scan equipment */
for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
{
- cptr s;
-
object_type *o_ptr = &p_ptr->inventory[i];
/* Skip non-objects */
if (!o_ptr->k_idx) continue;
/* No inscription */
- if (!o_ptr->note) continue;
+ if (o_ptr->inscription.empty())
+ {
+ continue;
+ }
/* Obtain the inscription */
- s = quark_str(o_ptr->note);
+ auto s = o_ptr->inscription.c_str();
/* Find a '^' */
s = strchr(s, '^');
@@ -3152,7 +3142,7 @@ bool_ repeat_pull(int *what)
return (TRUE);
}
-void repeat_check(void)
+void repeat_check()
{
int what;
@@ -3196,7 +3186,7 @@ void repeat_check(void)
*
* Allow numbers of any size and save the last keypress.
*/
-u32b get_number(u32b def, u32b max, int y, int x, char *cmd)
+static u32b get_number(u32b def, u32b max, int y, int x, char *cmd)
{
u32b res = def;
@@ -3293,7 +3283,10 @@ void get_count(int number, int max)
command_arg = number;
/* Hack -- Optional flush */
- if (flush_command) flush();
+ if (options->flush_command)
+ {
+ flush();
+ }
/* Clear top line */
prt("", 0, 0);
@@ -3336,28 +3329,33 @@ void strlower(char *buf)
*/
int test_monster_name(cptr name)
{
- int i;
+ auto const &r_info = game->edit_data.r_info;
- /* Scan the monsters */
- for (i = 1; i < max_r_idx; i++)
+ for (std::size_t i = 0; i < r_info.size(); i++)
{
- monster_race *r_ptr = &r_info[i];
- if (r_ptr->name && iequals(name, r_ptr->name)) return (i);
+ auto r_ptr = &r_info[i];
+ if (r_ptr->name && iequals(name, r_ptr->name))
+ {
+ return (i);
+ }
}
return (0);
}
-int test_mego_name(cptr name)
+int test_mego_name(cptr needle)
{
- int i;
+ const auto &re_info = game->edit_data.re_info;
/* Scan the monsters */
- for (i = 1; i < max_re_idx; i++)
+ for (std::size_t i = 0; i < re_info.size(); i++)
{
- monster_ego *re_ptr = &re_info[i];
- if (re_ptr->name && iequals(name, re_ptr->name)) return (i);
+ auto name = re_info[i].name;
+ if (name && iequals(name, needle))
+ {
+ return i;
+ }
}
- return (0);
+ return 0;
}
/*
@@ -3366,18 +3364,20 @@ int test_mego_name(cptr name)
* returned. Case doesn't matter. -DG-
*/
-int test_item_name(cptr name)
+int test_item_name(cptr needle)
{
- int i;
+ auto const &k_info = game->edit_data.k_info;
- /* Scan the items */
- for (i = 1; i < max_k_idx; i++)
+ for (std::size_t i = 0; i < k_info.size(); i++)
{
- object_kind *k_ptr = &k_info[i];
- /* If name matches, give us the number */
- if (k_ptr->name && iequals(name, k_ptr->name)) return (i);
+ auto const &name = k_info[i].name;
+ if (name && iequals(needle, name))
+ {
+ return i;
+ }
}
- return (0);
+
+ return 0;
}
/*
@@ -3402,41 +3402,53 @@ s32b bst(s32b what, s32b t)
}
}
-cptr get_day(int day)
+std::string get_day(s32b day_no)
{
- static char buf[20];
- cptr p = "th";
-
- if ((day / 10) == 1) ;
- else if ((day % 10) == 1) p = "st";
- else if ((day % 10) == 2) p = "nd";
- else if ((day % 10) == 3) p = "rd";
-
- sprintf(buf, "%d%s", day, p);
- return (buf);
+ // Convert the number
+ std::string day(std::to_string(day_no));
+ // Suffix
+ if ((day_no / 10) == 1)
+ {
+ return day + "th";
+ }
+ else if ((day_no % 10) == 1)
+ {
+ return day + "st";
+ }
+ else if ((day_no % 10) == 2)
+ {
+ return day + "nd";
+ }
+ else if ((day_no % 10) == 3)
+ {
+ return day + "rd";
+ }
+ else
+ {
+ return day + "th";
+ }
}
-cptr get_player_race_name(int pr, int ps)
+std::string get_player_race_name(int pr, int ps)
{
- static char buf[50];
+ auto const &race_info = game->edit_data.race_info;
+ auto const &race_mod_info = game->edit_data.race_mod_info;
if (ps)
{
if (race_mod_info[ps].place)
{
- sprintf(buf, "%s %s", race_info[pr].title, race_mod_info[ps].title);
+ return std::string(race_info[pr].title) + " " + race_mod_info[ps].title;
}
else
{
- sprintf(buf, "%s %s", race_mod_info[ps].title, race_info[pr].title);
+ return std::string(race_mod_info[ps].title) + " " + race_info[pr].title;
}
}
else
{
- sprintf(buf, "%s", race_info[pr].title);
+ return std::string(race_info[pr].title);
}
-
- return (buf);
}
/*
@@ -3446,7 +3458,7 @@ int ask_menu(cptr ask, const std::vector<std::string> &items)
{
int ret = -1, i, start = 0;
char c;
- int size = items.size(); // Convert to int to avoid warnings
+ int size = static_cast<int>(items.size()); // Convert to int to avoid warnings
/* Enter "icky" mode */
character_icky = TRUE;
@@ -3524,10 +3536,6 @@ bool_ prefix(cptr s, cptr t)
/* Paranoia */
if (!s || !t)
{
- if (alert_failure)
- {
- message_add("prefix() called with null argument!", TERM_RED);
- }
return FALSE;
}
@@ -3573,56 +3581,59 @@ void draw_box(int y, int x, int h, int w)
/*
* Displays a scrollable boxed list with a selected item
*/
-void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color)
+void display_list(int y, int x, int h, int w, cptr title, std::vector<std::string> const &list, std::size_t begin, std::size_t sel, byte sel_color)
{
- int i;
-
draw_box(y, x, h, w);
c_put_str(TERM_L_BLUE, title, y, x + ((w - strlen(title)) / 2));
- for (i = 0; i < h - 1; i++)
+ for (int i = 0; i < h - 1; i++)
{
byte color = TERM_WHITE;
- if (i + begin >= max) break;
+ if (i + begin >= list.size())
+ {
+ break;
+ }
if (i + begin == sel) color = sel_color;
- c_put_str(color, list[i + begin], y + 1 + i, x + 1);
+ c_put_str(color, list[i + begin].c_str(), y + 1 + i, x + 1);
}
}
-/*
- * Creates an input box
- */
-bool_ input_box(cptr text, int y, int x, char *buf, int max)
+bool input_box_auto(std::string const &prompt, std::string *buf, std::size_t max)
{
- int smax = strlen(text);
+ int wid, hgt;
+ Term_get_size(&wid, &hgt);
+
+ auto const y = hgt / 2;
+ auto const x = wid / 2;
- if (max > smax) smax = max;
- smax++;
+ auto const smax = std::max(prompt.size(), max) + 1;
draw_box(y - 1, x - (smax / 2), 3, smax);
- c_put_str(TERM_WHITE, text, y, x - (strlen(text) / 2));
+ c_put_str(TERM_WHITE, prompt.c_str(), y, x - (prompt.size() / 2));
Term_gotoxy(x - (smax / 2) + 1, y + 1);
return askfor_aux(buf, max);
}
-/*
- * Creates a msg bbox and ask a question
- */
-char msg_box(cptr text, int y, int x)
+std::string input_box_auto(std::string const &title, std::size_t max)
{
- if (x == -1)
- {
- int wid = 0, hgt = 0;
- Term_get_size(&wid, &hgt);
- x = wid / 2;
- y = hgt / 2;
- }
+ std::string buf;
+ input_box_auto(title, &buf, max);
+ return buf;
+}
+
+char msg_box_auto(std::string const &text)
+{
+ int wid, hgt;
+ Term_get_size(&wid, &hgt);
+
+ auto const y = hgt / 2;
+ auto const x = wid / 2;
- draw_box(y - 1, x - ((strlen(text) + 1) / 2), 2, strlen(text) + 1);
- c_put_str(TERM_WHITE, text, y, x - ((strlen(text) + 1) / 2) + 1);
+ draw_box(y - 1, x - ((text.size() + 1) / 2), 2, text.size() + 1);
+ c_put_str(TERM_WHITE, text.c_str(), y, x - ((text.size() + 1) / 2) + 1);
return inkey();
}
@@ -3631,25 +3642,16 @@ char msg_box(cptr text, int y, int x)
*/
timer_type *new_timer(void (*callback)(), s32b delay)
{
- timer_type *t_ptr = new timer_type();
-
- static_assert(std::is_pod<timer_type>::value, "Cannot memset a non-POD type");
- memset(t_ptr, 0, sizeof(timer_type));
-
- t_ptr->next = gl_timers;
- gl_timers = t_ptr;
-
- t_ptr->callback = callback;
- t_ptr->delay = delay;
- t_ptr->countdown = delay;
- t_ptr->enabled = FALSE;
+ auto &timers = game->timers;
+ timer_type *t_ptr = new timer_type(callback, delay);
+ timers.push_back(t_ptr);
return t_ptr;
}
int get_keymap_mode()
{
- if (rogue_like_commands)
+ if (options->rogue_like_commands)
{
return KEYMAP_MODE_ROGUE;
}
diff --git a/src/util.h b/src/util.h
index 4ae797b9..7be705a0 100644
--- a/src/util.h
+++ b/src/util.h
@@ -7,15 +7,12 @@
extern "C" {
#endif
-extern errr path_parse(char *buf, int max, cptr file);
-extern errr path_build(char *buf, int max, cptr path, cptr file);
-extern void bell(void);
-extern errr macro_add(cptr pat, cptr act);
-extern sint macro_find_exact(cptr pat);
-extern char inkey(void);
-extern void prt(cptr str, int row, int col);
-extern void pause_line(int row);
-extern void user_name(char *buf, int id);
+errr path_build(char *buf, int max, cptr path, cptr file);
+void bell();
+errr macro_add(cptr pat, cptr act);
+sint macro_find_exact(cptr pat);
+char inkey();
+void prt(cptr str, int row, int col);
#ifdef __cplusplus
} // extern "C"
diff --git a/src/util.hpp b/src/util.hpp
index bb8a64f4..1f5c3aed 100644
--- a/src/util.hpp
+++ b/src/util.hpp
@@ -6,69 +6,81 @@
#include <vector>
#include <string>
-extern bool_ input_box(cptr text, int y, int x, char *buf, int max);
-extern void draw_box(int y, int x, int h, int w);
-extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color);
-extern cptr get_player_race_name(int pr, int ps);
-extern cptr get_day(int day);
-extern s32b bst(s32b what, s32b t);
-extern errr path_temp(char *buf, int max);
-extern FILE *my_fopen(cptr file, cptr mode);
-extern errr my_fgets(FILE *fff, char *buf, huge n);
-extern errr my_fclose(FILE *fff);
-extern errr fd_kill(cptr file);
-extern errr fd_move(cptr file, cptr what);
-extern int fd_make(cptr file, int mode);
-extern int fd_open(cptr file, int flags);
-extern errr fd_seek(int fd, huge n);
-extern errr fd_read(int fd, char *buf, huge n);
-extern errr fd_write(int fd, cptr buf, huge n);
-extern errr fd_close(int fd);
-extern void flush(void);
-extern void sound(int num);
-extern void move_cursor(int row, int col);
-extern void text_to_ascii(char *buf, cptr str);
-extern void ascii_to_text(char *buf, cptr str);
-extern char inkey_scan(void);
-extern void display_message(int x, int y, int split, byte color, cptr t);
-extern void cmsg_print(byte color, cptr msg);
-extern void msg_print(cptr msg);
-extern void cmsg_format(byte color, cptr fmt, ...);
-extern void msg_format(cptr fmt, ...);
-extern void screen_save(void);
-extern void screen_load(void);
-extern void c_put_str(byte attr, cptr str, int row, int col);
-extern void put_str(cptr str, int row, int col);
-extern void c_prt(byte attr, cptr str, int row, int col);
-extern void text_out_to_screen(byte a, cptr str);
-extern void text_out_to_file(byte a, cptr str);
-extern void text_out(cptr str);
-extern void text_out_c(byte a, cptr str);
-extern void clear_from(int row);
-extern int ask_menu(cptr ask, const std::vector<std::string> &items);
-extern bool_ askfor_aux(char *buf, int len);
-extern bool_ askfor_aux_with_completion(char *buf, int len);
-extern bool_ get_string(cptr prompt, char *buf, int len);
-extern bool_ get_check(cptr prompt);
-extern bool_ get_com(cptr prompt, char *command);
-extern s32b get_quantity(cptr prompt, s32b max);
-extern char request_command_ignore_keymaps[];
+#define MAX_IGNORE_KEYMAPS 12
+
+bool input_box(std::string const &text, int y, int x, std::string *buf, std::size_t max);
+std::string input_box_auto(std::string const &title, std::size_t max);
+bool input_box_auto(std::string const &prompt, std::string *buf, std::size_t max);
+void draw_box(int y, int x, int h, int w);
+void display_list(int y, int x, int h, int w, cptr title, std::vector<std::string> const &list, std::size_t begin, std::size_t sel, byte sel_color);
+std::string get_player_race_name(int pr, int ps);
+std::string get_day(s32b day);
+s32b bst(s32b what, s32b t);
+FILE *my_fopen(cptr file, cptr mode);
+errr my_fgets(FILE *fff, char *buf, huge n);
+errr my_fclose(FILE *fff);
+errr fd_kill(cptr file);
+errr fd_move(cptr file, cptr what);
+int fd_make(cptr file, int mode);
+int fd_open(cptr file, int flags);
+errr fd_seek(int fd, huge n);
+errr fd_read(int fd, char *buf, huge n);
+errr fd_write(int fd, cptr buf, huge n);
+errr fd_close(int fd);
+void flush();
+void flush_on_failure();
+void move_cursor(int row, int col);
+void text_to_ascii(char *buf, cptr str);
+void ascii_to_text(char *buf, cptr str);
+char inkey_scan();
+void display_message(int x, int y, int split, byte color, cptr t);
+void cmsg_print(byte color, cptr msg);
+void cmsg_print(byte color, std::string const &msg);
+void msg_print(cptr msg);
+void cmsg_format(byte color, cptr fmt, ...);
+void msg_format(cptr fmt, ...);
+void screen_save();
+void screen_load();
+void c_put_str(byte attr, cptr str, int row, int col);
+void c_put_str(byte attr, std::string const &str, int row, int col);
+void put_str(cptr str, int row, int col);
+void put_str(std::string const &s, int row, int col);
+void c_prt(byte attr, cptr str, int row, int col);
+void c_prt(byte attr, std::string const &s, int row, int col);
+void prt(std::string const &s, int row, int col);
+void text_out_to_screen(byte a, cptr str);
+void text_out_to_file(byte a, cptr str);
+void text_out(cptr str);
+void text_out_c(byte a, cptr str);
+void clear_from(int row);
+int ask_menu(cptr ask, const std::vector<std::string> &items);
+bool askfor_aux(std::string *buf, std::size_t max_len);
+bool_ askfor_aux(char *buf, int len);
+bool_ askfor_aux_with_completion(char *buf, int len);
+bool_ get_string(cptr prompt, char *buf, int len);
+bool_ get_check(cptr prompt);
+bool_ get_com(cptr prompt, char *command);
+s32b get_quantity(cptr prompt, s32b max);
+extern char request_command_ignore_keymaps[MAX_IGNORE_KEYMAPS];
extern bool_ request_command_inven_mode;
-extern void request_command(int shopping);
-extern bool_ is_a_vowel(int ch);
-extern int get_keymap_dir(char ch);
-extern byte count_bits(u32b array);
-extern void strlower(char *buf);
-extern int test_monster_name(cptr name);
-extern int test_mego_name(cptr name);
-extern int test_item_name(cptr name);
-extern char msg_box(cptr text, int y, int x);
-extern timer_type *new_timer(void (*callback)(), s32b delay);
-extern int get_keymap_mode();
-extern void repeat_push(int what);
-extern bool_ repeat_pull(int *what);
-extern void repeat_check(void);
-extern void get_count(int number, int max);
-extern bool in_bounds(int y, int x);
-extern bool in_bounds2(int y, int x);
-extern bool panel_contains(int y, int x);
+void request_command(int shopping);
+bool_ is_a_vowel(int ch);
+int get_keymap_dir(char ch);
+byte count_bits(u32b array);
+void strlower(char *buf);
+int test_monster_name(cptr name);
+int test_mego_name(cptr name);
+int test_item_name(cptr name);
+char msg_box_auto(std::string const &title);
+timer_type *new_timer(void (*callback)(), s32b delay);
+int get_keymap_mode();
+void repeat_push(int what);
+bool_ repeat_pull(int *what);
+void repeat_check();
+void get_count(int number, int max);
+bool in_bounds(int y, int x);
+bool in_bounds2(int y, int x);
+bool panel_contains(int y, int x);
+errr path_parse(char *buf, int max, cptr file);
+void pause_line(int row);
+std::string user_name();
diff --git a/src/variable.cc b/src/variable.cc
index f0d18111..ae40676f 100644
--- a/src/variable.cc
+++ b/src/variable.cc
@@ -11,7 +11,7 @@
#include "cli_comm_fwd.hpp"
#include "player_type.hpp"
-#include "randart_gen_type.hpp"
+#include "skill_modifiers.hpp"
#include "util.hpp"
@@ -23,27 +23,6 @@ char *macro_trigger_name[MAX_MACRO_TRIG];
char *macro_trigger_keycode[2][MAX_MACRO_TRIG];
/*
- * Executable version
- */
-byte version_major;
-byte version_minor;
-byte version_patch;
-
-/*
- * Savefile version
- */
-byte sf_major; /* Savefile's "version_major" */
-byte sf_minor; /* Savefile's "version_minor" */
-byte sf_patch; /* Savefile's "version_patch" */
-
-/*
- * Savefile information
- */
-u32b sf_when; /* Time when savefile created */
-u16b sf_lives; /* Number of past "lives" with this file */
-u16b sf_saves; /* Number of "saves" during this life */
-
-/*
* Run-time aruments
*/
bool_ arg_wizard; /* Command arg -- Request wizard mode */
@@ -61,7 +40,11 @@ bool_ character_loaded; /* The character was loaded from a savefile */
bool_ character_icky; /* The game is in an icky full screen mode */
bool_ character_xtra; /* The game is in an icky startup mode */
-u32b seed_flavor; /* Hack -- consistent object colors */
+seed_t &seed_flavor()
+{
+ static seed_t *instance = new seed_t(seed_t::system());
+ return *instance;
+}
s16b command_cmd; /* Current "Angband Command" */
@@ -162,32 +145,9 @@ int text_out_indent = 0;
/*
- * Software options (set via the '=' command). See "tables.c"
+ * Options
*/
-
-
-
-
-/* Cheating options */
-
-bool_ cheat_peek; /* Peek into object creation */
-bool_ cheat_hear; /* Peek into monster creation */
-bool_ cheat_room; /* Peek into dungeon creation */
-bool_ cheat_xtra; /* Peek into something else */
-bool_ cheat_know; /* Know complete monster info */
-bool_ cheat_live; /* Allow player to avoid death */
-
-
-/* Special options */
-
-byte hitpoint_warn; /* Hitpoint warning (0 to 9) */
-
-byte delay_factor; /* Delay factor (0 to 9) */
-
-bool_ autosave_l; /* Autosave before entering new levels */
-bool_ autosave_t; /* Timed autosave */
-s16b autosave_freq; /* Autosave frequency */
-
+struct options *options = nullptr;
/*
* Dungeon variables
@@ -242,26 +202,6 @@ object_type *tracked_object;
/*
- * Current player's character name
- */
-char player_name[32];
-
-/*
- * Stripped version of "player_name"
- */
-char player_base[32];
-
-/*
- * What killed the player
- */
-char died_from[80];
-
-/*
- * Hack -- Textual "history" for the Player
- */
-char history[4][60];
-
-/*
* Buffer to hold the current savefile name
*/
char savefile[1024];
@@ -316,17 +256,10 @@ char *macro__buf;
/*
- * The array of normal options
- */
-u32b option_flag[8];
-u32b option_mask[8];
-
-
-/*
* The array of window options
*/
-u32b window_flag[8];
-u32b window_mask[8];
+u32b window_flag[ANGBAND_TERM_MAX];
+u32b window_mask[ANGBAND_TERM_MAX];
/*
@@ -408,34 +341,6 @@ u16b max_real_towns;
town_type *town_info;
/*
- * The size of "alloc_kind_table" (at most max_k_idx * ALLOCATIONS_MAX)
- */
-s16b alloc_kind_size;
-
-/*
- * The entries in the "kind allocator table"
- */
-alloc_entry *alloc_kind_table;
-
-/*
- * The flag to tell if alloc_kind_table contains valid entries
- * for normal (i.e. kind_is_legal) object allocation
- */
-bool_ alloc_kind_table_valid = FALSE;
-
-
-/*
- * The size of "alloc_race_table" (at most max_r_idx)
- */
-s16b alloc_race_size;
-
-/*
- * The entries in the "race allocator table"
- */
-alloc_entry *alloc_race_table;
-
-
-/*
* Specify attr/char pairs for visual special effects
* Be sure to use "index & 0x7F" to avoid illegal access
*/
@@ -469,124 +374,17 @@ player_type *p_ptr = nullptr;
* Pointer to the player tables
* (sex, race, race mod, class, magic)
*/
-player_sex *sp_ptr;
-player_race *rp_ptr;
-player_race_mod *rmp_ptr;
-player_class *cp_ptr;
-player_spec *spp_ptr;
-
-
-/*
- * Calculated base hp values for player at each level,
- * store them so that drain life + restore life does not
- * affect hit points. Also prevents shameless use of backup
- * savefiles for hitpoint acquirement.
- */
-s16b player_hp[PY_MAX_LEVEL];
-
-/*
- * The vault generation arrays
- */
-vault_type *v_info;
-
-/*
- * The terrain feature arrays
- */
-feature_type *f_info;
-
-/*
- * The object kind arrays
- */
-object_kind *k_info;
-
-/*
- * The artifact arrays
- */
-artifact_type *a_info;
-
-/*
- * The item set arrays
- */
-set_type *set_info;
-
-/*
- * The ego-item arrays
- */
-ego_item_type *e_info;
-
-/*
- * The randart arrays
- */
-randart_part_type *ra_info;
-randart_gen_type ra_gen[30];
-
-/* jk */
-/* the trap-arrays */
-trap_type *t_info;
-
-/*
- * The monster race arrays
- */
-monster_race *r_info;
-
-/*
- * The monster ego race arrays
- */
-monster_ego *re_info;
-
-/*
- * The dungeon types arrays
- */
-dungeon_info_type *d_info;
-
-/*
- * Player abilities arrays
- */
-ability_type *ab_info;
-
-/*
- * Player skills arrays
- */
-skill_type *s_info;
-
-/*
- * Player race arrays
- */
-player_race *race_info;
-
-/*
- * Player mod race arrays
- */
-player_race_mod *race_mod_info;
-
-/*
- * Player class arrays
- */
-player_class *class_info;
-meta_class_type *meta_class_info;
+player_race const *rp_ptr;
+player_race_mod const *rmp_ptr;
+player_class const *cp_ptr;
+player_spec const *spp_ptr;
/*
* The wilderness features arrays
*/
-wilderness_type_info *wf_info;
int wildc2i[256];
/*
- * The store/building types arrays
- */
-store_info_type *st_info;
-
-/*
- * The building actions types arrays
- */
-store_action_type *ba_info;
-
-/*
- * The owner types arrays
- */
-owner_type *ow_info;
-
-/*
* Default texts for feature information.
*/
cptr DEFAULT_FEAT_TEXT = "a wall blocking your way";
@@ -703,102 +501,6 @@ s32b get_level_max_stick = -1;
s32b get_level_use_stick = -1;
/*
- * Maximum size of the wilderness map
- */
-u16b max_wild_x;
-u16b max_wild_y;
-
-/*
- * Wilderness map
- */
-wilderness_map **wild_map;
-
-
-/*
- * Maximum number of skills in s_info.txt
- */
-u16b old_max_s_idx = 0;
-u16b max_s_idx;
-
-/*
- * Maximum number of abilities in ab_info.txt
- */
-u16b max_ab_idx;
-
-/*
- * Maximum number of monsters in r_info.txt
- */
-u16b max_r_idx;
-
-/*
- * Maximum number of ego monsters in re_info.txt
- */
-u16b max_re_idx;
-
-/*
- * Maximum number of items in k_info.txt
- */
-u16b max_k_idx;
-
-/*
- * Maximum number of vaults in v_info.txt
- */
-u16b max_v_idx;
-
-/*
- * Maximum number of terrain features in f_info.txt
- */
-u16b max_f_idx;
-
-/*
- * Maximum number of artifacts in a_info.txt
- */
-u16b max_a_idx;
-
-/*
- * Maximum number of ego-items in e_info.txt
- */
-u16b max_e_idx;
-
-/*
- * Maximum number of randarts in ra_info.txt
- */
-u16b max_ra_idx;
-
-/*
- * Maximum number of dungeon types in d_info.txt
- */
-u16b max_d_idx;
-
-/*
- * Maximum number of stores types in st_info.txt
- */
-u16b max_st_idx;
-
-/*
- * Item sets
- */
-u16b max_set_idx = 1;
-
-/*
- * Maximum number of players info in p_info.txt
- */
-u16b max_rp_idx;
-u16b max_rmp_idx;
-u16b max_c_idx;
-u16b max_mc_idx;
-
-/*
- * Maximum number of actions types in ba_info.txt
- */
-u16b max_ba_idx;
-
-/*
- * Maximum number of owner types in ow_info.txt
- */
-u16b max_ow_idx;
-
-/*
* Maximum number of objects in the level
*/
u16b max_o_idx;
@@ -809,16 +511,6 @@ u16b max_o_idx;
u16b max_m_idx;
/*
- * Maximum number of traps in tr_info.txt
- */
-u16b max_t_idx;
-
-/*
- * Maximum number of wilderness features in wf_info.txt
- */
-u16b max_wf_idx;
-
-/*
* Flags for initialization
*/
int init_flags;
@@ -838,25 +530,11 @@ bool_ carried_monster_hit = FALSE;
/*
* Random artifacts.
*/
-random_artifact random_artifacts[MAX_RANDARTS];
-/* These three used to be constants but now are set by modules */
s32b RANDART_WEAPON;
s32b RANDART_ARMOR;
s32b RANDART_JEWEL;
/*
- * Random spells.
- */
-random_spell random_spells[MAX_SPELLS];
-s16b spell_num;
-
-/*
- * Runecrafter's selfmade spells.
- */
-rune_spell rune_spells[MAX_RUNES];
-s16b rune_num;
-
-/*
* Fate.
*/
fate fates[MAX_FATES];
@@ -879,10 +557,7 @@ s16b *max_dlv;
s16b doppleganger;
/* To allow wilderness encounters */
-bool_ generate_encounter;
-
-/* Special levels */
-bool_ special_lvls;
+bool_ generate_encounter = FALSE;
/*
* Such an ugly hack ...
@@ -902,27 +577,9 @@ s16b plots[MAX_PLOTS];
random_quest random_quests[MAX_RANDOM_QUEST];
/*
- * Special levels
- */
-bool_ *special_lvl[MAX_DUNGEON_DEPTH];
-bool_ generate_special_feeling = FALSE;
-
-/*
* Dungeon flags
*/
-u32b dungeon_flags1;
-u32b dungeon_flags2;
-
-/*
- * The last character displayed
- */
-birther previous_char;
-
-/*
- * Race histories
- */
-hist_type *bg;
-int max_bg_idx;
+DECLARE_FLAG_ZERO_IMPL(dungeon_flag_set, dungeon_flags);
/*
* The spell list of schools
@@ -938,25 +595,12 @@ s32b project_time_effect = 0;
effect_type effects[MAX_EFFECTS];
/*
- * General skills set
- */
-char gen_skill_basem[MAX_SKILLS];
-u32b gen_skill_base[MAX_SKILLS];
-char gen_skill_modm[MAX_SKILLS];
-s16b gen_skill_mod[MAX_SKILLS];
-
-/*
* Table of "cli" macros.
*/
cli_comm *cli_info;
int cli_total = 0;
/*
- * max_bact, only used so that lua scripts can add new bacts without worrying about the numbers
- */
-int max_bact = 127;
-
-/*
* Automatizer enabled status
*/
bool_ automatizer_enabled = FALSE;
@@ -980,19 +624,12 @@ s32b VERSION_PATCH;
/*
* Some module info
*/
-s32b max_plev = 50;
s32b DUNGEON_BASE = 4;
s32b DUNGEON_DEATH = 28;
s32b DUNGEON_ASTRAL = 8;
s32b DUNGEON_ASTRAL_WILD_X = 45;
s32b DUNGEON_ASTRAL_WILD_Y = 19;
-/*
- * Timers
- */
-timer_type *gl_timers = NULL;
-
-
/**
* Get the version string.
*/
@@ -1010,56 +647,3 @@ const char *get_version_string()
}
return version_str;
}
-
-/*
- * A list of tvals and their textual names
- */
-tval_desc tvals[] =
-{
- { TV_SWORD, "Sword" },
- { TV_POLEARM, "Polearm" },
- { TV_HAFTED, "Hafted Weapon" },
- { TV_AXE, "Axe" },
- { TV_BOW, "Bow" },
- { TV_BOOMERANG, "Boomerang" },
- { TV_ARROW, "Arrows" },
- { TV_BOLT, "Bolts" },
- { TV_SHOT, "Shots" },
- { TV_SHIELD, "Shield" },
- { TV_CROWN, "Crown" },
- { TV_HELM, "Helm" },
- { TV_GLOVES, "Gloves" },
- { TV_BOOTS, "Boots" },
- { TV_CLOAK, "Cloak" },
- { TV_DRAG_ARMOR, "Dragon Scale Mail" },
- { TV_HARD_ARMOR, "Hard Armor" },
- { TV_SOFT_ARMOR, "Soft Armor" },
- { TV_RING, "Ring" },
- { TV_AMULET, "Amulet" },
- { TV_LITE, "Lite" },
- { TV_POTION, "Potion" },
- { TV_POTION2, "Potion" },
- { TV_SCROLL, "Scroll" },
- { TV_WAND, "Wand" },
- { TV_STAFF, "Staff" },
- { TV_ROD_MAIN, "Rod" },
- { TV_ROD, "Rod Tip" },
- { TV_BOOK, "Schools Spellbook", },
- { TV_SYMBIOTIC_BOOK, "Symbiotic Spellbook", },
- { TV_DRUID_BOOK, "Elemental Stone" },
- { TV_MUSIC_BOOK, "Music Book" },
- { TV_DAEMON_BOOK, "Daemon Book" },
- { TV_SPIKE, "Spikes" },
- { TV_DIGGING, "Digger" },
- { TV_CHEST, "Chest" },
- { TV_FOOD, "Food" },
- { TV_FLASK, "Flask" },
- { TV_MSTAFF, "Mage Staff" },
- { TV_PARCHMENT, "Parchment" },
- { TV_INSTRUMENT, "Musical Instrument" },
- { TV_RUNE1, "Rune 1" },
- { TV_RUNE2, "Rune 2" },
- { TV_JUNK, "Junk" },
- { TV_TRAPKIT, "Trapping Kit" },
- { 0, NULL }
-};
diff --git a/src/variable.h b/src/variable.h
index 7621149a..6d6e5775 100644
--- a/src/variable.h
+++ b/src/variable.h
@@ -7,10 +7,7 @@ extern "C" {
#endif
extern cptr ANGBAND_SYS;
-extern char *ANGBAND_DIR_MODULES;
extern char *ANGBAND_DIR_SAVE;
-extern char *ANGBAND_DIR_CORE;
-extern char *ANGBAND_DIR_DNGN;
extern char *ANGBAND_DIR_DATA;
extern char *ANGBAND_DIR_EDIT;
extern char *ANGBAND_DIR_FILE;
@@ -23,15 +20,10 @@ extern char *ANGBAND_DIR_XTRA;
extern term *angband_term[ANGBAND_TERM_MAX];
extern char angband_term_name[ANGBAND_TERM_MAX][80];
extern byte angband_color_table[256][4];
-extern bool_ arg_wizard;
-extern bool_ arg_force_original;
-extern bool_ arg_force_roguelike;
extern bool_ character_generated;
extern bool_ character_icky;
extern bool_ inkey_flag;
extern bool_ msg_flag;
-extern char player_name[32];
-extern char player_base[32];
extern char savefile[1024];
#ifdef __cplusplus
diff --git a/src/variable.hpp b/src/variable.hpp
index ab52f5b6..73d63be7 100644
--- a/src/variable.hpp
+++ b/src/variable.hpp
@@ -1,51 +1,29 @@
#pragma once
#include "angband.h"
-#include "ability_type_fwd.hpp"
#include "alloc_entry_fwd.hpp"
-#include "artifact_type_fwd.hpp"
#include "birther.hpp"
#include "cave_type_fwd.hpp"
#include "deity_type.hpp"
-#include "dungeon_info_type_fwd.hpp"
+#include "dungeon_flag_set.hpp"
#include "effect_type.hpp"
-#include "ego_item_type_fwd.hpp"
#include "fate.hpp"
-#include "feature_type_fwd.hpp"
-#include "hist_type_fwd.hpp"
-#include "meta_class_type_fwd.hpp"
-#include "monster_ego_fwd.hpp"
-#include "monster_race_fwd.hpp"
#include "monster_type_fwd.hpp"
-#include "object_kind_fwd.hpp"
#include "object_type_fwd.hpp"
-#include "owner_type_fwd.hpp"
+#include "options.hpp"
#include "player_class_fwd.hpp"
#include "player_defs.hpp"
#include "player_race_fwd.hpp"
#include "player_race_mod_fwd.hpp"
-#include "player_sex_fwd.hpp"
#include "player_spec_fwd.hpp"
#include "player_type_fwd.hpp"
-#include "randart_gen_type_fwd.hpp"
-#include "randart_part_type_fwd.hpp"
-#include "random_artifact.hpp"
#include "random_quest.hpp"
-#include "random_spell.hpp"
-#include "rune_spell.hpp"
#include "school_type.hpp"
-#include "set_type_fwd.hpp"
-#include "skill_type_fwd.hpp"
+#include "skill_modifiers_fwd.hpp"
#include "skills_defs.hpp"
-#include "store_action_type_fwd.hpp"
-#include "store_info_type_fwd.hpp"
#include "timer_type_fwd.hpp"
#include "town_type_fwd.hpp"
-#include "trap_type_fwd.hpp"
-#include "tval_desc.hpp"
-#include "vault_type_fwd.hpp"
-#include "wilderness_map_fwd.hpp"
-#include "wilderness_type_info_fwd.hpp"
+#include "seed.hpp"
extern int max_macrotrigger;
extern char *macro_template;
@@ -53,19 +31,10 @@ extern char *macro_modifier_chr;
extern char *macro_modifier_name[MAX_MACRO_MOD];
extern char *macro_trigger_name[MAX_MACRO_TRIG];
extern char *macro_trigger_keycode[2][MAX_MACRO_TRIG];
-extern byte version_major;
-extern byte version_minor;
-extern byte version_patch;
-extern byte sf_major;
-extern byte sf_minor;
-extern byte sf_patch;
-extern u32b sf_when;
-extern u16b sf_lives;
-extern u16b sf_saves;
extern bool_ character_dungeon;
extern bool_ character_loaded;
extern bool_ character_xtra;
-extern u32b seed_flavor;
+seed_t &seed_flavor();
extern s16b command_cmd;
extern s16b command_arg;
extern s16b command_rep;
@@ -117,17 +86,6 @@ extern int artifact_bias;
extern FILE *text_out_file;
extern void (*text_out_hook)(byte a, cptr str);
extern int text_out_indent;
-extern bool_ cheat_peek;
-extern bool_ cheat_hear;
-extern bool_ cheat_room;
-extern bool_ cheat_xtra;
-extern bool_ cheat_know;
-extern bool_ cheat_live;
-extern byte hitpoint_warn;
-extern byte delay_factor;
-extern s16b autosave_freq;
-extern bool_ autosave_t;
-extern bool_ autosave_l;
extern s16b feeling;
extern s16b rating;
extern bool_ good_item_flag;
@@ -146,8 +104,6 @@ extern s16b health_who;
extern s16b monster_race_idx;
extern s16b monster_ego_idx;
extern object_type *tracked_object;
-extern char died_from[80];
-extern char history[4][60];
extern s16b lite_n;
extern s16b lite_y[LITE_MAX];
extern s16b lite_x[LITE_MAX];
@@ -162,8 +118,6 @@ extern char **macro__pat;
extern char **macro__act;
extern bool_ *macro__cmd;
extern char *macro__buf;
-extern u32b option_flag[8];
-extern u32b option_mask[8];
extern u32b window_flag[ANGBAND_TERM_MAX];
extern u32b window_mask[ANGBAND_TERM_MAX];
extern cave_type **cave;
@@ -173,120 +127,53 @@ extern monster_type *km_list;
extern u16b max_real_towns;
extern u16b max_towns;
extern town_type *town_info;
-extern s16b alloc_kind_size;
-extern alloc_entry *alloc_kind_table;
-extern bool_ alloc_kind_table_valid;
-extern s16b alloc_race_size;
-extern alloc_entry *alloc_race_table;
extern byte misc_to_attr[256];
extern char misc_to_char[256];
extern byte tval_to_attr[128];
extern char tval_to_char[128];
extern char *keymap_act[KEYMAP_MODES][256];
extern player_type *p_ptr;
-extern player_sex *sp_ptr;
-extern player_race *rp_ptr;
-extern player_race_mod *rmp_ptr;
-extern player_class *cp_ptr;
-extern player_spec *spp_ptr;
-extern s16b player_hp[PY_MAX_LEVEL];
-extern ability_type *ab_info;
-extern skill_type *s_info;
-extern vault_type *v_info;
-extern feature_type *f_info;
-extern object_kind *k_info;
-extern artifact_type *a_info;
-extern ego_item_type *e_info;
-extern randart_part_type *ra_info;
-extern randart_gen_type ra_gen[30];
-extern monster_race *r_info;
-extern monster_ego *re_info;
-extern dungeon_info_type *d_info;
-extern player_class *class_info;
-extern meta_class_type *meta_class_info;
-extern player_race *race_info;
-extern player_race_mod *race_mod_info;
-extern trap_type *t_info;
-extern wilderness_type_info *wf_info;
+extern player_race const *rp_ptr;
+extern player_race_mod const *rmp_ptr;
+extern player_class const *cp_ptr;
+extern player_spec const *spp_ptr;
extern int wildc2i[256];
-extern store_info_type *st_info;
-extern store_action_type *ba_info;
-extern owner_type *ow_info;
-extern set_type *set_info;
extern cptr DEFAULT_FEAT_TEXT;
extern cptr DEFAULT_FEAT_TUNNEL;
extern cptr DEFAULT_FEAT_BLOCK;
extern char *ANGBAND_DIR;
+extern char *ANGBAND_DIR_MODULES;
+extern char *ANGBAND_DIR_CORE;
+extern char *ANGBAND_DIR_DNGN;
extern bool_ (*get_mon_num_hook)(int r_idx);
extern bool_ (*get_mon_num2_hook)(int r_idx);
extern bool_ (*get_obj_num_hook)(int k_idx);
-extern u16b max_wild_x;
-extern u16b max_wild_y;
-extern wilderness_map **wild_map;
-extern u16b old_max_s_idx;
-extern u16b max_ab_idx;
-extern u16b max_s_idx;
-extern u16b max_r_idx;
-extern u16b max_re_idx;
-extern u16b max_k_idx;
-extern u16b max_v_idx;
-extern u16b max_f_idx;
-extern u16b max_a_idx;
-extern u16b max_e_idx;
-extern u16b max_ra_idx;
-extern u16b max_d_idx;
extern u16b max_o_idx;
extern u16b max_m_idx;
-extern u16b max_t_idx;
-extern u16b max_rp_idx;
-extern u16b max_c_idx;
-extern u16b max_mc_idx;
-extern u16b max_rmp_idx;
-extern u16b max_st_idx;
-extern u16b max_ba_idx;
-extern u16b max_ow_idx;
-extern u16b max_wf_idx;
-extern u16b max_set_idx;
extern int init_flags;
extern bool_ ambush_flag;
extern bool_ fate_flag;
extern s16b no_breeds;
extern bool_ carried_monster_hit;
-extern random_artifact random_artifacts[MAX_RANDARTS];
extern s32b RANDART_WEAPON;
extern s32b RANDART_ARMOR;
extern s32b RANDART_JEWEL;
-extern random_spell random_spells[MAX_SPELLS];
-extern s16b spell_num;
-extern rune_spell rune_spells[MAX_RUNES];
-extern s16b rune_num;
extern fate fates[MAX_FATES];
extern byte dungeon_type;
extern s16b *max_dlv;
extern s16b doppleganger;
extern bool_ generate_encounter;
-extern bool_ special_lvls;
extern bool_ *m_allow_special;
extern bool_ *k_allow_special;
extern bool_ *a_allow_special;
extern s16b plots[MAX_PLOTS];
extern random_quest random_quests[MAX_RANDOM_QUEST];
-extern bool_ *special_lvl[MAX_DUNGEON_DEPTH];
-extern bool_ generate_special_feeling;
-extern u32b dungeon_flags1;
-extern u32b dungeon_flags2;
-extern birther previous_char;
-extern int max_bg_idx;
+DECLARE_FLAG_ZERO_INTF(dungeon_flag_set, dungeon_flags);
extern s16b schools_count;
extern school_type schools[SCHOOLS_MAX];
extern int project_time;
extern s32b project_time_effect;
extern effect_type effects[MAX_EFFECTS];
-extern char gen_skill_basem[MAX_SKILLS];
-extern u32b gen_skill_base[MAX_SKILLS];
-extern char gen_skill_modm[MAX_SKILLS];
-extern s16b gen_skill_mod[MAX_SKILLS];
-extern int max_bact;
extern bool_ automatizer_enabled;
extern s16b last_teleportation_y;
extern s16b last_teleportation_x;
@@ -295,14 +182,14 @@ extern s32b game_module_idx;
extern s32b VERSION_MAJOR;
extern s32b VERSION_MINOR;
extern s32b VERSION_PATCH;
-extern s32b max_plev;
extern s32b DUNGEON_BASE;
extern s32b DUNGEON_DEATH;
extern s32b DUNGEON_ASTRAL;
extern s32b DUNGEON_ASTRAL_WILD_X;
extern s32b DUNGEON_ASTRAL_WILD_Y;
extern deity_type deity_info[MAX_GODS];
-extern timer_type *gl_timers;
-extern const char *get_version_string();
-extern tval_desc tvals[];
-extern hist_type *bg;
+const char *get_version_string();
+extern bool_ arg_wizard;
+extern bool_ arg_force_original;
+extern bool_ arg_force_roguelike;
+extern struct options *options;
diff --git a/src/vault_type.hpp b/src/vault_type.hpp
index 650599cb..9d407d8f 100644
--- a/src/vault_type.hpp
+++ b/src/vault_type.hpp
@@ -1,24 +1,25 @@
#pragma once
#include "h-basic.h"
+#include <string>
/**
* Vault descriptors.
*/
struct vault_type
{
- char *data; /* Vault data */
+ std::string data; /* Vault data */
- byte typ; /* Vault type */
+ byte typ = 0; /* Vault type */
- byte rat; /* Vault rating */
+ byte rat = 0; /* Vault rating */
- byte hgt; /* Vault height */
- byte wid; /* Vault width */
+ byte hgt = 0; /* Vault height */
+ byte wid = 0; /* Vault width */
- s16b lvl; /* level of special (if any) */
- byte dun_type; /* Dungeon type where the level will show up */
+ s16b lvl = 0; /* level of special (if any) */
+ byte dun_type = 0; /* Dungeon type where the level will show up */
- s16b mon[10]; /* special monster */
- int item[3]; /* number of item (usually artifact) */
+ s16b mon[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* special monster */
+ int item[3] = { 0, 0, 0 }; /* number of item (usually artifact) */
};
diff --git a/src/vault_type_fwd.hpp b/src/vault_type_fwd.hpp
deleted file mode 100644
index 25ffd8cc..00000000
--- a/src/vault_type_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct vault_type;
diff --git a/src/wild.cc b/src/wild.cc
index 7724176f..3d86c0b7 100644
--- a/src/wild.cc
+++ b/src/wild.cc
@@ -10,7 +10,9 @@
#include "cave.hpp"
#include "cave_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
+#include "game.hpp"
#include "hook_wild_gen_in.hpp"
#include "hooks.hpp"
#include "init1.hpp"
@@ -20,6 +22,7 @@
#include "options.hpp"
#include "player_type.hpp"
#include "store_info_type.hpp"
+#include "store_flag.hpp"
#include "tables.hpp"
#include "town_type.hpp"
#include "util.hpp"
@@ -28,6 +31,7 @@
#include "wilderness_type_info.hpp"
#include "z-rand.hpp"
+#include <algorithm>
#include <memory>
@@ -152,13 +156,19 @@ static void plasma_recursive(int x1, int y1, int x2, int y2,
*/
static int generate_area(int y, int x, bool_ border, bool_ corner)
{
+ auto const &wilderness = game->wilderness;
+ auto const &wf_info = game->edit_data.wf_info;
+
int road, entrance;
int x1, y1;
int hack_floor = 0;
/* Number of the town (if any) */
- p_ptr->town_num = wf_info[wild_map[y][x].feat].entrance;
- if (!p_ptr->town_num) p_ptr->town_num = wild_map[y][x].entrance;
+ p_ptr->town_num = wf_info[wilderness(x, y).feat].entrance;
+ if (!p_ptr->town_num)
+ {
+ p_ptr->town_num = wilderness(x, y).entrance;
+ }
{
int roughness = 1; /* The roughness of the level. */
@@ -170,25 +180,23 @@ static int generate_area(int y, int x, bool_ border, bool_ corner)
if (!p_ptr->oldpy) p_ptr->oldpy = MAX_HGT / 2;
/* Initialize the terrain array */
- ym = ((y - 1) < 0) ? 0 : (y - 1);
- xm = ((x - 1) < 0) ? 0 : (x - 1);
- yp = ((y + 1) >= max_wild_y) ? (max_wild_y - 1) : (y + 1);
- xp = ((x + 1) >= max_wild_x) ? (max_wild_x - 1) : (x + 1);
- terrain[0][0] = wild_map[ym][xm].feat;
- terrain[0][1] = wild_map[ym][x].feat;
- terrain[0][2] = wild_map[ym][xp].feat;
- terrain[1][0] = wild_map[y][xm].feat;
- terrain[1][1] = wild_map[y][x].feat;
- terrain[1][2] = wild_map[y][xp].feat;
- terrain[2][0] = wild_map[yp][xm].feat;
- terrain[2][1] = wild_map[yp][x].feat;
- terrain[2][2] = wild_map[yp][xp].feat;
-
- /* Hack -- Use the "simple" RNG */
- Rand_quick = TRUE;
+ ym = std::max<int>(y - 1, 0);
+ xm = std::max<int>(x - 1, 0);
+ yp = std::min<int>(y + 1, static_cast<int>(wilderness.height()) - 1);
+ xp = std::min<int>(x + 1, static_cast<int>(wilderness.width()) - 1);
+
+ terrain[0][0] = wilderness(xm, ym).feat;
+ terrain[0][1] = wilderness(x , ym).feat;
+ terrain[0][2] = wilderness(xp, ym).feat;
+ terrain[1][0] = wilderness(xm, y ).feat;
+ terrain[1][1] = wilderness(x , y ).feat;
+ terrain[1][2] = wilderness(xp, y ).feat;
+ terrain[2][0] = wilderness(xm, yp).feat;
+ terrain[2][1] = wilderness(x , yp).feat;
+ terrain[2][2] = wilderness(xp, yp).feat;
/* Hack -- Induce consistant town layout */
- Rand_value = wild_map[y][x].seed;
+ set_quick_rng(wilderness(x, y).seed);
/* Create level background */
for (y1 = 0; y1 < MAX_HGT; y1++)
@@ -215,9 +223,6 @@ static int generate_area(int y, int x, bool_ border, bool_ corner)
plasma_recursive(1, 1, MAX_WID - 2, MAX_HGT - 2, MAX_WILD_TERRAIN - 1, roughness);
}
- /* Use the complex RNG */
- Rand_quick = FALSE;
-
for (y1 = 1; y1 < MAX_HGT - 1; y1++)
{
for (x1 = 1; x1 < MAX_WID - 1; x1++)
@@ -227,6 +232,8 @@ static int generate_area(int y, int x, bool_ border, bool_ corner)
}
}
+ /* Change back to "complex" RNG */
+ set_complex_rng();
}
/* Should we create a town ? */
@@ -252,7 +259,7 @@ static int generate_area(int y, int x, bool_ border, bool_ corner)
* Place roads in the wilderness
* ToDo: make the road a bit more interresting
*/
- road = wf_info[wild_map[y][x].feat].road;
+ road = wf_info[wilderness(x, y).feat].road;
if (road & ROAD_NORTH)
{
@@ -295,14 +302,11 @@ static int generate_area(int y, int x, bool_ border, bool_ corner)
}
}
- /* Hack -- Use the "simple" RNG */
- Rand_quick = TRUE;
-
/* Hack -- Induce consistant town layout */
- Rand_value = wild_map[y][x].seed;
+ set_quick_rng(wilderness(x, y).seed);
- entrance = wf_info[wild_map[y][x].feat].entrance;
- if (!entrance) entrance = wild_map[y][x].entrance;
+ entrance = wf_info[wilderness(x, y).feat].entrance;
+ if (!entrance) entrance = wilderness(x, y).entrance;
/* Create the dungeon if requested on the map */
if (entrance >= 1000)
@@ -318,7 +322,7 @@ static int generate_area(int y, int x, bool_ border, bool_ corner)
}
/* Use the complex RNG */
- Rand_quick = FALSE;
+ set_complex_rng();
/* MEGA HACK -- set at least one floor grid */
for (y1 = 1; y1 < cur_hgt - 1; y1++)
@@ -337,11 +341,10 @@ static int generate_area(int y, int x, bool_ border, bool_ corner)
hack_floor = 1;
}
- /* Set the monster generation level to the wilderness level */
- monster_level = wf_info[wild_map[y][x].feat].level;
-
- /* Set the object generation level to the wilderness level */
- object_level = wf_info[wild_map[y][x].feat].level;
+ /* Set the monster/object generation level to the wilderness level */
+ auto const &wf = wf_info[wilderness(x, y).feat];
+ monster_level = wf.level;
+ object_level = wf.level;
return hack_floor;
}
@@ -373,6 +376,8 @@ namespace {
*/
void wilderness_gen()
{
+ auto const &f_info = game->edit_data.f_info;
+
int i, y, x, hack_floor;
bool_ daytime;
int xstart = 0;
@@ -514,15 +519,18 @@ void wilderness_gen()
if (daytime)
{
/* Assume lit */
- c_ptr->info |= (CAVE_GLOW);
+ c_ptr->info |= CAVE_GLOW;
/* Hack -- Memorize lit grids if allowed */
- if (view_perma_grids) c_ptr->info |= (CAVE_MARK);
+ if (options->view_perma_grids)
+ {
+ c_ptr->info |= CAVE_MARK;
+ }
}
else
{
/* Darken "boring" features */
- if (!(f_info[c_ptr->feat].flags1 & FF1_REMEMBER))
+ if (!(f_info[c_ptr->feat].flags & FF_REMEMBER))
{
/* Forget the grid */
c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK);
@@ -546,7 +554,7 @@ void wilderness_gen()
for (i = 0; i < lim; i++)
{
/* Make a resident */
- (void)alloc_monster((generate_encounter == TRUE) ? 0 : 3, (generate_encounter == TRUE) ? FALSE : TRUE);
+ alloc_monster((generate_encounter == TRUE) ? 0 : 3, (generate_encounter == TRUE) ? FALSE : TRUE);
}
if (generate_encounter) ambush_flag = TRUE;
@@ -572,14 +580,16 @@ void wilderness_gen()
*/
void wilderness_gen_small()
{
- int i, j, entrance;
+ auto const &wilderness = game->wilderness;
+ auto const &wf_info = game->edit_data.wf_info;
+
int xstart = 0;
int ystart = 0;
/* To prevent stupid things */
- for (i = 0; i < MAX_WID; i++)
+ for (int i = 0; i < MAX_WID; i++)
{
- for (j = 0; j < MAX_HGT; j++)
+ for (int j = 0; j < MAX_HGT; j++)
{
cave_set_feat(j, i, FEAT_EKKAIA);
}
@@ -589,31 +599,35 @@ void wilderness_gen_small()
process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
/* Fill the map */
- for (i = 0; i < max_wild_x; i++)
+ for (std::size_t x = 0; x < wilderness.width(); x++)
{
- for (j = 0; j < max_wild_y; j++)
+ for (std::size_t y = 0; y < wilderness.height(); y++)
{
- entrance = wf_info[wild_map[j][i].feat].entrance;
- if (!entrance) entrance = wild_map[j][i].entrance;
+ auto const &wm = wilderness(x, y);
+
+ int entrance = wf_info[wm.feat].entrance;
+ if (!entrance) entrance = wm.entrance;
- if (wild_map[j][i].entrance)
+ if (wm.entrance)
{
- cave_set_feat(j, i, FEAT_MORE);
+ cave_set_feat(y, x, FEAT_MORE);
}
else
{
- cave_set_feat(j, i, wf_info[wild_map[j][i].feat].feat);
+ cave_set_feat(y, x, wf_info[wm.feat].feat);
}
- if ((cave[j][i].feat == FEAT_MORE) && (entrance >= 1000))
+ auto &cv = cave[y][x];
+
+ if ((cv.feat == FEAT_MORE) && (entrance >= 1000))
{
- cave[j][i].special = entrance - 1000;
+ cv.special = entrance - 1000;
}
/* Show it if we know it */
- if (wild_map[j][i].known)
+ if (wm.known)
{
- cave[j][i].info |= (CAVE_GLOW | CAVE_MARK);
+ cv.info |= (CAVE_GLOW | CAVE_MARK);
}
}
}
@@ -623,7 +637,7 @@ void wilderness_gen_small()
p_ptr->py = p_ptr->wilderness_y;
/* Set rewarded quests to finished */
- for (i = 0; i < MAX_Q_IDX; i++)
+ for (int i = 0; i < MAX_Q_IDX; i++)
{
if (quest[i].status == QUEST_STATUS_REWARDED)
{
@@ -638,26 +652,30 @@ void wilderness_gen_small()
/* Show a small radius of wilderness around the player */
void reveal_wilderness_around_player(int y, int x, int h, int w)
{
- int i, j;
+ auto &wilderness = game->wilderness;
/* Circle or square ? */
if (h == 0)
{
- for (i = x - w; i < x + w; i++)
+ for (int i = x - w; i < x + w; i++)
{
- for (j = y - w; j < y + w; j++)
+ for (int j = y - w; j < y + w; j++)
{
/* Bound checking */
if (!in_bounds(j, i)) continue;
/* Severe bound checking */
- if ((i < 0) || (i >= max_wild_x) || (j < 0) || (j >= max_wild_y)) continue;
+ if ((i < 0) || (static_cast<size_t>(i) >= wilderness.width()) ||
+ (j < 0) || (static_cast<size_t>(j) >= wilderness.height()))
+ {
+ continue;
+ }
/* We want a radius, not a "squarus" :) */
if (distance(y, x, j, i) >= w) continue;
/* New we know here */
- wild_map[j][i].known = TRUE;
+ wilderness(i, j).known = TRUE;
/* Only if we are in overview */
if (p_ptr->wild_mode)
@@ -672,15 +690,15 @@ void reveal_wilderness_around_player(int y, int x, int h, int w)
}
else
{
- for (i = x; i < x + w; i++)
+ for (int i = x; i < x + w; i++)
{
- for (j = y; j < y + h; j++)
+ for (int j = y; j < y + h; j++)
{
/* Bound checking */
if (!in_bounds(j, i)) continue;
/* New we know here */
- wild_map[j][i].known = TRUE;
+ wilderness(i, j).known = TRUE;
/* Only if we are in overview */
if (p_ptr->wild_mode)
@@ -876,38 +894,58 @@ static void build_store_hidden(int n, int yy, int xx)
}
/* Return a list of stores */
-static int get_shops(int *rooms)
+static std::vector<std::size_t> get_shops()
{
- int i, n, num = 0;
+ auto const &st_info = game->edit_data.st_info;
- for (n = 0; n < max_st_idx; n++)
- {
- rooms[n] = 0;
- }
+ std::vector<std::size_t> rooms;
- for (n = 0; n < max_st_idx; n++)
+ for (std::size_t n = 0; n < st_info.size(); n++)
{
int chance = 50;
- if (st_info[n].flags1 & SF1_COMMON) chance += 30;
- if (st_info[n].flags1 & SF1_RARE) chance -= 20;
- if (st_info[n].flags1 & SF1_VERY_RARE) chance -= 30;
+ if (st_info[n].flags & STF_COMMON)
+ {
+ chance += 30;
+ }
- if (!magik(chance)) continue;
+ if (st_info[n].flags & STF_RARE)
+ {
+ chance -= 20;
+ }
- for (i = 0; i < num; ++i)
+ if (st_info[n].flags & STF_VERY_RARE)
+ {
+ chance -= 30;
+ }
+
+ if (!magik(chance))
+ {
+ continue;
+ }
+
+ for (std::size_t i = 0; i < rooms.size(); ++i)
+ {
if (rooms[i] == n)
+ {
continue;
+ }
+ }
- if (st_info[n].flags1 & SF1_RANDOM) rooms[num++] = n;
+ if (st_info[n].flags & STF_RANDOM)
+ {
+ rooms.push_back(n);
+ }
}
- return num;
+ return rooms;
}
/* Generate town borders */
static void set_border(int y, int x)
{
+ auto const &f_info = game->edit_data.f_info;
+
cave_type *c_ptr;
/* Paranoia */
@@ -915,7 +953,7 @@ static void set_border(int y, int x)
/* Was a floor */
if (cave_floor_bold(y, x) ||
- (f_info[cave[y][x].feat].flags1 & FF1_DOOR))
+ (f_info[cave[y][x].feat].flags & FF_DOOR))
{
cave_set_feat(y, x, FEAT_DOOR_HEAD);
}
@@ -937,7 +975,7 @@ static void set_border(int y, int x)
}
-static void town_borders(int t_idx, int qy, int qx)
+static void town_borders(int qy, int qx)
{
int y, x;
@@ -968,10 +1006,11 @@ static void town_borders(int t_idx, int qy, int qx)
static bool_ create_townpeople_hook(int r_idx)
{
- monster_race *r_ptr = &r_info[r_idx];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[r_idx];
- if (r_ptr->d_char == 't') return TRUE;
- else return FALSE;
+ return (r_ptr->d_char == 't');
}
@@ -982,9 +1021,9 @@ static bool_ create_townpeople_hook(int r_idx)
* layout, including the size and shape of the buildings, the
* locations of the doorways, and the location of the stairs.
*/
-static void town_gen_hack(int t_idx, int qy, int qx)
+static void town_gen_hack(int qy, int qx)
{
- int y, x, floor, num = 0;
+ int y, x, floor;
bool_ (*old_get_mon_num_hook)(int r_idx);
/* Do we use dungeon floor or normal one */
@@ -1003,8 +1042,7 @@ static void town_gen_hack(int t_idx, int qy, int qx)
}
/* Prepare an Array of "remaining stores", and count them */
- std::unique_ptr<int[]> rooms(new int[max_st_idx]);
- num = get_shops(rooms.get());
+ auto rooms = get_shops();
/* Place two rows of stores */
for (y = 0; y < 2; y++)
@@ -1012,16 +1050,20 @@ static void town_gen_hack(int t_idx, int qy, int qx)
/* Place four stores per row */
for (x = 0; x < 4; x++)
{
- if(--num > -1)
+ if (!rooms.empty())
{
+ /* Extract store */
+ auto room = rooms.back();
+ rooms.pop_back();
+
/* Build that store at the proper location */
- build_store(qy, qx, rooms[num], y, x);
+ build_store(qy, qx, room, y, x);
}
}
}
/* Generates the town's borders */
- if (magik(TOWN_NORMAL_FLOOR)) town_borders(t_idx, qy, qx);
+ if (magik(TOWN_NORMAL_FLOOR)) town_borders(qy, qx);
/* Some inhabitants(leveled .. hehe :) */
@@ -1070,9 +1112,9 @@ static void town_gen_hack(int t_idx, int qy, int qx)
get_mon_num_prep();
}
-static void town_gen_circle(int t_idx, int qy, int qx)
+static void town_gen_circle(int qy, int qx)
{
- int y, x, cy, cx, rad, floor, num = 0;
+ int y, x, cy, cx, rad, floor;
bool_ (*old_get_mon_num_hook)(int r_idx);
/* Do we use dungeon floor or normal one */
@@ -1135,9 +1177,8 @@ static void town_gen_circle(int t_idx, int qy, int qx)
}
}
- /* Prepare an Array of "remaining stores", and count them */
- std::unique_ptr<int[]> rooms(new int[max_st_idx]);
- num = get_shops(rooms.get());
+ /* Get "remaining stores" */
+ auto rooms = get_shops();
/* Place two rows of stores */
for (y = 0; y < 2; y++)
@@ -1145,10 +1186,14 @@ static void town_gen_circle(int t_idx, int qy, int qx)
/* Place four stores per row */
for (x = 0; x < 4; x++)
{
- if(--num > -1)
+ if (!rooms.empty())
{
+ /* Extract store */
+ auto room = rooms.back();
+ rooms.pop_back();
+
/* Build that store at the proper location */
- build_store_circle(qy, qx, rooms[num], y, x);
+ build_store_circle(qy, qx, room, y, x);
}
}
}
@@ -1199,33 +1244,40 @@ static void town_gen_circle(int t_idx, int qy, int qx)
}
-static void town_gen_hidden(int t_idx, int qy, int qx)
+static void town_gen_hidden()
{
- int y, x, n, num = 0, i;
-
- /* Prepare an Array of "remaining stores", and count them */
- std::unique_ptr<int[]> rooms(new int[max_st_idx]);
- num = get_shops(rooms.get());
+ /* Get "remaining stores" */
+ auto rooms = get_shops();
/* Get a number of stores to place */
- n = rand_int(num / 2) + (num / 2);
+ std::size_t n = rand_int(rooms.size() / 2) + (rooms.size() / 2);
/* Place k stores */
- for (i = 0; i < n; i++)
+ for (std::size_t i = 0; i < n; i++)
{
/* Find a good spot */
+ int x;
+ int y;
while (TRUE)
{
y = rand_range(1, cur_hgt - 2);
x = rand_range(1, cur_wid - 2);
- if (cave_empty_bold(y, x)) break;
+ if (cave_empty_bold(y, x))
+ {
+ break;
+ }
}
- if(--num > -1)
+ /* Any stores left? */
+ if (!rooms.empty())
{
+ /* Extract store */
+ auto room = rooms.back();
+ rooms.pop_back();
+
/* Build that store at the proper location */
- build_store_hidden(rooms[num], y, x);
+ build_store_hidden(room, y, x);
}
}
}
@@ -1250,22 +1302,20 @@ static void town_gen_hidden(int t_idx, int qy, int qx)
*/
void town_gen(int t_idx)
{
- int qy, qx;
-
/* Level too small to contain a town */
if (cur_hgt < SCREEN_HGT) return;
if (cur_wid < SCREEN_WID) return;
- /* Center fo the level */
- qy = (cur_hgt - SCREEN_HGT) / 2;
- qx = (cur_wid - SCREEN_WID) / 2;
+ /* Center of the level */
+ int qy = (cur_hgt - SCREEN_HGT) / 2;
+ int qx = (cur_wid - SCREEN_WID) / 2;
/* Build stuff */
switch (rand_int(3))
{
case 0:
{
- town_gen_hack(t_idx, qy, qx);
+ town_gen_hack(qy, qx);
if (wizard)
{
msg_format("Town level(normal) (%d, seed %d)",
@@ -1276,7 +1326,7 @@ void town_gen(int t_idx)
case 1:
{
- town_gen_circle(t_idx, qy, qx);
+ town_gen_circle(qy, qx);
if (wizard)
{
msg_format("Town level(circle)(%d, seed %d)",
@@ -1287,7 +1337,7 @@ void town_gen(int t_idx)
case 2:
{
- town_gen_hidden(t_idx, qy, qx);
+ town_gen_hidden();
if (wizard)
{
msg_format("Town level(hidden)(%d, seed %d)",
diff --git a/src/wild.hpp b/src/wild.hpp
index 4cd9f0e7..d6a40e8d 100644
--- a/src/wild.hpp
+++ b/src/wild.hpp
@@ -1,6 +1,6 @@
#pragma once
-extern void wilderness_gen();
-extern void wilderness_gen_small(void);
-extern void reveal_wilderness_around_player(int y, int x, int h, int w);
-extern void town_gen(int t_idx);
+void wilderness_gen();
+void wilderness_gen_small();
+void reveal_wilderness_around_player(int y, int x, int h, int w);
+void town_gen(int t_idx);
diff --git a/src/wilderness_map.hpp b/src/wilderness_map.hpp
index 41e873bd..3db36101 100644
--- a/src/wilderness_map.hpp
+++ b/src/wilderness_map.hpp
@@ -1,15 +1,15 @@
#pragma once
#include "h-basic.h"
+#include "seed.hpp"
/**
* A structure describing a wilderness map
*/
struct wilderness_map
{
- int feat; /* Wilderness feature */
- u32b seed; /* Seed for the RNG */
- u16b entrance; /* Entrance for dungeons */
-
- bool_ known; /* Is it seen by the player ? */
+ int feat = 0; /* Wilderness feature */
+ seed_t seed = seed_t::system(); /* Seed for the RNG when building tile */
+ u16b entrance = 0; /* Entrance for dungeons */
+ bool_ known = FALSE; /* Is it seen by the player ? */
};
diff --git a/src/wilderness_type_info.hpp b/src/wilderness_type_info.hpp
index bc23c03e..fa834e09 100644
--- a/src/wilderness_type_info.hpp
+++ b/src/wilderness_type_info.hpp
@@ -9,17 +9,16 @@
*/
struct wilderness_type_info
{
- const char *name; /* Name */
- const char *text; /* Text */
+ const char *name = nullptr; /* Name */
+ const char *text = nullptr; /* Text */
- u16b entrance; /* Which town is there(<1000 i's a town, >=1000 it a dungeon) */
- s32b wild_x; /* Map coordinates (backed out while parsing map) */
- s32b wild_y;
- byte road; /* Flags of road */
- int level; /* Difficulty level */
- u32b flags1; /* Some flags */
- byte feat; /* The feature of f_info.txt that is used to allow passing, ... and to get a char/color/graph */
- byte terrain_idx; /* Terrain index(defined in defines.h) */
+ u16b entrance = 0; /* Which town is there(<1000 i's a town, >=1000 it a dungeon) */
+ s32b wild_x = 0; /* Map coordinates (backed out while parsing map) */
+ s32b wild_y = 0;
+ byte road = 0; /* Flags of road */
+ int level = 0; /* Difficulty level */
+ byte feat = 0; /* The feature of f_info.txt that is used to allow passing, ... and to get a char/color/graph */
+ byte terrain_idx = 0; /* Terrain index(defined in defines.h) */
- byte terrain[MAX_WILD_TERRAIN];/* Feature types for the plasma generator */
+ byte terrain[MAX_WILD_TERRAIN] = { 0 }; /* Feature types for the plasma generator */
};
diff --git a/src/wilderness_type_info_fwd.hpp b/src/wilderness_type_info_fwd.hpp
deleted file mode 100644
index a206c9e3..00000000
--- a/src/wilderness_type_info_fwd.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-struct wilderness_type_info;
diff --git a/src/wizard1.cc b/src/wizard1.cc
deleted file mode 100644
index 616a46cd..00000000
--- a/src/wizard1.cc
+++ /dev/null
@@ -1,2499 +0,0 @@
-#include "wizard1.hpp"
-
-#include "artifact_type.hpp"
-#include "cmd7.hpp"
-#include "ego_item_type.hpp"
-#include "monster_race.hpp"
-#include "object1.hpp"
-#include "object2.hpp"
-#include "object_kind.hpp"
-#include "object_type.hpp"
-#include "skill_type.hpp"
-#include "tables.hpp"
-#include "util.hpp"
-#include "util.h"
-#include "variable.h"
-#include "variable.hpp"
-
-#include <vector>
-
-/*
- * The spoiler file being created
- */
-static FILE *fff = NULL;
-
-
-/*
- * Write out `n' of the character `c' to the spoiler file
- */
-static void spoiler_out_n_chars(int n, char c)
-{
- while (--n >= 0) fputc(c, fff);
-}
-
-
-/*
- * Write out `n' blank lines to the spoiler file
- */
-static void spoiler_blanklines(int n)
-{
- spoiler_out_n_chars(n, '\n');
-}
-
-
-/*
- * Write a line to the spoiler file and then "underline" it with hyphens
- */
-static void spoiler_underline(cptr str)
-{
- fprintf(fff, "%s\n", str);
- spoiler_out_n_chars(strlen(str), '-');
- fprintf(fff, "\n");
-}
-
-
-/*
- * Buffer text to the given file. (-SHAWN-)
- * This is basically c_roff() from mon-desc.c with a few changes.
- */
-static void spoil_out(cptr str)
-{
- cptr r;
-
- /* Line buffer */
- static char roff_buf[256];
-
- /* Current pointer into line roff_buf */
- static char *roff_p = roff_buf;
-
- /* Last space saved into roff_buf */
- static char *roff_s = NULL;
-
- /* Special handling for "new sequence" */
- if (!str)
- {
- if (roff_p != roff_buf) roff_p--;
- while (*roff_p == ' ' && roff_p != roff_buf) roff_p--;
- if (roff_p == roff_buf) fprintf(fff, "\n");
- else
- {
- *(roff_p + 1) = '\0';
- fprintf(fff, "%s\n\n", roff_buf);
- }
- roff_p = roff_buf;
- roff_s = NULL;
- roff_buf[0] = '\0';
- return;
- }
-
- /* Scan the given string, character at a time */
- for (; *str; str++)
- {
- char ch = *str;
- int wrap = (ch == '\n');
-
- if (!isprint(ch)) ch = ' ';
- if (roff_p >= roff_buf + 75) wrap = 1;
- if ((ch == ' ') && (roff_p + 2 >= roff_buf + 75)) wrap = 1;
-
- /* Handle line-wrap */
- if (wrap)
- {
- *roff_p = '\0';
- r = roff_p;
- if (roff_s && (ch != ' '))
- {
- *roff_s = '\0';
- r = roff_s + 1;
- }
- fprintf(fff, "%s\n", roff_buf);
- roff_s = NULL;
- roff_p = roff_buf;
- while (*r) *roff_p++ = *r++;
- }
-
- /* Save the char */
- if ((roff_p > roff_buf) || (ch != ' '))
- {
- if (ch == ' ') roff_s = roff_p;
- *roff_p++ = ch;
- }
- }
-}
-
-
-/*
- * Extract a textual representation of an attribute
- */
-static cptr attr_to_text(byte a)
-{
- switch (a)
- {
- case TERM_DARK:
- return ("xxx");
- case TERM_WHITE:
- return ("White");
- case TERM_SLATE:
- return ("Slate");
- case TERM_ORANGE:
- return ("Orange");
- case TERM_RED:
- return ("Red");
- case TERM_GREEN:
- return ("Green");
- case TERM_BLUE:
- return ("Blue");
- case TERM_UMBER:
- return ("Umber");
- case TERM_L_DARK:
- return ("L.Dark");
- case TERM_L_WHITE:
- return ("L.Slate");
- case TERM_VIOLET:
- return ("Violet");
- case TERM_YELLOW:
- return ("Yellow");
- case TERM_L_RED:
- return ("L.Red");
- case TERM_L_GREEN:
- return ("L.Green");
- case TERM_L_BLUE:
- return ("L.Blue");
- case TERM_L_UMBER:
- return ("L.Umber");
- }
-
- /* Oops */
- return ("Icky");
-}
-
-
-
-/*
- * A tval grouper
- */
-typedef struct
-{
- byte tval;
- cptr name;
-}
-grouper;
-
-
-
-/*
- * Item Spoilers by: benh@phial.com (Ben Harrison)
- */
-
-
-/*
- * The basic items categorized by type
- */
-static grouper group_item[] =
-{
- { TV_SWORD, "Melee Weapons" },
- { TV_POLEARM, NULL },
- { TV_HAFTED, NULL },
- { TV_AXE, NULL },
- { TV_MSTAFF, NULL },
-
- { TV_BOW, "Bows and Slings" },
-
- { TV_SHOT, "Ammo" },
- { TV_ARROW, NULL },
- { TV_BOLT, NULL },
-
- { TV_BOOMERANG, "Boomerangs" },
-
- { TV_INSTRUMENT, "Instruments" },
-
- { TV_SOFT_ARMOR, "Armour (Body)" },
- { TV_HARD_ARMOR, NULL },
- { TV_DRAG_ARMOR, NULL },
-
- { TV_SHIELD, "Armour (Misc)" },
- { TV_HELM, NULL },
- { TV_CROWN, NULL },
- { TV_GLOVES, NULL },
- { TV_BOOTS, NULL },
-
- { TV_CLOAK, "Cloaks" },
- { TV_AMULET, "Amulets" },
- { TV_RING, "Rings" },
-
- { TV_SCROLL, "Scrolls" },
- { TV_POTION, "Potions" },
- { TV_POTION2, NULL },
-
- { TV_FOOD, "Food" },
-
- { TV_ROD_MAIN, "Rods" },
- { TV_ROD, "Rod Tips" },
- { TV_WAND, "Wands" },
- { TV_STAFF, "Staves" },
-
- { TV_BOOK, "Books (Magic, Gods, Music)" },
- { TV_DAEMON_BOOK, "Demonic Equipment" },
-
- { TV_RUNE1, "Runes" },
- { TV_RUNE2, NULL },
-
- { TV_PARCHMENT, "Parchments" },
-
- { TV_DIGGING, "Tools" },
- { TV_TOOL, NULL },
-
- { TV_TRAPKIT, "Trapping Kits" },
-
- { TV_CHEST, "Chests" },
-
- { TV_SPIKE, "Various" },
- { TV_LITE, NULL },
- { TV_FLASK, NULL },
- { TV_BOTTLE, NULL },
- { TV_JUNK, NULL },
-
- { TV_SKELETON, "Corpses and Eggs" },
- { TV_CORPSE, NULL },
- { TV_EGG, NULL },
-
- { 0, "" }
-};
-
-
-/*
- * Describe the kind
- */
-static void kind_info(char *buf, char *dam, char *wgt, int *lev, s32b *val, int k)
-{
- object_type forge;
- object_type *q_ptr;
-
- object_kind *k_ptr;
-
-
- /* Get local object */
- q_ptr = &forge;
-
- /* Prepare a fake item */
- object_prep(q_ptr, k);
-
- /* Obtain the "kind" info */
- k_ptr = &k_info[q_ptr->k_idx];
-
- /* It is known */
- q_ptr->ident |= (IDENT_KNOWN);
-
- /* Cancel bonuses */
- q_ptr->to_a = 0;
- q_ptr->to_h = 0;
- q_ptr->to_d = 0;
-
- if ((k_ptr->tval == TV_WAND) || (k_ptr->tval == TV_STAFF))
- {
- apply_magic(q_ptr, 0, FALSE, FALSE, FALSE, boost::make_optional(0));
- }
-
- /* Level */
- (*lev) = k_ptr->level;
-
- /* Value */
- (*val) = object_value(q_ptr);
-
-
- /* Hack */
- if (!buf || !dam || !wgt) return;
-
-
- /* Description (too brief) */
- object_desc_store(buf, q_ptr, FALSE, 0);
-
-
- /* Misc info */
- strcpy(dam, "");
-
- /* Damage */
- switch (q_ptr->tval)
- {
- /* Bows */
- case TV_BOW:
- {
- break;
- }
-
- /* Ammo */
- case TV_SHOT:
- case TV_BOLT:
- case TV_ARROW:
-
- /* Boomerangs */
- case TV_BOOMERANG:
-
- /* Weapons */
- case TV_HAFTED:
- case TV_POLEARM:
- case TV_SWORD:
- case TV_AXE:
- case TV_MSTAFF:
-
- /* Tools */
- case TV_DIGGING:
- {
- sprintf(dam, "%dd%d", q_ptr->dd, q_ptr->ds);
- break;
- }
-
- /* Armour */
- case TV_BOOTS:
- case TV_GLOVES:
- case TV_CLOAK:
- case TV_CROWN:
- case TV_HELM:
- case TV_SHIELD:
- case TV_SOFT_ARMOR:
- case TV_HARD_ARMOR:
- case TV_DRAG_ARMOR:
- {
- sprintf(dam, "%d", q_ptr->ac);
- break;
- }
- }
-
-
- /* Weight */
- sprintf(wgt, "%3ld.%ld", (long int) (q_ptr->weight / 10), (long int) (q_ptr->weight % 10));
-}
-
-
-/*
- * Create a spoiler file for items
- */
-static void spoil_obj_desc(cptr fname)
-{
- int i, k, s, t, n = 0;
-
- u16b who[200];
-
- char buf[1024];
-
- char wgt[80];
- char dam[80];
-
-
- /* Build the filename */
- path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
-
- /* Open the file */
- fff = my_fopen(buf, "w");
-
- /* Oops */
- if (!fff)
- {
- msg_print("Cannot create spoiler file.");
- return;
- }
-
-
- /* Header */
- sprintf(buf, "Basic Items Spoilers for %s", get_version_string());
- spoiler_underline(buf);
- spoiler_blanklines(2);
-
- /* More Header */
- fprintf(fff, "%-45s %8s%7s%5s%9s\n",
- "Description", "Dam/AC", "Wgt", "Lev", "Cost");
- fprintf(fff, "%-45s %8s%7s%5s%9s\n",
- "----------------------------------------",
- "------", "---", "---", "----");
-
- /* List the groups */
- for (i = 0; TRUE; i++)
- {
- /* Write out the group title */
- if (group_item[i].name)
- {
- /* Hack -- bubble-sort by cost and then level */
- for (s = 0; s < n - 1; s++)
- {
- for (t = 0; t < n - 1; t++)
- {
- int i1 = t;
- int i2 = t + 1;
-
- int e1;
- int e2;
-
- s32b t1;
- s32b t2;
-
- kind_info(NULL, NULL, NULL, &e1, &t1, who[i1]);
- kind_info(NULL, NULL, NULL, &e2, &t2, who[i2]);
-
- if ((t1 > t2) || ((t1 == t2) && (e1 > e2)))
- {
- int tmp = who[i1];
- who[i1] = who[i2];
- who[i2] = tmp;
- }
- }
- }
-
- /* Spoil each item */
- for (s = 0; s < n; s++)
- {
- int e;
- s32b v;
-
- /* Describe the kind */
- kind_info(buf, dam, wgt, &e, &v, who[s]);
-
- /* Dump it */
- fprintf(fff, " %-45s%8s%7s%5d%9ld\n",
- buf, dam, wgt, e, (long)(v));
- }
-
- /* Start a new set */
- n = 0;
-
- /* Notice the end */
- if (!group_item[i].tval) break;
-
- /* Start a new set */
- fprintf(fff, "\n\n%s\n\n", group_item[i].name);
- }
-
- /* Acquire legal item types */
- for (k = 1; k < max_k_idx; k++)
- {
- object_kind *k_ptr = &k_info[k];
-
- /* Skip wrong tval's */
- if (k_ptr->tval != group_item[i].tval) continue;
-
- /* Hack -- Skip artifacts */
- if (k_ptr->flags3 & (TR3_INSTA_ART | TR3_NORM_ART)) continue;
-
- /* Hack -- Skip Ring of Powers */
- if (k == 785) continue;
-
- /* Save the index */
- who[n++] = k;
- }
- }
-
-
- /* Check for errors */
- if (ferror(fff) || my_fclose(fff))
- {
- msg_print("Cannot close spoiler file.");
- return;
- }
-
- /* Message */
- msg_print("Successfully created a spoiler file.");
-}
-
-
-
-/*
- * Artifact Spoilers by: randy@PICARD.tamu.edu (Randy Hutson)
- */
-
-
-/*
- * Returns a "+" string if a number is non-negative and an empty
- * string if negative
- */
-#define POSITIZE(v) (((v) >= 0) ? "+" : "")
-
-/*
- * These are used to format the artifact spoiler file. INDENT1 is used
- * to indent all but the first line of an artifact spoiler. INDENT2 is
- * used when a line "wraps". (Bladeturner's resistances cause this.)
- */
-#define INDENT1 " "
-#define INDENT2 " "
-
-/*
- * MAX_LINE_LEN specifies when a line should wrap.
- */
-#define MAX_LINE_LEN 75
-
-/*
- * Given an array, determine how many elements are in the array
- */
-#define N_ELEMENTS(a) (sizeof (a) / sizeof ((a)[0]))
-
-/*
- * The artifacts categorized by type
- */
-static grouper group_artifact[] =
-{
- { TV_SWORD, "Edged Weapons" },
- { TV_POLEARM, "Polearms" },
- { TV_HAFTED, "Hafted Weapons" },
- { TV_AXE, "Axes" },
-
- { TV_MSTAFF, "Mage Staffs" },
-
- { TV_BOW, "Bows" },
-
- { TV_SHOT, "Ammo" },
- { TV_ARROW, NULL },
- { TV_BOLT, NULL },
-
- { TV_BOOMERANG, "Boomerangs" },
-
- { TV_INSTRUMENT, "Instruments" },
-
- { TV_SOFT_ARMOR, "Body Armor" },
- { TV_HARD_ARMOR, NULL },
- { TV_DRAG_ARMOR, NULL },
-
- { TV_CLOAK, "Cloaks" },
- { TV_SHIELD, "Shields" },
- { TV_HELM, "Helms/Crowns" },
- { TV_CROWN, NULL },
- { TV_GLOVES, "Gloves" },
- { TV_BOOTS, "Boots" },
-
- { TV_DAEMON_BOOK, "Demonic Equipment" },
-
- { TV_LITE, "Light Sources" },
- { TV_AMULET, "Amulets" },
- { TV_RING, "Rings" },
-
- { TV_TOOL, "Tools" },
- { TV_DIGGING, NULL },
- { TV_TRAPKIT, "Trapping Kits" },
-
- { 0, NULL }
-};
-
-
-
-/*
- * Pair together a constant flag with a textual description.
- *
- * Used by both "init.c" and "wiz-spo.c".
- *
- * Note that it sometimes more efficient to actually make an array
- * of textual names, where entry 'N' is assumed to be paired with
- * the flag whose value is "1L << N", but that requires hard-coding.
- */
-
-typedef struct flag_desc flag_desc;
-
-struct flag_desc
-{
- const u32b flag;
- const char *const desc;
-};
-
-
-
-/*
- * These are used for "+3 to STR, DEX", etc. These are separate from
- * the other pval affected traits to simplify the case where an object
- * affects all stats. In this case, "All stats" is used instead of
- * listing each stat individually.
- */
-
-static flag_desc stat_flags_desc[] =
-{
- { TR1_STR, "STR" },
- { TR1_INT, "INT" },
- { TR1_WIS, "WIS" },
- { TR1_DEX, "DEX" },
- { TR1_CON, "CON" },
- { TR1_CHR, "CHR" }
-};
-
-/*
- * Besides stats, these are the other player traits
- * which may be affected by an object's pval
- */
-
-static flag_desc pval_flags1_desc[] =
-{
- { TR1_STEALTH, "Stealth" },
- { TR1_SEARCH, "Searching" },
- { TR1_INFRA, "Infravision" },
- { TR1_TUNNEL, "Tunnelling" },
- { TR1_BLOWS, "Attacks" },
- { TR1_SPEED, "Speed" }
-};
-
-/*
- * Slaying preferences for weapons
- */
-
-static flag_desc slay_flags_desc[] =
-{
- { TR1_SLAY_ANIMAL, "Animal" },
- { TR1_SLAY_EVIL, "Evil" },
- { TR1_SLAY_UNDEAD, "Undead" },
- { TR1_SLAY_DEMON, "Demon" },
- { TR1_SLAY_ORC, "Orc" },
- { TR1_SLAY_TROLL, "Troll" },
- { TR1_SLAY_GIANT, "Giant" },
- { TR1_SLAY_DRAGON, "Dragon" },
- { TR1_KILL_DRAGON, "Xdragon" }
-};
-
-/*
- * Elemental brands for weapons
- *
- * Clearly, TR1_IMPACT is a bit out of place here. To simplify
- * coding, it has been included here along with the elemental
- * brands. It does seem to fit in with the brands and slaying
- * more than the miscellaneous section.
- */
-static flag_desc brand_flags_desc[] =
-{
- { TR1_BRAND_ACID, "Acid Brand" },
- { TR1_BRAND_ELEC, "Lightning Brand" },
- { TR1_BRAND_FIRE, "Flame Tongue" },
- { TR1_BRAND_COLD, "Frost Brand" },
- { TR1_BRAND_POIS, "Poisoned" },
-
- { TR1_CHAOTIC, "Mark of Chaos" },
- { TR1_VAMPIRIC, "Vampiric" },
- { TR1_IMPACT, "Earthquake impact on hit" },
- { TR1_VORPAL, "Very sharp" },
-};
-
-
-/*
- * The 15 resistables
- */
-static const flag_desc resist_flags_desc[] =
-{
- { TR2_RES_ACID, "Acid" },
- { TR2_RES_ELEC, "Lightning" },
- { TR2_RES_FIRE, "Fire" },
- { TR2_RES_COLD, "Cold" },
- { TR2_RES_POIS, "Poison" },
- { TR2_RES_FEAR, "Fear"},
- { TR2_RES_LITE, "Light" },
- { TR2_RES_DARK, "Dark" },
- { TR2_RES_BLIND, "Blindness" },
- { TR2_RES_CONF, "Confusion" },
- { TR2_RES_SOUND, "Sound" },
- { TR2_RES_SHARDS, "Shards" },
- { TR2_RES_NETHER, "Nether" },
- { TR2_RES_NEXUS, "Nexus" },
- { TR2_RES_CHAOS, "Chaos" },
- { TR2_RES_DISEN, "Disenchantment" },
-};
-
-/*
- * Elemental immunities (along with poison)
- */
-
-static const flag_desc immune_flags_desc[] =
-{
- { TR2_IM_ACID, "Acid" },
- { TR2_IM_ELEC, "Lightning" },
- { TR2_IM_FIRE, "Fire" },
- { TR2_IM_COLD, "Cold" },
-};
-
-/*
- * Sustain stats - these are given their "own" line in the
- * spoiler file, mainly for simplicity
- */
-static const flag_desc sustain_flags_desc[] =
-{
- { TR2_SUST_STR, "STR" },
- { TR2_SUST_INT, "INT" },
- { TR2_SUST_WIS, "WIS" },
- { TR2_SUST_DEX, "DEX" },
- { TR2_SUST_CON, "CON" },
- { TR2_SUST_CHR, "CHR" },
-};
-
-/*
- * Miscellaneous magic given by an object's "flags2" field
- */
-
-static const flag_desc misc_flags2_desc[] =
-{
- { TR2_REFLECT, "Reflection" },
- { TR2_FREE_ACT, "Free Action" },
- { TR2_HOLD_LIFE, "Hold Life" },
-};
-
-/*
- * Miscellaneous magic given by an object's "flags3" field
- *
- * Note that cursed artifacts and objects with permanent light
- * are handled "directly" -- see analyze_misc_magic()
- */
-
-static const flag_desc misc_flags3_desc[] =
-{
- { TR3_SH_FIRE, "Fiery Aura" },
- { TR3_SH_ELEC, "Electric Aura" },
- { TR3_NO_TELE, "Prevent Teleportation" },
- { TR3_NO_MAGIC, "Anti-Magic" },
- { TR3_WRAITH, "Wraith Form" },
- { TR3_FEATHER, "Levitation" },
- { TR3_SEE_INVIS, "See Invisible" },
- { TR3_SLOW_DIGEST, "Slow Digestion" },
- { TR3_REGEN, "Regeneration" },
- { TR3_XTRA_SHOTS, "+1 Extra Shot" }, /* always +1? */
- { TR3_DRAIN_EXP, "Drains Experience" },
- { TR3_AGGRAVATE, "Aggravates" },
- { TR3_BLESSED, "Blessed Blade" },
-};
-
-
-/*
- * A special type used just for dealing with pvals
- */
-typedef struct
-{
- /*
- * This will contain a string such as "+2", "-10", etc.
- */
- char pval_desc[12];
-
- /*
- * A list of various player traits affected by an object's pval such
- * as stats, speed, stealth, etc. "Extra attacks" is NOT included in
- * this list since it will probably be desirable to format its
- * description differently.
- *
- * Note that room need only be reserved for the number of stats - 1
- * since the description "All stats" is used if an object affects all
- * all stats. Also, room must be reserved for a sentinel NULL pointer.
- *
- * This will be a list such as ["STR", "DEX", "Stealth", NULL] etc.
- *
- * This list includes extra attacks, for simplicity.
- */
- cptr pval_affects[N_ELEMENTS(stat_flags_desc) - 1 +
- N_ELEMENTS(pval_flags1_desc) + 1];
-
-}
-pval_info_type;
-
-
-/*
- * An "object analysis structure"
- *
- * It will be filled with descriptive strings detailing an object's
- * various magical powers. The "ignore X" traits are not noted since
- * all artifacts ignore "normal" destruction.
- */
-
-typedef struct
-{
- /* "The Longsword Dragonsmiter (6d4) (+20, +25)" */
- char description[160];
-
- /* Description of what is affected by an object's pval */
- pval_info_type pval_info;
-
- /* A list of an object's slaying preferences */
- cptr slays[N_ELEMENTS(slay_flags_desc) + 1];
-
- /* A list if an object's elemental brands */
- cptr brands[N_ELEMENTS(brand_flags_desc) + 1];
-
- /* A list of immunities granted by an object */
- cptr immunities[N_ELEMENTS(immune_flags_desc) + 1];
-
- /* A list of resistances granted by an object */
- cptr resistances[N_ELEMENTS(resist_flags_desc) + 1];
-
- /* A list of stats sustained by an object */
- cptr sustains[N_ELEMENTS(sustain_flags_desc) - 1 + 1];
-
- /* A list of various magical qualities an object may have */
- cptr misc_magic[N_ELEMENTS(misc_flags2_desc) + N_ELEMENTS(misc_flags3_desc)
- + 1 /* Permanent Light */
- + 1 /* type of curse */
- + 1]; /* sentinel NULL */
-
- /* A string describing an artifact's activation */
- cptr activation;
-
- /* "Level 20, Rarity 30, 3.0 lbs, 20000 Gold" */
- char misc_desc[80];
-}
-obj_desc_list;
-
-
-
-
-
-
-/*
- * This function does most of the actual "analysis". Given a set of bit flags
- * (which will be from one of the flags fields from the object in question),
- * a "flag description structure", a "description list", and the number of
- * elements in the "flag description structure", this function sets the
- * "description list" members to the appropriate descriptions contained in
- * the "flag description structure".
- *
- * The possibly updated description pointer is returned.
- */
-static cptr *spoiler_flag_aux(const u32b art_flags, const flag_desc *flag_ptr,
- cptr *desc_ptr, const int n_elmnts)
-{
- int i;
-
- for (i = 0; i < n_elmnts; ++i)
- {
- if (art_flags & flag_ptr[i].flag)
- {
- *desc_ptr++ = flag_ptr[i].desc;
- }
- }
-
- return desc_ptr;
-}
-
-
-/*
- * Acquire a "basic" description "The Cloak of Death [1,+10]"
- */
-static void analyze_general (object_type *o_ptr, char *desc_ptr)
-{
- /* Get a "useful" description of the object */
- object_desc_store(desc_ptr, o_ptr, TRUE, 1);
-}
-
-
-/*
- * List "player traits" altered by an artifact's pval. These include stats,
- * speed, infravision, tunnelling, stealth, searching, and extra attacks.
- */
-static void analyze_pval (object_type *o_ptr, pval_info_type *p_ptr)
-{
- const u32b all_stats = (TR1_STR | TR1_INT | TR1_WIS |
- TR1_DEX | TR1_CON | TR1_CHR);
-
- u32b f1, f2, f3, f4, f5, esp;
-
- cptr *affects_list;
-
- /* If pval == 0, there is nothing to do. */
- if (!o_ptr->pval)
- {
- /* An "empty" pval description indicates that pval == 0 */
- p_ptr->pval_desc[0] = '\0';
- return;
- }
-
- /* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- affects_list = p_ptr->pval_affects;
-
- /* Create the "+N" string */
- sprintf(p_ptr->pval_desc, "%s%ld", POSITIZE(o_ptr->pval), (long int) o_ptr->pval);
-
- /* First, check to see if the pval affects all stats */
- if ((f1 & all_stats) == all_stats)
- {
- *affects_list++ = "All stats";
- }
-
- /* Are any stats affected? */
- else if (f1 & all_stats)
- {
- affects_list = spoiler_flag_aux(f1, stat_flags_desc,
- affects_list,
- N_ELEMENTS(stat_flags_desc));
- }
-
- /* And now the "rest" */
- affects_list = spoiler_flag_aux(f1, pval_flags1_desc,
- affects_list,
- N_ELEMENTS(pval_flags1_desc));
-
- /* Terminate the description list */
- *affects_list = NULL;
-}
-
-
-/* Note the slaying specialties of a weapon */
-static void analyze_slay (object_type *o_ptr, cptr *slay_list)
-{
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- slay_list = spoiler_flag_aux(f1, slay_flags_desc, slay_list,
- N_ELEMENTS(slay_flags_desc));
-
- /* Terminate the description list */
- *slay_list = NULL;
-}
-
-/* Note an object's elemental brands */
-static void analyze_brand (object_type *o_ptr, cptr *brand_list)
-{
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- brand_list = spoiler_flag_aux(f1, brand_flags_desc, brand_list,
- N_ELEMENTS(brand_flags_desc));
-
- /* Terminate the description list */
- *brand_list = NULL;
-}
-
-
-/* Note the resistances granted by an object */
-static void analyze_resist (object_type *o_ptr, cptr *resist_list)
-{
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- resist_list = spoiler_flag_aux(f2, resist_flags_desc,
- resist_list, N_ELEMENTS(resist_flags_desc));
-
- /* Terminate the description list */
- *resist_list = NULL;
-}
-
-
-/* Note the immunities granted by an object */
-static void analyze_immune (object_type *o_ptr, cptr *immune_list)
-{
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- immune_list = spoiler_flag_aux(f2, immune_flags_desc,
- immune_list, N_ELEMENTS(immune_flags_desc));
-
- /* Terminate the description list */
- *immune_list = NULL;
-}
-
-/* Note which stats an object sustains */
-
-static void analyze_sustains (object_type *o_ptr, cptr *sustain_list)
-{
- const u32b all_sustains = (TR2_SUST_STR | TR2_SUST_INT | TR2_SUST_WIS |
- TR2_SUST_DEX | TR2_SUST_CON | TR2_SUST_CHR);
-
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- /* Simplify things if an item sustains all stats */
- if ((f2 & all_sustains) == all_sustains)
- {
- *sustain_list++ = "All stats";
- }
-
- /* Should we bother? */
- else if ((f2 & all_sustains))
- {
- sustain_list = spoiler_flag_aux(f2, sustain_flags_desc,
- sustain_list,
- N_ELEMENTS(sustain_flags_desc));
- }
-
- /* Terminate the description list */
- *sustain_list = NULL;
-}
-
-
-/*
- * Note miscellaneous powers bestowed by an artifact such as see invisible,
- * free action, permanent light, etc.
- */
-static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list)
-{
- u32b f1, f2, f3, f4, f5, esp;
- int radius = 0;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- misc_list = spoiler_flag_aux(f2, misc_flags2_desc, misc_list,
- N_ELEMENTS(misc_flags2_desc));
-
- misc_list = spoiler_flag_aux(f3, misc_flags3_desc, misc_list,
- N_ELEMENTS(misc_flags3_desc));
-
- /*
- * Glowing artifacts -- small radius light.
- */
-
- if (f3 & TR3_LITE1) radius++;
- if (f4 & TR4_LITE2) radius += 2;
- if (f4 & TR4_LITE3) radius += 3;
-
- if (f4 & TR4_FUEL_LITE)
- {
- *misc_list++ = format("It provides light (radius %d) forever.", radius);
- }
- else
- {
- *misc_list++ = format("It provides light (radius %d) when fueled.", radius);
- }
-
- /*
- * Handle cursed objects here to avoid redundancies such as noting
- * that a permanently cursed object is heavily cursed as well as
- * being "lightly cursed".
- */
-
- if (cursed_p(o_ptr))
- {
- if (f3 & (TR3_TY_CURSE))
- {
- *misc_list++ = "Ancient Curse";
- }
- if (f3 & (TR3_PERMA_CURSE))
- {
- *misc_list++ = "Permanently Cursed";
- }
- else if (f3 & (TR3_HEAVY_CURSE))
- {
- *misc_list++ = "Heavily Cursed";
- }
- else
- {
- *misc_list++ = "Cursed";
- }
- }
-
- /* Terminate the description list */
- *misc_list = NULL;
-}
-
-
-
-
-/*
- * Determine the minimum depth an artifact can appear, its rarity, its weight,
- * and its value in gold pieces
- */
-static void analyze_misc (object_type *o_ptr, char *misc_desc)
-{
- artifact_type *a_ptr = &a_info[o_ptr->name1];
-
- sprintf(misc_desc, "Level %u, Rarity %u, %d.%d lbs, %ld Gold",
- a_ptr->level, a_ptr->rarity,
- a_ptr->weight / 10, a_ptr->weight % 10, (long int) a_ptr->cost);
-}
-
-
-/*
- * Fill in an object description structure for a given object
- */
-static void object_analyze(object_type *o_ptr, obj_desc_list *desc_ptr)
-{
- analyze_general(o_ptr, desc_ptr->description);
-
- analyze_pval(o_ptr, &desc_ptr->pval_info);
-
- analyze_brand(o_ptr, desc_ptr->brands);
-
- analyze_slay(o_ptr, desc_ptr->slays);
-
- analyze_immune(o_ptr, desc_ptr->immunities);
-
- analyze_resist(o_ptr, desc_ptr->resistances);
-
- analyze_sustains(o_ptr, desc_ptr->sustains);
-
- analyze_misc_magic(o_ptr, desc_ptr->misc_magic);
-
- analyze_misc(o_ptr, desc_ptr->misc_desc);
-
- desc_ptr->activation = item_activation(o_ptr, 0);
-}
-
-
-static void print_header(void)
-{
- char buf[80];
-
- sprintf(buf, "Artifact Spoilers for %s", get_version_string());
- spoiler_underline(buf);
-}
-
-/*
- * This is somewhat ugly.
- *
- * Given a header ("Resist", e.g.), a list ("Fire", "Cold", Acid", e.g.),
- * and a separator character (',', e.g.), write the list to the spoiler file
- * in a "nice" format, such as:
- *
- * Resist Fire, Cold, Acid
- *
- * That was a simple example, but when the list is long, a line wrap
- * should occur, and this should induce a new level of indention if
- * a list is being spread across lines. So for example, Bladeturner's
- * list of resistances should look something like this
- *
- * Resist Acid, Lightning, Fire, Cold, Poison, Light, Dark, Blindness,
- * Confusion, Sound, Shards, Nether, Nexus, Chaos, Disenchantment
- *
- * However, the code distinguishes between a single list of many items vs.
- * many lists. (The separator is used to make this determination.) A single
- * list of many items will not cause line wrapping (since there is no
- * apparent reason to do so). So the lists of Ulmo's miscellaneous traits
- * might look like this:
- *
- * Free Action; Hold Life; See Invisible; Slow Digestion; Regeneration
- * Blessed Blade
- *
- * So comparing the two, "Regeneration" has no trailing separator and
- * "Blessed Blade" was not indented. (Also, Ulmo's lists have no headers,
- * but that's not relevant to line wrapping and indention.)
- */
-
-/* ITEM_SEP separates items within a list */
-#define ITEM_SEP ','
-
-
-/* LIST_SEP separates lists */
-#define LIST_SEP ';'
-
-
-/* Create a spoiler file entry for an artifact */
-
-static void spoiler_print_art(obj_desc_list *art_ptr, int name1, int set, object_type *o_ptr)
-{
- /* Don't indent the first line */
- fprintf(fff, "%s\n ", art_ptr->description);
- text_out_indent = 4;
- object_out_desc(o_ptr, fff, FALSE, TRUE);
- text_out_indent = 0;
-
- /* End with the miscellaneous facts */
- fprintf(fff, "%s%s\n\n", INDENT1, art_ptr->misc_desc);
-}
-
-
-/*
- * Hack -- Create a "forged" artifact
- */
-static bool_ make_fake_artifact(object_type *o_ptr, int name1)
-{
- int i;
- int cur;
-
- artifact_type *a_ptr = &a_info[name1];
-
-
- /* Ignore "empty" artifacts */
- if (!a_ptr->name) return FALSE;
-
- /* Acquire the "kind" index */
- i = lookup_kind(a_ptr->tval, a_ptr->sval);
-
- /* Oops */
- if (!i) return (FALSE);
-
- /* Create the artifact */
- object_prep(o_ptr, i);
-
- /* Save the name */
- o_ptr->name1 = name1;
-
- /* Keep the One Ring untouched by apply_magic */
- if (name1 != ART_POWER)
- {
- cur = a_ptr->cur_num;
- apply_magic(o_ptr, -1, TRUE, TRUE, TRUE);
- a_ptr->cur_num = cur;
- }
- else
- {
- o_ptr->pval = a_ptr->pval;
- }
-
- /* Success */
- return (TRUE);
-}
-
-
-/*
- * Create a spoiler file for artifacts
- */
-static void spoil_artifact(cptr fname)
-{
- int i, j;
-
- object_type forge;
- object_type *q_ptr;
-
- obj_desc_list artifact;
-
- char buf[1024];
-
-
- /* Build the filename */
- path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
-
- /* Open the file */
- fff = my_fopen(buf, "w");
-
- /* Oops */
- if (!fff)
- {
- msg_print("Cannot create spoiler file.");
- return;
- }
-
- /* Dump the header */
- print_header();
-
- /* List the artifacts by tval */
- for (i = 0; group_artifact[i].tval; i++)
- {
- /* Write out the group title */
- if (group_artifact[i].name)
- {
- spoiler_blanklines(2);
- spoiler_underline(group_artifact[i].name);
- spoiler_blanklines(1);
- }
-
- /* Now search through all of the artifacts */
- for (j = 1; j < max_a_idx; ++j)
- {
- artifact_type *a_ptr = &a_info[j];
-
- /* We only want objects in the current group */
- if (a_ptr->tval != group_artifact[i].tval) continue;
-
- /* Get local object */
- q_ptr = &forge;
-
- /* Wipe the object */
- object_wipe(q_ptr);
-
- /* Attempt to "forge" the artifact */
- if (!make_fake_artifact(q_ptr, j)) continue;
-
- /* Aware and Known */
- object_known(q_ptr);
-
- /* Mark the item as fully known */
- q_ptr->ident |= (IDENT_MENTAL);
-
- /* Analyze the artifact */
- object_analyze(q_ptr, &artifact);
-
- /* Write out the artifact description to the spoiler file */
- spoiler_print_art(&artifact, j, a_ptr->set, q_ptr);
- }
- }
-
- /* Check for errors */
- if (ferror(fff) || my_fclose(fff))
- {
- msg_print("Cannot close spoiler file.");
- return;
- }
-
- /* Message */
- msg_print("Successfully created a spoiler file.");
-}
-
-
-
-
-
-/*
- * Create a spoiler file for monsters -BEN-
- */
-static void spoil_mon_desc(cptr fname)
-{
- char buf[1024];
-
- char nam[80];
- char lev[80];
- char rar[80];
- char spd[80];
- char ac[80];
- char hp[80];
- char exp[80];
-
- /* Build the filename */
- path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
-
- /* Open the file */
- fff = my_fopen(buf, "w");
-
- /* Oops */
- if (!fff)
- {
- msg_print("Cannot create spoiler file.");
- return;
- }
-
- /* Allocate the "who" array */
- std::vector<s16b> who;
-
- /* Dump the header */
- sprintf(buf, "Monster Spoilers for %s", get_version_string());
- spoiler_underline(buf);
- spoiler_blanklines(2);
-
- /* Dump the header */
- fprintf(fff, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n",
- "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info");
- fprintf(fff, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n",
- "----", "---", "---", "---", "--", "--", "-----------");
-
-
- /* Scan the monsters */
- for (size_t i = 1; i < max_r_idx; i++)
- {
- monster_race *r_ptr = &r_info[i];
-
- /* Use that monster */
- if (r_ptr->name) {
- who.push_back(i);
- }
- }
-
-
- /* Scan again */
- for (auto const who_i : who)
- {
- monster_race *r_ptr = &r_info[who_i];
-
- /* Get the "name" */
- if (r_ptr->flags1 & (RF1_UNIQUE))
- {
- sprintf(nam, "[U] %s", r_ptr->name);
- }
- else
- {
- sprintf(nam, "The %s", r_ptr->name);
- }
-
-
- /* Level */
- sprintf(lev, "%d", r_ptr->level);
-
- /* Rarity */
- sprintf(rar, "%d", r_ptr->rarity);
-
- /* Speed */
- if (r_ptr->speed >= 110)
- {
- sprintf(spd, "+%d", (r_ptr->speed - 110));
- }
- else
- {
- sprintf(spd, "-%d", (110 - r_ptr->speed));
- }
-
- /* Armor Class */
- sprintf(ac, "%d", r_ptr->ac);
-
- /* Hitpoints */
- if ((r_ptr->flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
- {
- sprintf(hp, "%d", r_ptr->hdice * r_ptr->hside);
- }
- else
- {
- sprintf(hp, "%dd%d", r_ptr->hdice, r_ptr->hside);
- }
-
-
- /* Experience */
- sprintf(exp, "%ld", (long)(r_ptr->mexp));
-
- /* Hack -- use visual instead */
- sprintf(exp, "%s '%c'", attr_to_text(r_ptr->d_attr), r_ptr->d_char);
-
- /* Dump the info */
- fprintf(fff, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n",
- nam, lev, rar, spd, hp, ac, exp);
- }
-
- /* End it */
- fprintf(fff, "\n");
-
- /* Check for errors */
- if (ferror(fff) || my_fclose(fff))
- {
- msg_print("Cannot close spoiler file.");
- return;
- }
-
- /* Worked */
- msg_print("Successfully created a spoiler file.");
-}
-
-
-
-
-/*
- * Monster spoilers by: smchorse@ringer.cs.utsa.edu (Shawn McHorse)
- *
- * Primarily based on code already in mon-desc.c, mostly by -BEN-
- */
-
-/*
- * Pronoun arrays
- */
-static cptr wd_che[3] = { "It", "He", "She" };
-static cptr wd_lhe[3] = { "it", "he", "she" };
-
-
-
-/*
- * Create a spoiler file for monsters (-SHAWN-)
- */
-static void spoil_mon_info(cptr fname)
-{
- char buf[1024];
- int msex, vn, i, j, k, n;
- bool_ breath, magic, sin;
- cptr p, q;
- cptr vp[64];
- u32b flags1, flags2, flags3, flags4, flags5, flags6, flags9;
-
-
- /* Build the filename */
- path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
-
- /* Open the file */
- fff = my_fopen(buf, "w");
-
- /* Oops */
- if (!fff)
- {
- msg_print("Cannot create spoiler file.");
- return;
- }
-
-
- /* Dump the header */
- sprintf(buf, "Monster Spoilers for %s", get_version_string());
- spoiler_underline(buf);
- spoiler_blanklines(2);
-
- /*
- * List all monsters in order.
- */
- for (n = 1; n < max_r_idx; n++)
- {
- monster_race *r_ptr = &r_info[n];
-
- /* Extract the flags */
- flags1 = r_ptr->flags1;
- flags2 = r_ptr->flags2;
- flags3 = r_ptr->flags3;
- flags4 = r_ptr->flags4;
- flags5 = r_ptr->flags5;
- flags6 = r_ptr->flags6;
- flags9 = r_ptr->flags9;
- breath = FALSE;
- magic = FALSE;
-
- /* Extract a gender (if applicable) */
- if (flags1 & (RF1_FEMALE)) msex = 2;
- else if (flags1 & (RF1_MALE)) msex = 1;
- else msex = 0;
-
-
- /* Prefix */
- if (flags1 & (RF1_UNIQUE))
- {
- spoil_out("[U] ");
- }
- else
- {
- spoil_out("The ");
- }
-
- /* Name */
- sprintf(buf, "%s (", r_ptr->name); /* ---)--- */
- spoil_out(buf);
-
- /* Color */
- spoil_out(attr_to_text(r_ptr->d_attr));
-
- /* Symbol --(-- */
- sprintf(buf, " '%c')\n", r_ptr->d_char);
- spoil_out(buf);
-
-
- /* Indent */
- sprintf(buf, "=== ");
- spoil_out(buf);
-
- /* Number */
- sprintf(buf, "Num:%d ", n);
- spoil_out(buf);
-
- /* Level */
- sprintf(buf, "Lev:%d ", r_ptr->level);
- spoil_out(buf);
-
- /* Rarity */
- sprintf(buf, "Rar:%d ", r_ptr->rarity);
- spoil_out(buf);
-
- /* Speed */
- if (r_ptr->speed >= 110)
- {
- sprintf(buf, "Spd:+%d ", (r_ptr->speed - 110));
- }
- else
- {
- sprintf(buf, "Spd:-%d ", (110 - r_ptr->speed));
- }
- spoil_out(buf);
-
- /* Hitpoints */
- if ((flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
- {
- sprintf(buf, "Hp:%d ", r_ptr->hdice * r_ptr->hside);
- }
- else
- {
- sprintf(buf, "Hp:%dd%d ", r_ptr->hdice, r_ptr->hside);
- }
- spoil_out(buf);
-
- /* Armor Class */
- sprintf(buf, "Ac:%d ", r_ptr->ac);
- spoil_out(buf);
-
- /* Experience */
- sprintf(buf, "Exp:%ld\n", (long)(r_ptr->mexp));
- spoil_out(buf);
-
-
- /* Describe */
- spoil_out(r_ptr->text);
- spoil_out(" ");
-
-
- spoil_out("This");
-
- if (flags2 & (RF2_ELDRITCH_HORROR)) spoil_out (" sanity-blasting");
- if (flags3 & (RF3_ANIMAL)) spoil_out(" natural");
- if (flags3 & (RF3_EVIL)) spoil_out(" evil");
- if (flags3 & (RF3_GOOD)) spoil_out(" good");
- if (flags3 & (RF3_UNDEAD)) spoil_out(" undead");
-
- if (flags3 & (RF3_DRAGON)) spoil_out(" dragon");
- else if (flags3 & (RF3_DEMON)) spoil_out(" demon");
- else if (flags3 & (RF3_GIANT)) spoil_out(" giant");
- else if (flags3 & (RF3_TROLL)) spoil_out(" troll");
- else if (flags3 & (RF3_ORC)) spoil_out(" orc");
- else if (flags3 & (RF3_THUNDERLORD)) spoil_out (" Thunderlord");
- else spoil_out(" creature");
-
- spoil_out(" moves");
-
- if ((flags1 & (RF1_RAND_50)) && (flags1 & (RF1_RAND_25)))
- {
- spoil_out(" extremely erratically");
- }
- else if (flags1 & (RF1_RAND_50))
- {
- spoil_out(" somewhat erratically");
- }
- else if (flags1 & (RF1_RAND_25))
- {
- spoil_out(" a bit erratically");
- }
- else
- {
- spoil_out(" normally");
- }
-
- if (flags1 & (RF1_NEVER_MOVE))
- {
- spoil_out(", but does not deign to chase intruders");
- }
-
- spoil_out(". ");
-
- if (!r_ptr->level || (flags1 & (RF1_FORCE_DEPTH)))
- {
- sprintf(buf, "%s is never found out of depth. ", wd_che[msex]);
- spoil_out(buf);
- }
-
- if (flags1 & (RF1_FORCE_SLEEP))
- {
- sprintf(buf, "%s is always created sluggish. ", wd_che[msex]);
- spoil_out(buf);
- }
-
- if (flags2 & (RF2_AURA_FIRE))
- {
- sprintf(buf, "%s is surrounded by flames. ", wd_che[msex]);
- spoil_out(buf);
- }
-
- if (flags2 & (RF2_AURA_ELEC))
- {
- sprintf(buf, "%s is surrounded by electricity. ", wd_che[msex]);
- spoil_out(buf);
- }
-
- if (flags2 & (RF2_REFLECTING))
- {
- sprintf(buf, "%s reflects bolt spells. ", wd_che[msex]);
- spoil_out(buf);
- }
-
- if (flags1 & (RF1_ESCORT))
- {
- sprintf(buf, "%s usually appears with ", wd_che[msex]);
- spoil_out(buf);
- if (flags1 & (RF1_ESCORTS)) spoil_out("escorts. ");
- else spoil_out("an escort. ");
- }
-
- if ((flags1 & (RF1_FRIEND)) || (flags1 & (RF1_FRIENDS)))
- {
- sprintf(buf, "%s usually appears in groups. ", wd_che[msex]);
- spoil_out(buf);
- }
-
- /* Collect innate attacks */
- vn = 0;
- if (flags4 & (RF4_SHRIEK)) vp[vn++] = "shriek for help";
- if (flags4 & (RF4_ROCKET)) vp[vn++] = "shoot a rocket";
- if (flags4 & (RF4_ARROW_1)) vp[vn++] = "fire arrows";
- if (flags4 & (RF4_ARROW_2)) vp[vn++] = "fire arrows";
- if (flags4 & (RF4_ARROW_3)) vp[vn++] = "fire missiles";
- if (flags4 & (RF4_ARROW_4)) vp[vn++] = "fire missiles";
-
- if (vn)
- {
- spoil_out(wd_che[msex]);
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" may ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" or ");
- spoil_out(vp[i]);
- }
- spoil_out(". ");
- }
-
- /* Collect breaths */
- vn = 0;
- if (flags4 & (RF4_BR_ACID)) vp[vn++] = "acid";
- if (flags4 & (RF4_BR_ELEC)) vp[vn++] = "lightning";
- if (flags4 & (RF4_BR_FIRE)) vp[vn++] = "fire";
- if (flags4 & (RF4_BR_COLD)) vp[vn++] = "frost";
- if (flags4 & (RF4_BR_POIS)) vp[vn++] = "poison";
- if (flags4 & (RF4_BR_NETH)) vp[vn++] = "nether";
- if (flags4 & (RF4_BR_LITE)) vp[vn++] = "light";
- if (flags4 & (RF4_BR_DARK)) vp[vn++] = "darkness";
- if (flags4 & (RF4_BR_CONF)) vp[vn++] = "confusion";
- if (flags4 & (RF4_BR_SOUN)) vp[vn++] = "sound";
- if (flags4 & (RF4_BR_CHAO)) vp[vn++] = "chaos";
- if (flags4 & (RF4_BR_DISE)) vp[vn++] = "disenchantment";
- if (flags4 & (RF4_BR_NEXU)) vp[vn++] = "nexus";
- if (flags4 & (RF4_BR_TIME)) vp[vn++] = "time";
- if (flags4 & (RF4_BR_INER)) vp[vn++] = "inertia";
- if (flags4 & (RF4_BR_GRAV)) vp[vn++] = "gravity";
- if (flags4 & (RF4_BR_SHAR)) vp[vn++] = "shards";
- if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma";
- if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force";
- if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana";
- if (flags4 & (RF4_BR_NUKE)) vp[vn++] = "toxic waste";
- if (flags4 & (RF4_BR_DISI)) vp[vn++] = "disintegration";
-
- if (vn)
- {
- breath = TRUE;
- spoil_out(wd_che[msex]);
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" may breathe ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" or ");
- spoil_out(vp[i]);
- }
- if (flags2 & (RF2_POWERFUL)) spoil_out(" powerfully");
- }
-
- /* Collect spells */
- vn = 0;
- if (flags5 & (RF5_BA_ACID)) vp[vn++] = "produce acid balls";
- if (flags5 & (RF5_BA_ELEC)) vp[vn++] = "produce lightning balls";
- if (flags5 & (RF5_BA_FIRE)) vp[vn++] = "produce fire balls";
- if (flags5 & (RF5_BA_COLD)) vp[vn++] = "produce frost balls";
- if (flags5 & (RF5_BA_POIS)) vp[vn++] = "produce poison balls";
- if (flags5 & (RF5_BA_NETH)) vp[vn++] = "produce nether balls";
- if (flags5 & (RF5_BA_WATE)) vp[vn++] = "produce water balls";
- if (flags4 & (RF4_BA_NUKE)) vp[vn++] = "produce balls of radiation";
- if (flags5 & (RF5_BA_MANA)) vp[vn++] = "produce mana storms";
- if (flags5 & (RF5_BA_DARK)) vp[vn++] = "produce darkness storms";
- if (flags4 & (RF4_BA_CHAO)) vp[vn++] = "invoke raw Chaos";
- if (flags6 & (RF6_HAND_DOOM)) vp[vn++] = "invoke the Hand of Doom";
- if (flags5 & (RF5_DRAIN_MANA)) vp[vn++] = "drain mana";
- if (flags5 & (RF5_MIND_BLAST)) vp[vn++] = "cause mind blasting";
- if (flags5 & (RF5_BRAIN_SMASH)) vp[vn++] = "cause brain smashing";
- if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "cause light wounds and cursing";
- if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing";
- if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing";
- if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "cause mortal wounds";
- if (flags5 & (RF5_BO_ACID)) vp[vn++] = "produce acid bolts";
- if (flags5 & (RF5_BO_ELEC)) vp[vn++] = "produce lightning bolts";
- if (flags5 & (RF5_BO_FIRE)) vp[vn++] = "produce fire bolts";
- if (flags5 & (RF5_BO_COLD)) vp[vn++] = "produce frost bolts";
- if (flags5 & (RF5_BO_POIS)) vp[vn++] = "produce poison bolts";
- if (flags5 & (RF5_BO_NETH)) vp[vn++] = "produce nether bolts";
- if (flags5 & (RF5_BO_WATE)) vp[vn++] = "produce water bolts";
- if (flags5 & (RF5_BO_MANA)) vp[vn++] = "produce mana bolts";
- if (flags5 & (RF5_BO_PLAS)) vp[vn++] = "produce plasma bolts";
- if (flags5 & (RF5_BO_ICEE)) vp[vn++] = "produce ice bolts";
- if (flags5 & (RF5_MISSILE)) vp[vn++] = "produce magic missiles";
- if (flags5 & (RF5_SCARE)) vp[vn++] = "terrify";
- if (flags5 & (RF5_BLIND)) vp[vn++] = "blind";
- if (flags5 & (RF5_CONF)) vp[vn++] = "confuse";
- if (flags5 & (RF5_SLOW)) vp[vn++] = "slow";
- if (flags5 & (RF5_HOLD)) vp[vn++] = "paralyse";
- if (flags6 & (RF6_HASTE)) vp[vn++] = "haste-self";
- if (flags6 & (RF6_HEAL)) vp[vn++] = "heal-self";
- if (flags6 & (RF6_BLINK)) vp[vn++] = "blink-self";
- if (flags6 & (RF6_TPORT)) vp[vn++] = "teleport-self";
- if (flags6 & (RF6_S_BUG)) vp[vn++] = "summon software bugs";
- if (flags6 & (RF6_S_RNG)) vp[vn++] = "summon RNGs";
- if (flags6 & (RF6_TELE_TO)) vp[vn++] = "teleport to";
- if (flags6 & (RF6_TELE_AWAY)) vp[vn++] = "teleport away";
- if (flags6 & (RF6_TELE_LEVEL)) vp[vn++] = "teleport level";
- if (flags6 & (RF6_DARKNESS)) vp[vn++] = "create darkness";
- if (flags6 & (RF6_TRAPS)) vp[vn++] = "create traps";
- if (flags6 & (RF6_FORGET)) vp[vn++] = "cause amnesia";
- if (flags6 & (RF6_RAISE_DEAD)) vp[vn++] = "raise dead";
- if (flags6 & (RF6_S_THUNDERLORD)) vp[vn++] = "summon a thunderlord";
- if (flags6 & (RF6_S_MONSTER)) vp[vn++] = "summon a monster";
- if (flags6 & (RF6_S_MONSTERS)) vp[vn++] = "summon monsters";
- if (flags6 & (RF6_S_KIN)) vp[vn++] = "summon aid";
- if (flags6 & (RF6_S_ANT)) vp[vn++] = "summon ants";
- if (flags6 & (RF6_S_SPIDER)) vp[vn++] = "summon spiders";
- if (flags6 & (RF6_S_HOUND)) vp[vn++] = "summon hounds";
- if (flags6 & (RF6_S_HYDRA)) vp[vn++] = "summon hydras";
- if (flags6 & (RF6_S_ANGEL)) vp[vn++] = "summon an angel";
- if (flags6 & (RF6_S_DEMON)) vp[vn++] = "summon a demon";
- if (flags6 & (RF6_S_UNDEAD)) vp[vn++] = "summon an undead";
- if (flags6 & (RF6_S_DRAGON)) vp[vn++] = "summon a dragon";
- if (flags4 & (RF4_S_ANIMAL)) vp[vn++] = "summon animal";
- if (flags6 & (RF6_S_ANIMALS)) vp[vn++] = "summon animals";
- if (flags6 & (RF6_S_HI_UNDEAD)) vp[vn++] = "summon greater undead";
- if (flags6 & (RF6_S_HI_DRAGON)) vp[vn++] = "summon ancient dragons";
- if (flags6 & (RF6_S_HI_DEMON)) vp[vn++] = "summon greater demons";
- if (flags6 & (RF6_S_WRAITH)) vp[vn++] = "summon Ringwraith";
- if (flags6 & (RF6_S_UNIQUE)) vp[vn++] = "summon unique monsters";
-
- if (vn)
- {
- magic = TRUE;
- if (breath)
- {
- spoil_out(", and is also");
- }
- else
- {
- spoil_out(wd_che[msex]);
- spoil_out(" is");
- }
-
- spoil_out(" magical, casting spells");
- if (flags2 & (RF2_SMART)) spoil_out(" intelligently");
-
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" which ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" or ");
- spoil_out(vp[i]);
- }
- }
-
- if (breath || magic)
- {
- int times = r_ptr->freq_inate + r_ptr->freq_spell;
- sprintf(buf, "; 1 time in %d. ",
- 200 / ((times) ? times : 1));
- spoil_out(buf);
- }
-
- /* Collect special abilities. */
- vn = 0;
- if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "open doors";
- if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "bash down doors";
- if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "pass through walls";
- if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "bore through walls";
- if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "push past weaker monsters";
- if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "destroy weaker monsters";
- if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "pick up objects";
- if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "destroy objects";
- if (flags9 & (RF9_HAS_LITE)) vp[vn++] = "illuminate the dungeon";
-
- if (vn)
- {
- spoil_out(wd_che[msex]);
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" can ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" and ");
- spoil_out(vp[i]);
- }
- spoil_out(". ");
- }
-
- if (flags2 & (RF2_INVISIBLE))
- {
- spoil_out(wd_che[msex]);
- spoil_out(" is invisible. ");
- }
- if (flags2 & (RF2_COLD_BLOOD))
- {
- spoil_out(wd_che[msex]);
- spoil_out(" is cold blooded. ");
- }
- if (flags2 & (RF2_EMPTY_MIND))
- {
- spoil_out(wd_che[msex]);
- spoil_out(" is not detected by telepathy. ");
- }
- if (flags2 & (RF2_WEIRD_MIND))
- {
- spoil_out(wd_che[msex]);
- spoil_out(" is rarely detected by telepathy. ");
- }
- if (flags4 & (RF4_MULTIPLY))
- {
- spoil_out(wd_che[msex]);
- spoil_out(" breeds explosively. ");
- }
- if (flags2 & (RF2_REGENERATE))
- {
- spoil_out(wd_che[msex]);
- spoil_out(" regenerates quickly. ");
- }
-
- /* Collect susceptibilities */
- vn = 0;
- if (flags3 & (RF3_HURT_ROCK)) vp[vn++] = "rock remover";
- if (flags3 & (RF3_HURT_LITE)) vp[vn++] = "bright light";
- if (flags3 & (RF3_SUSCEP_FIRE)) vp[vn++] = "fire";
- if (flags3 & (RF3_SUSCEP_COLD)) vp[vn++] = "cold";
-
- if (vn)
- {
- spoil_out(wd_che[msex]);
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" is hurt by ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" and ");
- spoil_out(vp[i]);
- }
- spoil_out(". ");
- }
-
- /* Collect immunities */
- vn = 0;
- if (flags3 & (RF3_IM_ACID)) vp[vn++] = "acid";
- if (flags3 & (RF3_IM_ELEC)) vp[vn++] = "lightning";
- if (flags3 & (RF3_IM_FIRE)) vp[vn++] = "fire";
- if (flags3 & (RF3_IM_COLD)) vp[vn++] = "cold";
- if (flags3 & (RF3_IM_POIS)) vp[vn++] = "poison";
-
- if (vn)
- {
- spoil_out(wd_che[msex]);
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" resists ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" and ");
- spoil_out(vp[i]);
- }
- spoil_out(". ");
- }
-
- /* Collect resistances */
- vn = 0;
- if (flags3 & (RF3_RES_NETH)) vp[vn++] = "nether";
- if (flags3 & (RF3_RES_WATE)) vp[vn++] = "water";
- if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma";
- if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus";
- if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment";
- if (flags3 & (RF3_RES_TELE)) vp[vn++] = "teleportation";
-
- if (vn)
- {
- spoil_out(wd_che[msex]);
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" resists ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" and ");
- spoil_out(vp[i]);
- }
- spoil_out(". ");
- }
-
- /* Collect non-effects */
- vn = 0;
- if (flags3 & (RF3_NO_STUN)) vp[vn++] = "stunned";
- if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened";
- if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused";
- if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept";
-
- if (vn)
- {
- spoil_out(wd_che[msex]);
- for (i = 0; i < vn; i++)
- {
- if (!i) spoil_out(" cannot be ");
- else if (i < vn - 1) spoil_out(", ");
- else spoil_out(" or ");
- spoil_out(vp[i]);
- }
- spoil_out(". ");
- }
-
- spoil_out(wd_che[msex]);
- if (r_ptr->sleep > 200) spoil_out(" prefers to ignore");
- else if (r_ptr->sleep > 95) spoil_out(" pays very little attention to");
- else if (r_ptr->sleep > 75) spoil_out(" pays little attention to");
- else if (r_ptr->sleep > 45) spoil_out(" tends to overlook");
- else if (r_ptr->sleep > 25) spoil_out(" takes quite a while to see");
- else if (r_ptr->sleep > 10) spoil_out(" takes a while to see");
- else if (r_ptr->sleep > 5) spoil_out(" is fairly observant of");
- else if (r_ptr->sleep > 3) spoil_out(" is observant of");
- else if (r_ptr->sleep > 1) spoil_out(" is very observant of");
- else if (r_ptr->sleep > 0) spoil_out(" is vigilant for");
- else spoil_out(" is ever vigilant for");
-
- sprintf(buf, " intruders, which %s may notice from %d feet. ",
- wd_lhe[msex], 10 * r_ptr->aaf);
- spoil_out(buf);
-
- i = 0;
- if (flags1 & (RF1_DROP_60)) i += 1;
- if (flags1 & (RF1_DROP_90)) i += 2;
- if (flags1 & (RF1_DROP_1D2)) i += 2;
- if (flags1 & (RF1_DROP_2D2)) i += 4;
- if (flags1 & (RF1_DROP_3D2)) i += 6;
- if (flags1 & (RF1_DROP_4D2)) i += 8;
-
- /* Drops gold and/or items */
- if (i)
- {
- sin = FALSE;
- spoil_out(wd_che[msex]);
- spoil_out(" will carry");
-
- if (i == 1)
- {
- spoil_out(" a");
- sin = TRUE;
- }
- else if (i == 2)
- {
- spoil_out(" one or two");
- }
- else
- {
- sprintf(buf, " up to %u", i);
- spoil_out(buf);
- }
-
- if (flags1 & (RF1_DROP_GREAT))
- {
- if (sin) spoil_out("n");
- spoil_out(" exceptional object");
- }
- else if (flags1 & (RF1_DROP_GOOD))
- {
- spoil_out(" good object");
- }
- else if (flags1 & (RF1_DROP_USEFUL))
- {
- spoil_out(" useful object");
- }
- else if (flags1 & (RF1_ONLY_ITEM))
- {
- spoil_out(" object");
- }
- else if (flags1 & (RF1_ONLY_GOLD))
- {
- spoil_out(" treasure");
- }
- else
- {
- if (sin) spoil_out("n");
- spoil_out(" object");
- if (i > 1) spoil_out("s");
- spoil_out(" or treasure");
- }
- if (i > 1) spoil_out("s");
-
- if (flags1 & (RF1_DROP_CHOSEN))
- {
- spoil_out(", in addition to chosen objects");
- }
-
- spoil_out(". ");
- }
-
- /* Count the actual attacks */
- for (i = 0, j = 0; j < 4; j++)
- {
- if (r_ptr->blow[j].method) i++;
- }
-
- /* Examine the actual attacks */
- for (k = 0, j = 0; j < 4; j++)
- {
- if (!r_ptr->blow[j].method) continue;
-
- /* No method yet */
- p = "???";
-
- /* Acquire the method */
- switch (r_ptr->blow[j].method)
- {
- case RBM_HIT:
- p = "hit";
- break;
- case RBM_TOUCH:
- p = "touch";
- break;
- case RBM_PUNCH:
- p = "punch";
- break;
- case RBM_KICK:
- p = "kick";
- break;
- case RBM_CLAW:
- p = "claw";
- break;
- case RBM_BITE:
- p = "bite";
- break;
- case RBM_STING:
- p = "sting";
- break;
- case RBM_XXX1:
- break;
- case RBM_BUTT:
- p = "butt";
- break;
- case RBM_CRUSH:
- p = "crush";
- break;
- case RBM_ENGULF:
- p = "engulf";
- break;
- case RBM_CHARGE:
- p = "charge";
- break;
- case RBM_CRAWL:
- p = "crawl on you";
- break;
- case RBM_DROOL:
- p = "drool on you";
- break;
- case RBM_SPIT:
- p = "spit";
- break;
- case RBM_EXPLODE:
- p = "explode";
- break;
- case RBM_GAZE:
- p = "gaze";
- break;
- case RBM_WAIL:
- p = "wail";
- break;
- case RBM_SPORE:
- p = "release spores";
- break;
- case RBM_XXX4:
- break;
- case RBM_BEG:
- p = "beg";
- break;
- case RBM_INSULT:
- p = "insult";
- break;
- case RBM_MOAN:
- p = "moan";
- break;
- case RBM_SHOW:
- p = "sing";
- break;
- }
-
-
- /* Default effect */
- q = "???";
-
- /* Acquire the effect */
- switch (r_ptr->blow[j].effect)
- {
- case RBE_HURT:
- q = "attack";
- break;
- case RBE_POISON:
- q = "poison";
- break;
- case RBE_UN_BONUS:
- q = "disenchant";
- break;
- case RBE_UN_POWER:
- q = "drain charges";
- break;
- case RBE_EAT_GOLD:
- q = "steal gold";
- break;
- case RBE_EAT_ITEM:
- q = "steal items";
- break;
- case RBE_EAT_FOOD:
- q = "eat your food";
- break;
- case RBE_EAT_LITE:
- q = "absorb light";
- break;
- case RBE_ACID:
- q = "shoot acid";
- break;
- case RBE_ELEC:
- q = "electrocute";
- break;
- case RBE_FIRE:
- q = "burn";
- break;
- case RBE_COLD:
- q = "freeze";
- break;
- case RBE_BLIND:
- q = "blind";
- break;
- case RBE_CONFUSE:
- q = "confuse";
- break;
- case RBE_TERRIFY:
- q = "terrify";
- break;
- case RBE_PARALYZE:
- q = "paralyze";
- break;
- case RBE_LOSE_STR:
- q = "reduce strength";
- break;
- case RBE_LOSE_INT:
- q = "reduce intelligence";
- break;
- case RBE_LOSE_WIS:
- q = "reduce wisdom";
- break;
- case RBE_LOSE_DEX:
- q = "reduce dexterity";
- break;
- case RBE_LOSE_CON:
- q = "reduce constitution";
- break;
- case RBE_LOSE_CHR:
- q = "reduce charisma";
- break;
- case RBE_LOSE_ALL:
- q = "reduce all stats";
- break;
- case RBE_SHATTER:
- q = "shatter";
- break;
- case RBE_EXP_10:
- q = "lower experience (by 10d6+)";
- break;
- case RBE_EXP_20:
- q = "lower experience (by 20d6+)";
- break;
- case RBE_EXP_40:
- q = "lower experience (by 40d6+)";
- break;
- case RBE_EXP_80:
- q = "lower experience (by 80d6+)";
- break;
- case RBE_DISEASE:
- q = "disease";
- break;
- case RBE_TIME:
- q = "time";
- break;
- case RBE_SANITY:
- q = "make insane";
- break;
- case RBE_HALLU:
- q = "cause hallucinations";
- break;
- case RBE_PARASITE:
- q = "parasite";
- break;
- }
-
-
- if (!k)
- {
- spoil_out(wd_che[msex]);
- spoil_out(" can ");
- }
- else if (k < i - 1)
- {
- spoil_out(", ");
- }
- else
- {
- spoil_out(", and ");
- }
-
- /* Describe the method */
- spoil_out(p);
-
- /* Describe the effect, if any */
- if (r_ptr->blow[j].effect)
- {
- spoil_out(" to ");
- spoil_out(q);
- if (r_ptr->blow[j].d_dice && r_ptr->blow[j].d_side)
- {
- spoil_out(" with damage");
- if (r_ptr->blow[j].d_side == 1)
- sprintf(buf, " %d", r_ptr->blow[j].d_dice);
- else
- sprintf(buf, " %dd%d",
- r_ptr->blow[j].d_dice, r_ptr->blow[j].d_side);
- spoil_out(buf);
- }
- }
-
- k++;
- }
-
- if (k)
- {
- spoil_out(". ");
- }
- else if (flags1 & (RF1_NEVER_BLOW))
- {
- sprintf(buf, "%s has no physical attacks. ", wd_che[msex]);
- spoil_out(buf);
- }
-
- spoil_out(NULL);
- }
-
- /* Check for errors */
- if (ferror(fff) || my_fclose(fff))
- {
- msg_print("Cannot close spoiler file.");
- return;
- }
-
- msg_print("Successfully created a spoiler file.");
-}
-
-/*
- * Print a bookless spell list
- */
-void print_magic_powers( magic_power *powers, int max_powers, void(*power_info)(char *p, int power), int skill_num )
-{
- int i, save_skill;
-
- char buf[80];
-
- magic_power spell;
-
- /* Use a maximal skill */
- save_skill = s_info[skill_num].value;
- s_info[skill_num].value = SKILL_MAX;
-
- /* Dump the header line */
- spoiler_blanklines(2);
- sprintf(buf, "%s", s_info[skill_num].name);
- spoiler_underline(buf);
- spoiler_blanklines(1);
-
- fprintf(fff, " Name Lvl Mana Fail Info\n");
-
- /* Dump the spells */
- for (i = 0; i < max_powers; i++)
- {
- /* Access the spell */
- spell = powers[i];
-
- /* Get the additional info */
- power_info(buf, i);
-
- /* Dump the spell */
- spoil_out(format("%c) %-30s%2d %4d %3d%%%s\n",
- I2A(i), spell.name,
- spell.min_lev, spell.mana_cost, spell.fail, buf));
- spoil_out(format("%s\n", spell.desc));
- }
-
- /* Restore skill */
- s_info[skill_num].value = save_skill;
-}
-
-
-/*
- * Create a spoiler file for spells
- */
-
-static void spoil_spells(cptr fname)
-{
- char buf[1024];
-
- /* Build the filename */
- path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
-
- fff = my_fopen(buf, "w");
-
- /* Oops */
- if (!fff)
- {
- msg_print("Cannot create spoiler file.");
- return;
- }
-
- /* Dump the header */
- sprintf(buf, "Spell Spoiler (Skill Level 50) for %s", get_version_string());
- spoiler_underline(buf);
-
- /* Dump the bookless magic powers in alphabetical order */
-
- /* Mimicry */
- print_magic_powers(mimic_powers, MAX_MIMIC_POWERS, mimic_info, SKILL_MIMICRY);
-
- /* Mindcraft */
- print_magic_powers(mindcraft_powers, MAX_MINDCRAFT_POWERS, mindcraft_info, SKILL_MINDCRAFT);
-
- /* Necromancy */
- print_magic_powers(necro_powers, MAX_NECRO_POWERS, necro_info, SKILL_NECROMANCY);
-
- /* Symbiosis */
- print_magic_powers(symbiotic_powers, MAX_SYMBIOTIC_POWERS, symbiotic_info, SKILL_SYMBIOTIC);
-
- /* Check for errors */
- if (ferror(fff) || my_fclose(fff))
- {
- msg_print("Cannot close spoiler file.");
- return;
- }
-
- /* Message */
- msg_print("Successfully created a spoiler file.");
-}
-
-
-/*
- * Create Spoiler files -BEN-
- */
-void do_cmd_spoilers()
-{
- int i;
-
-
- /* Enter "icky" mode */
- character_icky = TRUE;
-
- /* Save the screen */
- Term_save();
-
- /* Interact */
- while (1)
- {
- /* Clear screen */
- Term_clear();
-
- /* Info */
- prt("Create a spoiler file.", 2, 0);
-
- /* Prompt for a file */
- prt("(1) Brief Object Info (obj-desc.spo)", 5, 5);
- prt("(2) Full Artifact Info (artifact.spo)", 6, 5);
- prt("(3) Brief Monster Info (mon-desc.spo)", 7, 5);
- prt("(4) Full Monster Info (mon-info.spo)", 8, 5);
- prt("(5) Spell Info (spell.spo)", 10, 5);
-
- /* Prompt */
- prt("Command: ", 12, 0);
-
- /* Get a choice */
- i = inkey();
-
- /* Escape */
- if (i == ESCAPE)
- {
- break;
- }
-
- /* Option (1) */
- else if (i == '1')
- {
- spoil_obj_desc("obj-desc.spo");
- }
-
- /* Option (2) */
- else if (i == '2')
- {
- spoil_artifact("artifact.spo");
- }
-
- /* Option (3) */
- else if (i == '3')
- {
- spoil_mon_desc("mon-desc.spo");
- }
-
- /* Option (4) */
- else if (i == '4')
- {
- spoil_mon_info("mon-info.spo");
- }
-
- /* Option (5) */
- else if (i == '5')
- {
- spoil_spells("spell.spo");
- }
-
- /* Oops */
- else
- {
- bell();
- }
-
- /* Flush messages */
- msg_print(NULL);
- }
-
-
- /* Restore the screen */
- Term_load();
-
- /* Leave "icky" mode */
- character_icky = FALSE;
-}
diff --git a/src/wizard1.hpp b/src/wizard1.hpp
deleted file mode 100644
index 0429aa70..00000000
--- a/src/wizard1.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-void do_cmd_spoilers();
diff --git a/src/wizard2.cc b/src/wizard2.cc
index 837d778b..890c6fbe 100644
--- a/src/wizard2.cc
+++ b/src/wizard2.cc
@@ -9,34 +9,35 @@
#include "wizard2.hpp"
#include "artifact_type.hpp"
+#include "birth.hpp"
#include "cave.hpp"
#include "cave_type.hpp"
#include "cmd4.hpp"
#include "corrupt.hpp"
#include "dungeon_info_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "hooks.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
+#include "object_flag_meta.hpp"
#include "object_kind.hpp"
#include "player_type.hpp"
#include "randart.hpp"
-#include "status.hpp"
#include "spells1.hpp"
#include "spells2.hpp"
#include "stats.hpp"
#include "tables.hpp"
-#include "traps.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
#include "variable.hpp"
#include "wilderness_map.hpp"
#include "wilderness_type_info.hpp"
-#include "wizard1.hpp"
#include "xtra1.hpp"
#include "xtra2.hpp"
#include "z-rand.hpp"
@@ -80,7 +81,7 @@ static void wiz_align_monster(int status)
*/
static void teleport_player_town(int town)
{
- int x = 0, y = 0;
+ auto const &wf_info = game->edit_data.wf_info;
autosave_checkpoint();
@@ -88,52 +89,43 @@ static void teleport_player_town(int town)
dun_level = 0;
p_ptr->town_num = town;
- for (x = 0; x < max_wild_x; x++)
- for (y = 0; y < max_wild_y; y++)
- if (p_ptr->town_num == wf_info[wild_map[y][x].feat].entrance) goto finteletown;
-finteletown:
- p_ptr->wilderness_y = y;
- p_ptr->wilderness_x = x;
+ auto const &wilderness = game->wilderness;
+ for (std::size_t y = 0; y < wilderness.height(); y++)
+ {
+ for (std::size_t x = 0; x < wilderness.width(); x++)
+ {
+ if (p_ptr->town_num == wf_info[wilderness(x, y).feat].entrance)
+ {
+ p_ptr->wilderness_y = y;
+ p_ptr->wilderness_x = x;
- leaving_quest = p_ptr->inside_quest;
- p_ptr->inside_quest = 0;
+ leaving_quest = p_ptr->inside_quest;
+ p_ptr->inside_quest = 0;
- /* Leaving */
- p_ptr->leaving = TRUE;
+ /* Leaving */
+ p_ptr->leaving = TRUE;
+
+ // Done
+ return;
+ }
+ }
+ }
}
/*
* Hack -- Rerate Hitpoints
*/
-void do_cmd_rerate(void)
+void do_cmd_rerate()
{
- int min_value, max_value, i, percent;
+ auto &player_hp = game->player_hp;
- min_value = (PY_MAX_LEVEL * 3 * (p_ptr->hitdie - 1)) / 8;
- min_value += PY_MAX_LEVEL;
+ // Force HP re-roll
+ roll_player_hp();
- max_value = (PY_MAX_LEVEL * 5 * (p_ptr->hitdie - 1)) / 8;
- max_value += PY_MAX_LEVEL;
-
- player_hp[0] = p_ptr->hitdie;
-
- /* Rerate */
- while (1)
- {
- /* Collect values */
- for (i = 1; i < PY_MAX_LEVEL; i++)
- {
- player_hp[i] = randint(p_ptr->hitdie);
- player_hp[i] += player_hp[i - 1];
- }
-
- /* Legal values */
- if ((player_hp[PY_MAX_LEVEL - 1] >= min_value) &&
- (player_hp[PY_MAX_LEVEL - 1] <= max_value)) break;
- }
-
- percent = (int)(((long)player_hp[PY_MAX_LEVEL - 1] * 200L) /
+ // Calculate life rating
+ int percent = static_cast<int>(
+ (static_cast<long>(player_hp[PY_MAX_LEVEL - 1]) * 200L) /
(p_ptr->hitdie + ((PY_MAX_LEVEL - 1) * p_ptr->hitdie)));
/* Update and redraw hitpoints */
@@ -157,20 +149,24 @@ void do_cmd_rerate(void)
*/
static void wiz_create_named_art()
{
+ auto const &a_info = game->edit_data.a_info;
+
object_type forge;
object_type *q_ptr;
int i, a_idx;
- cptr p = "Number of the artifact :";
+ cptr p = "Number of the artifact: ";
char out_val[80] = "";
- artifact_type *a_ptr;
if (!get_string(p, out_val, 4)) return;
a_idx = atoi(out_val);
/* Return if out-of-bounds */
- if ((a_idx <= 0) || (a_idx >= max_a_idx)) return;
+ if ((a_idx <= 0) || (a_idx >= static_cast<int>(a_info.size())))
+ {
+ return;
+ }
- a_ptr = &a_info[a_idx];
+ auto a_ptr = &a_info[a_idx];
/* Get local object */
q_ptr = &forge;
@@ -195,6 +191,9 @@ static void wiz_create_named_art()
apply_magic(q_ptr, -1, TRUE, TRUE, TRUE);
+ /* Apply any random resistances/powers */
+ random_artifact_resistance(q_ptr);
+
/* Identify it fully */
object_aware(q_ptr);
object_known(q_ptr);
@@ -221,40 +220,14 @@ static void do_cmd_summon_horde()
if (cave_naked_bold(wy, wx)) break;
}
- (void)alloc_horde(wy, wx);
-}
-
-
-/*
- * Output a long int in binary format.
- */
-static void prt_binary(u32b flags, int row, int col)
-{
- int i;
- u32b bitmask;
-
- /* Scan the flags */
- for (i = bitmask = 1; i <= 32; i++, bitmask *= 2)
- {
- /* Dump set bits */
- if (flags & bitmask)
- {
- Term_putch(col++, row, TERM_BLUE, '*');
- }
-
- /* Dump unset bits */
- else
- {
- Term_putch(col++, row, TERM_WHITE, '-');
- }
- }
+ alloc_horde(wy, wx);
}
/*
* Hack -- Teleport to the target
*/
-static void do_cmd_wiz_bamf(void)
+static void do_cmd_wiz_bamf()
{
/* Must have a target */
if (!target_who) return;
@@ -267,7 +240,7 @@ static void do_cmd_wiz_bamf(void)
/*
* Aux function for "do_cmd_wiz_change()". -RAK-
*/
-static void do_cmd_wiz_change_aux(void)
+static void do_cmd_wiz_change_aux()
{
int i;
int tmp_int;
@@ -370,7 +343,7 @@ static void do_cmd_wiz_change_aux(void)
/*
* Change various "permanent" player variables.
*/
-static void do_cmd_wiz_change(void)
+static void do_cmd_wiz_change()
{
/* Interact */
do_cmd_wiz_change_aux();
@@ -443,12 +416,13 @@ static void do_cmd_wiz_change(void)
*/
static void wiz_display_item(object_type *o_ptr)
{
+ auto const &k_info = game->edit_data.k_info;
+
int i, j = 13;
- u32b f1, f2, f3, f4, f5, esp;
char buf[256];
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Clear the screen */
for (i = 1; i <= 23; i++) prt("", i, j - 2);
@@ -475,32 +449,27 @@ static void wiz_display_item(object_type *o_ptr)
prt(format("ident = %04x timeout = %-d",
o_ptr->ident, o_ptr->timeout), 8, j);
- prt("+------------FLAGS1------------+", 10, j);
- prt("AFFECT........SLAY........BRAND.", 11, j);
- prt(" cvae xsqpaefc", 12, j);
- prt("siwdcc ssidsahanvudotgddhuoclio", 13, j);
- prt("tnieoh trnipttmiinmrrnrrraiierl", 14, j);
- prt("rtsxna..lcfgdkcpmldncltggpksdced", 15, j);
- prt_binary(f1, 16, j);
-
- prt("+------------FLAGS2------------+", 17, j);
- prt("SUST....IMMUN.RESIST............", 18, j);
- prt(" aefcprpsaefcpfldbc sn ", 19, j);
- prt("siwdcc cliooeatcliooeialoshtncd", 20, j);
- prt("tnieoh ierlifraierliatrnnnrhehi", 21, j);
- prt("rtsxna..dcedslatdcedsrekdfddrxss", 22, j);
- prt_binary(f2, 23, j);
-
- prt("+------------FLAGS3------------+", 10, j + 32);
- prt("fe ehsi st iiiiadta hp", 11, j + 32);
- prt("il n taihnf ee ggggcregb vr", 12, j + 32);
- prt("re nowysdose eld nnnntalrl ym", 13, j + 32);
- prt("ec omrcyewta ieirmsrrrriieaeccc", 14, j + 32);
- prt("aa taauktmatlnpgeihaefcvnpvsuuu", 15, j + 32);
- prt("uu egirnyoahivaeggoclioaeoasrrr", 16, j + 32);
- prt("rr litsopdretitsehtierltxrtesss", 17, j + 32);
- prt("aa echewestreshtntsdcedeptedeee", 18, j + 32);
- prt_binary(f3, 19, j + 32);
+ /* Print all the flags which are set */
+ prt("Flags:", 10, j);
+
+ int const row0 = 11;
+ int row = row0;
+ int col = 0;
+ for (auto const &object_flag_meta: object_flags_meta())
+ {
+ // Is the flag set?
+ if (object_flag_meta->flag_set & flags)
+ {
+ // Advance to next row/column
+ row += 1;
+ if (row >= 23) {
+ row = row0 + 1;
+ col += 1;
+ }
+ // Display
+ prt(object_flag_meta->name, row, j + 1 + 20 * col);
+ }
+ }
}
@@ -508,12 +477,8 @@ static void wiz_display_item(object_type *o_ptr)
/*
* Strip an "object name" into a buffer
*/
-static void strip_name(char *buf, int k_idx)
+static void strip_name(char *buf, const object_kind *k_ptr)
{
- char *t;
-
- object_kind *k_ptr = &k_info[k_idx];
-
cptr str = k_ptr->name;
@@ -521,6 +486,7 @@ static void strip_name(char *buf, int k_idx)
while ((*str == ' ') || (*str == '&')) str++;
/* Copy useful chars */
+ char *t;
for (t = buf; *str; str++)
{
if (*str != '~') *t++ = *str;
@@ -568,16 +534,16 @@ static void wci_string(cptr string, int num)
*
* List up to 50 choices in three columns
*/
-static int wiz_create_itemtype(void)
+static int wiz_create_itemtype()
{
- int i, num, max_num;
+ auto const &k_info = game->edit_data.k_info;
+
+ int num, max_num;
int tval;
cptr tval_desc2;
char ch;
- int choice[60];
-
char buf[160];
@@ -616,29 +582,32 @@ static int wiz_create_itemtype(void)
Term_clear();
/* We have to search the whole itemlist. */
- for (num = 0, i = 1; (num < 60) && (i < max_k_idx); i++)
+ std::vector<std::size_t> choice;
+ choice.reserve(60);
+ std::size_t i;
+ for (i = 1; (choice.size() < 60) && (i < k_info.size()); i++)
{
- object_kind *k_ptr = &k_info[i];
+ auto k_ptr = &k_info[i];
/* Analyze matching items */
if (k_ptr->tval == tval)
{
/* Hack -- Skip instant artifacts */
- if (k_ptr->flags3 & (TR3_INSTA_ART)) continue;
+ if (k_ptr->flags & TR_INSTA_ART) continue;
- /* Acquire the "name" of object "i" */
- strip_name(buf, i);
+ /* Acquire the "name" of object */
+ strip_name(buf, k_ptr);
/* Print it */
- wci_string(buf, num);
+ wci_string(buf, choice.size());
/* Remember the object index */
- choice[num++] = i;
+ choice.push_back(i);
}
}
/* Me need to know the maximal possible remembered object_index */
- max_num = num;
+ max_num = choice.size();
/* Choose! */
if (!get_com(format("What Kind of %s? ", tval_desc2), &ch)) return (0);
@@ -664,10 +633,9 @@ static void wiz_tweak_item(object_type *o_ptr)
{
cptr p;
char tmp_val[80];
- u32b f1, f2, f3, f4, f5, esp;
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
p = "Enter new 'pval' setting: ";
@@ -729,7 +697,7 @@ static void wiz_tweak_item(object_type *o_ptr)
if (!get_string(p, tmp_val, 9)) return;
wiz_display_item(o_ptr);
o_ptr->exp = atoi(tmp_val);
- if (f4 & TR4_LEVELS) check_experience_obj(o_ptr);
+ if (flags & TR_LEVELS) check_experience_obj(o_ptr);
p = "Enter new 'timeout' setting: ";
sprintf(tmp_val, "%d", o_ptr->timeout);
@@ -753,7 +721,7 @@ static void wiz_reroll_item(object_type *o_ptr)
/* Hack -- leave artifacts alone */
- if (artifact_p(o_ptr) || o_ptr->art_name) return;
+ if (artifact_p(o_ptr)) return;
/* Get local object */
@@ -856,6 +824,9 @@ static void wiz_reroll_item(object_type *o_ptr)
*/
static void wiz_statistics(object_type *o_ptr)
{
+ auto &a_info = game->edit_data.a_info;
+ auto &random_artifacts = game->random_artifacts;
+
long i, matches, better, worse, other;
char ch;
@@ -866,16 +837,8 @@ static void wiz_statistics(object_type *o_ptr)
object_type forge;
object_type *q_ptr;
- obj_theme theme;
-
cptr q = "Rolls: %ld, Matches: %ld, Better: %ld, Worse: %ld, Other: %ld";
- /* We can have everything */
- theme.treasure = OBJ_GENE_TREASURE;
- theme.combat = OBJ_GENE_COMBAT;
- theme.magic = OBJ_GENE_MAGIC;
- theme.tools = OBJ_GENE_TOOL;
-
/* XXX XXX XXX Mega-Hack -- allow multiple artifacts */
if (artifact_p(o_ptr))
{
@@ -963,7 +926,7 @@ static void wiz_statistics(object_type *o_ptr)
object_wipe(q_ptr);
/* Create an object */
- make_object(q_ptr, good, great, theme);
+ make_object(q_ptr, good, great, obj_theme::defaults());
/* XXX XXX XXX Mega-Hack -- allow multiple artifacts */
@@ -1074,7 +1037,7 @@ static void wiz_quantity_item(object_type *o_ptr)
* - Change properties (via wiz_tweak_item)
* - Change the number of items (via wiz_quantity_item)
*/
-static void do_cmd_wiz_play(void)
+static void do_cmd_wiz_play()
{
/* Get an item */
int item;
@@ -1205,7 +1168,7 @@ static void do_cmd_wiz_play(void)
* Hack -- this routine always makes a "dungeon object", and applies
* magic to it, and attempts to decline cursed items.
*/
-static void wiz_create_item(void)
+static void wiz_create_item()
{
object_type forge;
object_type *q_ptr;
@@ -1251,25 +1214,28 @@ static void wiz_create_item(void)
/*
* As above, but takes the k_idx as a parameter instead of using menus.
*/
-static void wiz_create_item_2(void)
+static void wiz_create_item_2()
{
- object_type forge;
- object_type *q_ptr;
- int a_idx;
+ auto const &k_info = game->edit_data.k_info;
+
cptr p = "Number of the object :";
char out_val[80] = "";
if (!get_string(p, out_val, 4)) return;
- a_idx = atoi(out_val);
+ int k_idx = atoi(out_val);
/* Return if failed or out-of-bounds */
- if ((a_idx <= 0) || (a_idx >= max_k_idx)) return;
+ if ((k_idx <= 0) || (k_idx >= static_cast<int>(k_info.size())))
+ {
+ return;
+ }
/* Get local object */
- q_ptr = &forge;
+ object_type forge;
+ auto q_ptr = &forge;
/* Create the item */
- object_prep(q_ptr, a_idx);
+ object_prep(q_ptr, k_idx);
/* Apply magic (no messages, no artifacts) */
apply_magic(q_ptr, dun_level, FALSE, FALSE, FALSE);
@@ -1285,23 +1251,23 @@ static void wiz_create_item_2(void)
/*
* Cure everything instantly
*/
-void do_cmd_wiz_cure_all(void)
+void do_cmd_wiz_cure_all()
{
object_type *o_ptr;
/* Remove curses */
- (void)remove_all_curse();
+ remove_all_curse();
/* Restore stats */
- (void)res_stat(A_STR, TRUE);
- (void)res_stat(A_INT, TRUE);
- (void)res_stat(A_WIS, TRUE);
- (void)res_stat(A_CON, TRUE);
- (void)res_stat(A_DEX, TRUE);
- (void)res_stat(A_CHR, TRUE);
+ res_stat(A_STR, TRUE);
+ res_stat(A_INT, TRUE);
+ res_stat(A_WIS, TRUE);
+ res_stat(A_CON, TRUE);
+ res_stat(A_DEX, TRUE);
+ res_stat(A_CHR, TRUE);
/* Restore the level */
- (void)restore_level();
+ restore_level();
/* Heal the player */
p_ptr->chp = p_ptr->mhp;
@@ -1324,19 +1290,19 @@ void do_cmd_wiz_cure_all(void)
p_ptr->csp_frac = 0;
/* Cure stuff */
- (void)set_blind(0);
- (void)set_confused(0);
- (void)set_poisoned(0);
- (void)set_afraid(0);
- (void)set_paralyzed(0);
- (void)set_image(0);
- (void)set_stun(0);
- (void)set_cut(0);
- (void)set_slow(0);
+ set_blind(0);
+ set_confused(0);
+ set_poisoned(0);
+ set_afraid(0);
+ set_paralyzed(0);
+ set_image(0);
+ set_stun(0);
+ set_cut(0);
+ set_slow(0);
p_ptr->black_breath = FALSE;
/* No longer hungry */
- (void)set_food(PY_FOOD_MAX - 1);
+ set_food(PY_FOOD_MAX - 1);
/* Redraw everything */
do_cmd_redraw();
@@ -1346,8 +1312,10 @@ void do_cmd_wiz_cure_all(void)
/*
* Go to any level
*/
-static void do_cmd_wiz_jump(void)
+static void do_cmd_wiz_jump()
{
+ auto const &d_info = game->edit_data.d_info;
+
/* Ask for level */
if (command_arg <= 0)
{
@@ -1395,23 +1363,21 @@ static void do_cmd_wiz_jump(void)
/*
* Become aware of a lot of objects
*/
-static void do_cmd_wiz_learn(void)
+static void do_cmd_wiz_learn()
{
- int i;
-
- object_type forge;
- object_type *q_ptr;
+ auto const &k_info = game->edit_data.k_info;
/* Scan every object */
- for (i = 1; i < max_k_idx; i++)
+ for (std::size_t i = 0; i < k_info.size(); i++)
{
- object_kind *k_ptr = &k_info[i];
+ auto k_ptr = &k_info[i];
/* Induce awareness */
if (k_ptr->level <= command_arg)
{
/* Get local object */
- q_ptr = &forge;
+ object_type forge;
+ auto q_ptr = &forge;
/* Prepare object */
object_prep(q_ptr, i);
@@ -1432,7 +1398,7 @@ static void do_cmd_wiz_summon(int num)
for (i = 0; i < num; i++)
{
- (void)summon_specific(p_ptr->py, p_ptr->px, dun_level, 0);
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, 0);
}
}
@@ -1442,15 +1408,17 @@ static void do_cmd_wiz_summon(int num)
*
* XXX XXX XXX This function is rather dangerous
*/
-static void do_cmd_wiz_named(int r_idx, bool_ slp)
+static void do_cmd_wiz_named(std::size_t r_idx, bool_ slp)
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, x, y;
/* Paranoia */
/* if (!r_idx) return; */
/* Prevent illegal monsters */
- if (r_idx >= max_r_idx) return;
+ if (r_idx >= r_info.size()) return;
/* Try 10 times */
for (i = 0; i < 10; i++)
@@ -1482,15 +1450,17 @@ static void do_cmd_wiz_named(int r_idx, bool_ slp)
*
* XXX XXX XXX This function is rather dangerous
*/
-void do_cmd_wiz_named_friendly(int r_idx, bool_ slp)
+void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp)
{
+ auto const &r_info = game->edit_data.r_info;
+
int i, x, y;
/* Paranoia */
/* if (!r_idx) return; */
/* Prevent illegal monsters */
- if (r_idx >= max_r_idx) return;
+ if (r_idx >= r_info.size()) return;
/* Try 10 times */
for (i = 0; i < 10; i++)
@@ -1521,7 +1491,7 @@ void do_cmd_wiz_named_friendly(int r_idx, bool_ slp)
/*
* Hack -- Delete all nearby monsters
*/
-static void do_cmd_wiz_zap(void)
+static void do_cmd_wiz_zap()
{
int i;
@@ -1543,6 +1513,8 @@ static void do_cmd_wiz_body(s16b bidx)
/* Might create problems with equipment slots. For safety,
be nude when calling this function */
{
+ auto const &r_info = game->edit_data.r_info;
+
p_ptr->body_monster = bidx;
p_ptr->disembodied = FALSE;
p_ptr->chp = maxroll( (&r_info[bidx])->hdice, (&r_info[bidx])->hside);
@@ -1556,6 +1528,8 @@ static void do_cmd_wiz_body(s16b bidx)
*/
void do_cmd_debug()
{
+ auto const &d_info = game->edit_data.d_info;
+
int x, y;
char cmd;
@@ -1574,15 +1548,6 @@ void do_cmd_debug()
break;
- /* Hack -- Generate Spoilers */
- case '"':
- do_cmd_spoilers();
- break;
-
- case 'A':
- status_main();
- break;
-
/* Hack -- Help */
case '?':
do_cmd_help();
@@ -1625,11 +1590,11 @@ void do_cmd_debug()
/* Change of Dungeon type */
case 'D':
- if ((command_arg >= 0) && (command_arg < max_d_idx))
+ if ((command_arg >= 0) && (std::size_t(command_arg) < d_info.size()))
{
dungeon_type = command_arg;
dun_level = d_info[dungeon_type].mindepth;
- msg_format("You go into %s", d_info[dungeon_type].text);
+ msg_format("You go into %s", d_info[dungeon_type].text.c_str());
/* Leaving */
p_ptr->leaving = TRUE;
@@ -1666,7 +1631,7 @@ void do_cmd_debug()
/* Identify */
case 'i':
- (void)ident_spell();
+ ident_spell();
break;
/* Go up or down in the dungeon */
@@ -1674,11 +1639,6 @@ void do_cmd_debug()
do_cmd_wiz_jump();
break;
- /* Self-Knowledge */
- case 'k':
- self_knowledge(NULL);
- break;
-
/* Learn about objects */
case 'l':
do_cmd_wiz_learn();
@@ -1694,11 +1654,6 @@ void do_cmd_debug()
gain_random_corruption();
break;
- /* Create a trap */
- case 'R':
- wiz_place_trap(p_ptr->py, p_ptr->px, command_arg);
- break;
-
/* Summon _friendly_ named monster */
case 'N':
do_cmd_wiz_named_friendly(command_arg, TRUE);
@@ -1727,7 +1682,7 @@ void do_cmd_debug()
{
quest[command_arg].status = QUEST_STATUS_TAKEN;
*(quest[command_arg].plot) = command_arg;
- quest[command_arg].init(command_arg);
+ quest[command_arg].init();
break;
}
break;
@@ -1842,7 +1797,6 @@ void do_cmd_debug()
/* Change the feature of the map */
case 'F':
- msg_format("Trap: %d", cave[p_ptr->py][p_ptr->px].t_idx);
msg_format("Old feature: %d", cave[p_ptr->py][p_ptr->px].feat);
msg_format("Special: %d", cave[p_ptr->py][p_ptr->px].special);
cave_set_feat(p_ptr->py, p_ptr->px, command_arg);
diff --git a/src/wizard2.hpp b/src/wizard2.hpp
index cec515c8..9bad7f92 100644
--- a/src/wizard2.hpp
+++ b/src/wizard2.hpp
@@ -2,7 +2,9 @@
#include "h-basic.h"
-extern void do_cmd_rerate(void);
-extern void do_cmd_wiz_cure_all(void);
-extern void do_cmd_wiz_named_friendly(int r_idx, bool_ slp);
-extern void do_cmd_debug();
+#include <cstddef>
+
+void do_cmd_rerate();
+void do_cmd_wiz_cure_all();
+void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp);
+void do_cmd_debug();
diff --git a/src/xtra1.cc b/src/xtra1.cc
index fd4a11fd..ae797aa8 100644
--- a/src/xtra1.cc
+++ b/src/xtra1.cc
@@ -13,8 +13,10 @@
#include "cave_type.hpp"
#include "corrupt.hpp"
#include "cmd7.hpp"
+#include "dungeon_flag.hpp"
#include "dungeon_info_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "hook_calculate_hp_in.hpp"
#include "hook_calculate_hp_out.hpp"
@@ -25,15 +27,20 @@
#include "monster1.hpp"
#include "monster2.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
+#include "object_flag_meta.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_class.hpp"
#include "player_race.hpp"
+#include "player_race_flag.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
+#include "skill_flag.hpp"
#include "skill_type.hpp"
#include "skills.hpp"
#include "spells3.hpp"
@@ -50,13 +57,14 @@
#include "z-rand.hpp"
#include <cassert>
+#include <fmt/format.h>
/*
* Converts stat num into a six-char (right justified) string
*/
void cnv_stat(int val, char *out_val)
{
- if (!linear_stats)
+ if (!options->linear_stats)
{
/* Above 18 */
if (val > 18)
@@ -181,7 +189,7 @@ static void prt_field(cptr info, int row, int col)
/*
* Prints players max/cur piety
*/
-static void prt_piety(void)
+static void prt_piety()
{
char tmp[32];
@@ -200,7 +208,7 @@ static void prt_piety(void)
/*
* Prints the player's current sanity.
*/
-static void prt_sane(void)
+static void prt_sane()
{
char tmp[32];
byte color;
@@ -223,7 +231,7 @@ static void prt_sane(void)
{
color = TERM_L_GREEN;
}
- else if (perc > (10 * hitpoint_warn))
+ else if (perc > (10 * options->hitpoint_warn))
{
color = TERM_YELLOW;
}
@@ -286,7 +294,7 @@ static void prt_stat(int stat)
/*
* Prints "title", including "wizard" or "winner" as needed.
*/
-static void prt_title(void)
+static void prt_title()
{
cptr p = "";
@@ -328,7 +336,7 @@ static void prt_title(void)
/*
* Prints level
*/
-static void prt_level(void)
+static void prt_level()
{
char tmp[32];
@@ -350,17 +358,17 @@ static void prt_level(void)
/*
* Display the experience
*/
-static void prt_exp(void)
+static void prt_exp()
{
char out_val[32];
- if ((p_ptr->lev >= PY_MAX_LEVEL) || (p_ptr->lev >= max_plev))
+ if (p_ptr->lev >= PY_MAX_LEVEL)
{
- (void)sprintf(out_val, "********");
+ sprintf(out_val, "********");
}
else
{
- (void)sprintf(out_val, "%8ld", (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp);
+ sprintf(out_val, "%8ld", (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp);
}
if (p_ptr->exp >= p_ptr->max_exp)
@@ -379,7 +387,7 @@ static void prt_exp(void)
/*
* Prints current gold
*/
-static void prt_gold(void)
+static void prt_gold()
{
char tmp[32];
@@ -393,7 +401,7 @@ static void prt_gold(void)
/*
* Prints current AC
*/
-static void prt_ac(void)
+static void prt_ac()
{
char tmp[32];
@@ -406,13 +414,16 @@ static void prt_ac(void)
/*
* Prints Cur/Max hit points
*/
-static void prt_hp(void)
+static void prt_hp()
{
char tmp[32];
byte color;
- if (player_char_health) lite_spot(p_ptr->py, p_ptr->px);
+ if (options->player_char_health)
+ {
+ lite_spot(p_ptr->py, p_ptr->px);
+ }
if (p_ptr->necro_extra & CLASS_UNDEAD)
{
@@ -424,7 +435,7 @@ static void prt_hp(void)
{
color = TERM_L_BLUE;
}
- else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
+ else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10)
{
color = TERM_VIOLET;
}
@@ -444,7 +455,7 @@ static void prt_hp(void)
{
color = TERM_L_GREEN;
}
- else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
+ else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10)
{
color = TERM_YELLOW;
}
@@ -459,7 +470,7 @@ static void prt_hp(void)
/*
* Prints Cur/Max monster hit points
*/
-static void prt_mh(void)
+static void prt_mh()
{
char tmp[32];
@@ -483,7 +494,7 @@ static void prt_mh(void)
{
color = TERM_L_GREEN;
}
- else if (o_ptr->pval2 > (o_ptr->pval3 * hitpoint_warn) / 10)
+ else if (o_ptr->pval2 > (o_ptr->pval3 * options->hitpoint_warn) / 10)
{
color = TERM_YELLOW;
}
@@ -498,7 +509,7 @@ static void prt_mh(void)
/*
* Prints players max/cur spell points
*/
-static void prt_sp(void)
+static void prt_sp()
{
char tmp[32];
byte color;
@@ -511,7 +522,7 @@ static void prt_sp(void)
{
color = TERM_L_GREEN;
}
- else if (p_ptr->csp > (p_ptr->msp * hitpoint_warn) / 10)
+ else if (p_ptr->csp > (p_ptr->msp * options->hitpoint_warn) / 10)
{
color = TERM_YELLOW;
}
@@ -528,8 +539,11 @@ static void prt_sp(void)
*/
static void prt_depth(int row, int col)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto const &wf_info = game->edit_data.wf_info;
+
char depths[32];
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
+ auto d_ptr = &d_info[dungeon_type];
if (p_ptr->wild_mode)
{
@@ -539,7 +553,7 @@ static void prt_depth(int row, int col)
{
/* Empty */
}
- else if (dungeon_flags2 & DF2_SPECIAL)
+ else if (dungeon_flags & DF_SPECIAL)
{
strcpy(depths, "Special");
}
@@ -549,9 +563,11 @@ static void prt_depth(int row, int col)
}
else if (!dun_level)
{
- if (wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].name)
+ auto const &wilderness = game->wilderness;
+ auto const &wf = wf_info[wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).feat];
+ if (wf.name)
{
- strcpy(depths, wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].name);
+ strcpy(depths, wf.name);
}
else
{
@@ -560,9 +576,9 @@ static void prt_depth(int row, int col)
}
else
{
- if (dungeon_flags1 & DF1_TOWER)
+ if (dungeon_flags & DF_TOWER)
{
- (void)strnfmt(depths, 32, "%c%c%c -%d",
+ strnfmt(depths, 32, "%c%c%c -%d",
d_ptr->short_name[0],
d_ptr->short_name[1],
d_ptr->short_name[2],
@@ -570,7 +586,7 @@ static void prt_depth(int row, int col)
}
else
{
- (void)strnfmt(depths, 32, "%c%c%c %d",
+ strnfmt(depths, 32, "%c%c%c %d",
d_ptr->short_name[0],
d_ptr->short_name[1],
d_ptr->short_name[2],
@@ -677,20 +693,14 @@ static void prt_state(int row, int col)
{
if (command_rep > 999)
{
- (void)sprintf(text, "Rep. %3d00", command_rep / 100);
+ sprintf(text, "Rep. %3d00", command_rep / 100);
}
else
{
- (void)sprintf(text, "Repeat %3d", command_rep);
+ sprintf(text, "Repeat %3d", command_rep);
}
}
- /* Searching */
- else if (p_ptr->searching)
- {
- strcpy(text, "Searching ");
- }
-
/* Nothing interesting */
else
{
@@ -712,9 +722,6 @@ static void prt_speed(int row, int col)
byte attr = TERM_WHITE;
char buf[32] = "";
- /* Hack -- Visually "undo" the Search Mode Slowdown */
- if (p_ptr->searching) i += 10;
-
/* Fast */
if (i > 110)
{
@@ -738,7 +745,7 @@ static void prt_speed(int row, int col)
/*
* Prints status line
*/
-static void prt_status_line(void)
+static void prt_status_line()
{
int wid, hgt;
Term_get_size(&wid, &hgt);
@@ -815,17 +822,6 @@ static void prt_status_line(void)
put_str(" ", row, col);
}
- /* Dtrap */
- col = 32;
- if (cave[p_ptr->py][p_ptr->px].info & CAVE_DETECT)
- {
- c_put_str(TERM_L_GREEN, "DTrap", row, col);
- }
- else
- {
- put_str(" ", row, col);
- }
-
/* State */
col = 38;
prt_state(row, col);
@@ -852,7 +848,7 @@ static void prt_status_line(void)
-static void prt_cut(void)
+static void prt_cut()
{
int c = p_ptr->cut;
int hgt;
@@ -896,7 +892,7 @@ static void prt_cut(void)
-static void prt_stun(void)
+static void prt_stun()
{
int s = p_ptr->stun;
int hgt;
@@ -938,7 +934,7 @@ static void prt_stun(void)
* Auto-track current target monster when bored. Note that the
* health-bar stops tracking any monster that "disappears".
*/
-static void health_redraw(void)
+static void health_redraw()
{
int hgt;
Term_get_size(nullptr, &hgt);
@@ -1032,12 +1028,12 @@ static void health_redraw(void)
/*
* Display basic info (mostly left of map)
*/
-static void prt_frame(void)
+static void prt_frame()
{
int i;
/* Race and Class */
- prt_field(rp_ptr->title, ROW_RACE, COL_RACE);
+ prt_field(rp_ptr->title.c_str(), ROW_RACE, COL_RACE);
prt_field(spp_ptr->title, ROW_CLASS, COL_CLASS);
/* Title */
@@ -1083,15 +1079,16 @@ static void prt_frame(void)
}
-/*
- * Hack -- display inventory in sub-windows
+/**
+ * Fix up each terminal based on whether a window flag
+ * is set.
*/
-static void fix_inven(void)
-{
- int j;
+namespace { // anonymous
- /* Scan windows */
- for (j = 0; j < 8; j++)
+template <typename F>
+static void fixup_display(u32b mask, F callback)
+{
+ for (int j = 0; j < ANGBAND_TERM_MAX; j++)
{
term *old = Term;
@@ -1099,13 +1096,13 @@ static void fix_inven(void)
if (!angband_term[j]) continue;
/* No relevant flags */
- if (!(window_flag[j] & (PW_INVEN))) continue;
+ if (!(window_flag[j] & mask)) continue;
/* Activate */
Term_activate(angband_term[j]);
- /* Display inventory */
- display_inven();
+ /* Apply fixup callback */
+ callback();
/* Fresh */
Term_fresh();
@@ -1115,70 +1112,33 @@ static void fix_inven(void)
}
}
+} // namespace anonymous
/*
- * Hack -- display equipment in sub-windows
+ * Hack -- display inventory in sub-windows
*/
-static void fix_equip(void)
+static void fix_inven()
{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_EQUIP))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Display equipment */
- display_equip();
-
- /* Fresh */
- Term_fresh();
+ fixup_display(PW_INVEN, display_inven);
+}
- /* Restore */
- Term_activate(old);
- }
+/*
+ * Hack -- display equipment in sub-windows
+ */
+static void fix_equip()
+{
+ fixup_display(PW_EQUIP, display_equip);
}
/*
* Hack -- display character in sub-windows
*/
-static void fix_player(void)
+static void fix_player()
{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_PLAYER))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Display player */
+ fixup_display(PW_PLAYER, [] {
display_player(0);
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
+ });
}
@@ -1188,48 +1148,32 @@ static void fix_player(void)
*
* XXX XXX XXX Adjust for width and split messages
*/
-void fix_message(void)
+void fix_message()
{
- int j, i;
- int w, h;
- int x, y;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_MESSAGE))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
+ auto const &messages = game->messages;
+ fixup_display(PW_MESSAGE, [&messages] {
/* Get size */
+ int w, h;
Term_get_size(&w, &h);
/* Dump messages */
- for (i = 0; i < h; i++)
+ for (int i = 0; i < h; i++)
{
+ auto message = messages.at(i);
+ auto text_with_count = message.text_with_count();
+
/* Dump the message on the appropriate line */
- display_message(0, (h - 1) - i, strlen(message_str((s16b)i)), message_color((s16b)i), message_str((s16b)i));
+ display_message(0, (h - 1) - i, text_with_count.size(), message.color, text_with_count.c_str());
/* Cursor */
+ int x, y;
Term_locate(&x, &y);
/* Clear to end of line */
Term_erase(x, y, 255);
}
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
+ });
}
@@ -1238,132 +1182,60 @@ void fix_message(void)
*
* Note that the "player" symbol does NOT appear on the map.
*/
-static void fix_overhead(void)
+static void fix_overhead()
{
- int j;
-
- int cy, cx;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_OVERHEAD))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Redraw map */
+ fixup_display(PW_OVERHEAD, [] {
+ int cy, cx;
display_map(&cy, &cx);
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
+ });
}
/*
* Hack -- display monster recall in sub-windows
*/
-static void fix_monster(void)
+static void fix_monster()
{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_MONSTER))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
+ fixup_display(PW_MONSTER, [] {
/* Display monster race info */
if (monster_race_idx)
{
display_roff(monster_race_idx, monster_ego_idx);
}
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
+ });
}
/*
* Hack -- display object recall in sub-windows
*/
-static void fix_object(void)
+static void fix_object()
{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_OBJECT))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
+ fixup_display(PW_OBJECT, [] {
/* Clear */
Term_clear();
/* Display object info */
- if (tracked_object)
- if (!object_out_desc(tracked_object, NULL, FALSE, FALSE)) text_out("You see nothing special.");
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
+ if (tracked_object &&
+ !object_out_desc(tracked_object, NULL, FALSE, FALSE))
+ {
+ text_out("You see nothing special.");
+ }
+ });
}
/* Show the monster list in a window */
-static void fix_m_list(void)
+static void fix_m_list()
{
- int i, j;
+ auto const &r_info = game->edit_data.r_info;
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- int c = 0;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_M_LIST))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
+ // Mirror of the r_info array, index by index. We use a
+ // statically allocated value to avoid frequent allocations.
+ static auto r_total_visible =
+ std::vector<u16b>(r_info.size(), 0);
+ fixup_display(PW_M_LIST, [&r_info] {
/* Clear */
Term_clear();
@@ -1371,35 +1243,28 @@ static void fix_m_list(void)
if (p_ptr->image)
{
c_prt(TERM_WHITE, "You can not see clearly", 0, 0);
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
-
return;
}
/* reset visible count */
- for (i = 1; i < max_r_idx; i++)
+ for (std::size_t i = 1; i < r_info.size(); i++)
{
- monster_race *r_ptr = &r_info[i];
-
- r_ptr->total_visible = 0;
+ r_total_visible[i] = 0;
}
/* Count up the number visible in each race */
- for (i = 1; i < m_max; i++)
+ int c = 0;
+ for (std::size_t i = 1; i < static_cast<u16b>(m_max); i++)
{
- monster_type *m_ptr = &m_list[i];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ auto const m_ptr = &m_list[i];
+ auto const r_ptr = &r_info[m_ptr->r_idx];
+ auto total_visible = &r_total_visible[m_ptr->r_idx];
/* Skip dead monsters */
if (m_ptr->hp < 0) continue;
/* Skip unseen monsters */
- if (r_ptr->flags9 & RF9_MIMIC)
+ if (r_ptr->flags & RF_MIMIC)
{
/* Acquire object */
object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()];
@@ -1413,7 +1278,7 @@ static void fix_m_list(void)
}
/* Increase for this race */
- r_ptr->total_visible++;
+ (*total_visible)++;
/* Increase total Count */
c++;
@@ -1424,34 +1289,38 @@ static void fix_m_list(void)
{
int w, h, num = 0;
- (void)Term_get_size(&w, &h);
+ Term_get_size(&w, &h);
c_prt(TERM_WHITE, format("You can see %d monster%s", c, (c > 1 ? "s:" : ":")), 0, 0);
- for (i = 1; i < max_r_idx; i++)
+ for (std::size_t i = 1; i < r_info.size(); i++)
{
- monster_race *r_ptr = &r_info[i];
+ auto const r_ptr = &r_info[i];
+ auto const total_visible = r_total_visible[i];
/* Default Colour */
byte attr = TERM_SLATE;
/* Only visible monsters */
- if (!r_ptr->total_visible) continue;
+ if (!total_visible)
+ {
+ continue;
+ }
/* Uniques */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
attr = TERM_L_BLUE;
}
- /* Have we ever killed one? */
- if (r_ptr->r_tkills)
+ /* Have we killed one? */
+ if (r_ptr->r_pkills)
{
if (r_ptr->level > dun_level)
{
attr = TERM_VIOLET;
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
attr = TERM_RED;
}
@@ -1459,18 +1328,17 @@ static void fix_m_list(void)
}
else
{
- if (!(r_ptr->flags1 & RF1_UNIQUE)) attr = TERM_GREEN;
+ if (!(r_ptr->flags & RF_UNIQUE)) attr = TERM_GREEN;
}
-
/* Dump the monster name */
- if (r_ptr->total_visible == 1)
+ if (total_visible == 1)
{
c_prt(attr, r_ptr->name, (num % (h - 1)) + 1, (num / (h - 1) * 26));
}
else
{
- c_prt(attr, format("%s (x%d)", r_ptr->name, r_ptr->total_visible), (num % (h - 1)) + 1, (num / (h - 1)) * 26);
+ c_prt(attr, format("%s (x%d)", r_ptr->name, total_visible), (num % (h - 1)) + 1, (num / (h - 1)) * 26);
}
num++;
@@ -1482,13 +1350,7 @@ static void fix_m_list(void)
{
c_prt(TERM_WHITE, "You see no monsters.", 0, 0);
}
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
+ });
}
@@ -1518,8 +1380,17 @@ static void calc_powers_corruption()
/* Ugly hack */
bool_ calc_powers_silent = FALSE;
+/* Add in powers */
+static void add_powers(std::vector<s16b> const &powers)
+{
+ for (auto const &p: powers)
+ {
+ p_ptr->powers[p] = TRUE;
+ }
+}
+
/* Calc the player powers */
-static void calc_powers(void)
+static void calc_powers()
{
int i, p = 0;
bool_ old_powers[POWER_MAX];
@@ -1548,32 +1419,23 @@ static void calc_powers(void)
if (!o_ptr->k_idx) continue;
p = object_power(o_ptr);
- if (p != -1) p_ptr->powers[p] = TRUE;
+ if (p != -1)
+ {
+ p_ptr->powers[p] = TRUE;
+ }
}
if ((!p_ptr->tim_mimic) && (!p_ptr->body_monster))
{
- /* Add in racial and subracial powers */
- for (i = 0; i < 4; i++)
- {
- p = rp_ptr->powers[i];
- if (p != -1) p_ptr->powers[p] = TRUE;
-
- p = rmp_ptr->powers[i];
- if (p != -1) p_ptr->powers[p] = TRUE;
- }
+ add_powers(rp_ptr->ps.powers);
+ add_powers(rmp_ptr->ps.powers);
}
else if (p_ptr->mimic_form)
{
calc_mimic_power();
}
- /* Add in class powers */
- for (i = 0; i < 4; i++)
- {
- p = cp_ptr->powers[i];
- if (p != -1) p_ptr->powers[p] = TRUE;
- }
+ add_powers(cp_ptr->ps.powers);
if (p_ptr->disembodied)
{
@@ -1641,12 +1503,11 @@ static void calc_sanity()
*
* This function induces status messages.
*/
-static void calc_mana(void)
+static void calc_mana()
{
- int msp, levels, cur_wgt, max_wgt;
- u32b f1, f2, f3, f4, f5, esp;
+ auto const &r_info = game->edit_data.r_info;
- object_type *o_ptr;
+ int msp, levels, cur_wgt, max_wgt;
levels = p_ptr->lev;
@@ -1666,7 +1527,8 @@ static void calc_mana(void)
/* Possessors mana is different */
if (p_ptr->body_monster && (!p_ptr->disembodied))
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
+
int f = 100 / (r_ptr->freq_spell ? r_ptr->freq_spell : 1);
msp = 21 - f;
@@ -1697,16 +1559,16 @@ static void calc_mana(void)
p_ptr->cumber_glove = FALSE;
/* Get the gloves */
- o_ptr = &p_ptr->inventory[INVEN_HANDS];
+ object_type *o_ptr = &p_ptr->inventory[INVEN_HANDS];
/* Examine the gloves */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* Normal gloves hurt mage-type spells */
if (o_ptr->k_idx &&
- !(f2 & (TR2_FREE_ACT)) &&
- !((f1 & (TR1_DEX)) && (o_ptr->pval > 0)) &&
- !(f5 & TR5_SPELL_CONTAIN))
+ !(flags & TR_FREE_ACT) &&
+ !((flags & TR_DEX) && (o_ptr->pval > 0)) &&
+ !(flags & TR_SPELL_CONTAIN))
{
/* Encumbered */
p_ptr->cumber_glove = TRUE;
@@ -1821,17 +1683,16 @@ static void calc_mana(void)
* Calculate the players (maximal) hit points
* Adjust current hitpoints if necessary
*/
-void calc_hitpoints(void)
+void calc_hitpoints()
{
- int bonus, mhp;
+ auto const &player_hp = game->player_hp;
+ auto const &r_info = game->edit_data.r_info;
/* Un-inflate "half-hitpoint bonus per level" value */
- bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128);
+ int const bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128);
/* Calculate hitpoints */
- assert(p_ptr->lev - 1 >= 0);
- assert(p_ptr->lev - 1 < PY_MAX_LEVEL);
- mhp = player_hp[p_ptr->lev - 1] + (bonus * p_ptr->lev / 2);
+ int mhp = player_hp[p_ptr->lev - 1] + (bonus * p_ptr->lev / 2);
/* Always have at least one hitpoint per level */
if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1;
@@ -1865,7 +1726,7 @@ void calc_hitpoints(void)
if (p_ptr->body_monster)
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto r_ptr = &r_info[p_ptr->body_monster];
u32b rhp = maxroll(r_ptr->hdice, r_ptr->hside);
/* Adjust the hp with the possession skill */
@@ -1946,11 +1807,10 @@ static void calc_torch_gods()
* SWD: Experimental modification: multiple light sources have additive effect.
*
*/
-static void calc_torch(void)
+static void calc_torch()
{
int i;
object_type *o_ptr;
- u32b f1, f2, f3, f4, f5, esp;
/* Assume no light */
p_ptr->cur_lite = 0;
@@ -1964,14 +1824,14 @@ static void calc_torch(void)
if (!o_ptr->k_idx) continue;
/* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto const flags = object_flags(o_ptr);
/* does this item glow? */
- if (((f4 & TR4_FUEL_LITE) && (o_ptr->timeout > 0)) || (!(f4 & TR4_FUEL_LITE)))
+ if (((flags & TR_FUEL_LITE) && (o_ptr->timeout > 0)) || (!(flags & TR_FUEL_LITE)))
{
- if (f3 & TR3_LITE1) p_ptr->cur_lite++;
- if (f4 & TR4_LITE2) p_ptr->cur_lite += 2;
- if (f4 & TR4_LITE3) p_ptr->cur_lite += 3;
+ if (flags & TR_LITE1) p_ptr->cur_lite++;
+ if (flags & TR_LITE2) p_ptr->cur_lite += 2;
+ if (flags & TR_LITE3) p_ptr->cur_lite += 3;
}
}
@@ -2005,7 +1865,7 @@ static void calc_torch(void)
/* Reduce lite when running if requested */
- if (running && view_reduce_lite)
+ if (running && options->view_reduce_lite)
{
/* Reduce the lite radius if needed */
if (p_ptr->cur_lite > 1) p_ptr->cur_lite = 1;
@@ -2030,7 +1890,7 @@ static void calc_torch(void)
/*
* Computes current weight limit.
*/
-int weight_limit(void)
+int weight_limit()
{
int i;
@@ -2043,23 +1903,22 @@ int weight_limit(void)
void calc_wield_monster()
{
- object_type *o_ptr;
- monster_race *r_ptr;
+ auto const &r_info = game->edit_data.r_info;
/* Get the carried monster */
- o_ptr = &p_ptr->inventory[INVEN_CARRY];
+ auto o_ptr = &p_ptr->inventory[INVEN_CARRY];
if (o_ptr->k_idx)
{
- r_ptr = &r_info[o_ptr->pval];
+ auto r_ptr = &r_info[o_ptr->pval];
- if (r_ptr->flags2 & RF2_INVISIBLE)
+ if (r_ptr->flags & RF_INVISIBLE)
p_ptr->invis += 20;
- if (r_ptr->flags2 & RF2_REFLECTING)
+ if (r_ptr->flags & RF_REFLECTING)
p_ptr->reflect = TRUE;
- if (r_ptr->flags7 & RF7_CAN_FLY)
+ if (r_ptr->flags & RF_CAN_FLY)
p_ptr->ffall = TRUE;
- if (r_ptr->flags7 & RF7_AQUATIC)
+ if (r_ptr->flags & RF_AQUATIC)
p_ptr->water_breath = TRUE;
}
}
@@ -2072,7 +1931,9 @@ void calc_wield_monster()
*/
void calc_body()
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[p_ptr->body_monster];
int i, b_weapon, b_legs, b_arms;
byte *body_parts, bp[BODY_MAX];
@@ -2191,10 +2052,15 @@ void calc_body()
/* Should be called by every calc_bonus call */
void calc_body_bonus()
{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
+ auto const &r_info = game->edit_data.r_info;
+
+ auto r_ptr = &r_info[p_ptr->body_monster];
/* If in the player body nothing have to be done */
- if (!p_ptr->body_monster) return;
+ if (!p_ptr->body_monster)
+ {
+ return;
+ }
if (p_ptr->disembodied)
{
@@ -2205,29 +2071,29 @@ void calc_body_bonus()
p_ptr->ac += r_ptr->ac;
p_ptr->pspeed = r_ptr->speed;
- if (r_ptr->flags1 & RF1_NEVER_MOVE) p_ptr->immovable = TRUE;
- if (r_ptr->flags2 & RF2_STUPID) p_ptr->stat_add[A_INT] -= 1;
- if (r_ptr->flags2 & RF2_SMART) p_ptr->stat_add[A_INT] += 1;
- if (r_ptr->flags2 & RF2_REFLECTING) p_ptr->reflect = TRUE;
- if (r_ptr->flags2 & RF2_INVISIBLE) p_ptr->invis += 20;
- if (r_ptr->flags2 & RF2_REGENERATE) p_ptr->regenerate = TRUE;
- if (r_ptr->flags2 & RF2_AURA_FIRE) p_ptr->sh_fire = TRUE;
- if (r_ptr->flags2 & RF2_AURA_ELEC) p_ptr->sh_elec = TRUE;
- if (r_ptr->flags2 & RF2_PASS_WALL) p_ptr->wraith_form = TRUE;
- if (r_ptr->flags3 & RF3_SUSCEP_FIRE) p_ptr->sensible_fire = TRUE;
- if (r_ptr->flags3 & RF3_IM_ACID) p_ptr->resist_acid = TRUE;
- if (r_ptr->flags3 & RF3_IM_ELEC) p_ptr->resist_elec = TRUE;
- if (r_ptr->flags3 & RF3_IM_FIRE) p_ptr->resist_fire = TRUE;
- if (r_ptr->flags3 & RF3_IM_POIS) p_ptr->resist_pois = TRUE;
- if (r_ptr->flags3 & RF3_IM_COLD) p_ptr->resist_cold = TRUE;
- if (r_ptr->flags3 & RF3_RES_NETH) p_ptr->resist_neth = TRUE;
- if (r_ptr->flags3 & RF3_RES_NEXU) p_ptr->resist_nexus = TRUE;
- if (r_ptr->flags3 & RF3_RES_DISE) p_ptr->resist_disen = TRUE;
- if (r_ptr->flags3 & RF3_NO_FEAR) p_ptr->resist_fear = TRUE;
- if (r_ptr->flags3 & RF3_NO_SLEEP) p_ptr->free_act = TRUE;
- if (r_ptr->flags3 & RF3_NO_CONF) p_ptr->resist_conf = TRUE;
- if (r_ptr->flags7 & RF7_CAN_FLY) p_ptr->ffall = TRUE;
- if (r_ptr->flags7 & RF7_AQUATIC) p_ptr->water_breath = TRUE;
+ if (r_ptr->flags & RF_NEVER_MOVE) p_ptr->immovable = TRUE;
+ if (r_ptr->flags & RF_STUPID) p_ptr->stat_add[A_INT] -= 1;
+ if (r_ptr->flags & RF_SMART) p_ptr->stat_add[A_INT] += 1;
+ if (r_ptr->flags & RF_REFLECTING) p_ptr->reflect = TRUE;
+ if (r_ptr->flags & RF_INVISIBLE) p_ptr->invis += 20;
+ if (r_ptr->flags & RF_REGENERATE) p_ptr->regenerate = TRUE;
+ if (r_ptr->flags & RF_AURA_FIRE) p_ptr->sh_fire = TRUE;
+ if (r_ptr->flags & RF_AURA_ELEC) p_ptr->sh_elec = TRUE;
+ if (r_ptr->flags & RF_PASS_WALL) p_ptr->wraith_form = TRUE;
+ if (r_ptr->flags & RF_SUSCEP_FIRE) p_ptr->sensible_fire = TRUE;
+ if (r_ptr->flags & RF_IM_ACID) p_ptr->resist_acid = TRUE;
+ if (r_ptr->flags & RF_IM_ELEC) p_ptr->resist_elec = TRUE;
+ if (r_ptr->flags & RF_IM_FIRE) p_ptr->resist_fire = TRUE;
+ if (r_ptr->flags & RF_IM_POIS) p_ptr->resist_pois = TRUE;
+ if (r_ptr->flags & RF_IM_COLD) p_ptr->resist_cold = TRUE;
+ if (r_ptr->flags & RF_RES_NETH) p_ptr->resist_neth = TRUE;
+ if (r_ptr->flags & RF_RES_NEXU) p_ptr->resist_nexus = TRUE;
+ if (r_ptr->flags & RF_RES_DISE) p_ptr->resist_disen = TRUE;
+ if (r_ptr->flags & RF_NO_FEAR) p_ptr->resist_fear = TRUE;
+ if (r_ptr->flags & RF_NO_SLEEP) p_ptr->free_act = TRUE;
+ if (r_ptr->flags & RF_NO_CONF) p_ptr->resist_conf = TRUE;
+ if (r_ptr->flags & RF_CAN_FLY) p_ptr->ffall = TRUE;
+ if (r_ptr->flags & RF_AQUATIC) p_ptr->water_breath = TRUE;
}
@@ -2235,8 +2101,8 @@ void calc_body_bonus()
static int get_extra_blows_ability() {
/* Count bonus abilities */
int num = 0;
- if (has_ability(AB_MAX_BLOW1)) num++;
- if (has_ability(AB_MAX_BLOW2)) num++;
+ if (p_ptr->has_ability(AB_MAX_BLOW1)) num++;
+ if (p_ptr->has_ability(AB_MAX_BLOW2)) num++;
return num;
}
@@ -2491,15 +2357,17 @@ static void calc_schools()
/* Apply corruptions */
static void calc_corruptions()
{
+ auto &s_info = game->s_info;
+
if (player_has_corruption(CORRUPT_BALROG_AURA))
{
- p_ptr->xtra_f3 |= TR3_SH_FIRE;
- p_ptr->xtra_f3 |= TR3_LITE1;
+ p_ptr->xtra_flags |= TR_SH_FIRE;
+ p_ptr->xtra_flags |= TR_LITE1;
}
if (player_has_corruption(CORRUPT_BALROG_WINGS))
{
- p_ptr->xtra_f4 |= TR4_FLY;
+ p_ptr->xtra_flags |= TR_FLY;
p_ptr->stat_add[A_CHR] -= 4;
p_ptr->stat_add[A_DEX] -= 2;
}
@@ -2525,7 +2393,7 @@ static void calc_corruptions()
p_ptr->pspeed = p_ptr->pspeed - (p_ptr->lev / 7);
if (p_ptr->lev >= 40)
{
- p_ptr->xtra_f2 |= TR2_IM_FIRE;
+ p_ptr->xtra_flags |= TR_IM_FIRE;
}
}
@@ -2537,12 +2405,12 @@ static void calc_corruptions()
{
s_info[SKILL_DAEMON].mod = 1500;
}
- s_info[SKILL_DAEMON].hidden = FALSE;
+ s_info[SKILL_DAEMON].hidden = false;
}
if (player_has_corruption(CORRUPT_RANDOM_TELEPORT))
{
- p_ptr->xtra_f3 |= TR3_TELEPORT;
+ p_ptr->xtra_flags |= TR_TELEPORT;
}
if (player_has_corruption(CORRUPT_ANTI_TELEPORT))
@@ -2555,136 +2423,131 @@ static void calc_corruptions()
if (player_has_corruption(CORRUPT_TROLL_BLOOD))
{
- p_ptr->xtra_f3 |= (TR3_REGEN | TR3_AGGRAVATE);
- p_ptr->xtra_esp |= ESP_TROLL;
+ p_ptr->xtra_flags |= (TR_REGEN | TR_AGGRAVATE | ESP_TROLL);
}
}
/* Apply flags */
static int extra_blows;
static int extra_shots;
-void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a)
+void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a)
{
s16b antimagic_mod;
+ // Mix into computed flags
+ p_ptr->computed_flags |= f;
+
/* Affect stats */
- if (f1 & (TR1_STR)) p_ptr->stat_add[A_STR] += pval;
- if (f1 & (TR1_INT)) p_ptr->stat_add[A_INT] += pval;
- if (f1 & (TR1_WIS)) p_ptr->stat_add[A_WIS] += pval;
- if (f1 & (TR1_DEX)) p_ptr->stat_add[A_DEX] += pval;
- if (f1 & (TR1_CON)) p_ptr->stat_add[A_CON] += pval;
- if (f1 & (TR1_CHR)) p_ptr->stat_add[A_CHR] += pval;
- if (f5 & (TR5_LUCK)) p_ptr->luck_cur += pval;
+ if (f & TR_STR) p_ptr->stat_add[A_STR] += pval;
+ if (f & TR_INT) p_ptr->stat_add[A_INT] += pval;
+ if (f & TR_WIS) p_ptr->stat_add[A_WIS] += pval;
+ if (f & TR_DEX) p_ptr->stat_add[A_DEX] += pval;
+ if (f & TR_CON) p_ptr->stat_add[A_CON] += pval;
+ if (f & TR_CHR) p_ptr->stat_add[A_CHR] += pval;
+ if (f & TR_LUCK) p_ptr->luck_cur += pval;
/* Affect spell power */
- if (f1 & (TR1_SPELL)) p_ptr->to_s += pval;
+ if (f & TR_SPELL) p_ptr->to_s += pval;
/* Affect mana capacity */
- if (f1 & (TR1_MANA)) p_ptr->to_m += pval;
+ if (f & TR_MANA) p_ptr->to_m += pval;
/* Affect life capacity */
- if (f2 & (TR2_LIFE)) p_ptr->to_l += pval;
+ if (f & TR_LIFE) p_ptr->to_l += pval;
/* Affect stealth */
- if (f1 & (TR1_STEALTH)) p_ptr->skill_stl += pval;
-
- /* Affect searching ability (factor of five) */
- if (f1 & (TR1_SEARCH)) p_ptr->skill_srh += (pval * 5);
-
- /* Affect searching frequency (factor of five) */
- if (f1 & (TR1_SEARCH)) p_ptr->skill_fos += (pval * 5);
+ if (f & TR_STEALTH) p_ptr->skill_stl += pval;
/* Affect infravision */
- if (f1 & (TR1_INFRA)) p_ptr->see_infra += pval;
+ if (f & TR_INFRA) p_ptr->see_infra += pval;
/* Affect digging (factor of 20) */
- if (f1 & (TR1_TUNNEL)) p_ptr->skill_dig += (pval * 20);
+ if (f & TR_TUNNEL) p_ptr->skill_dig += (pval * 20);
/* Affect speed */
- if (f1 & (TR1_SPEED)) p_ptr->pspeed += pval;
+ if (f & TR_SPEED) p_ptr->pspeed += pval;
/* Affect blows */
- if (f1 & (TR1_BLOWS)) extra_blows += pval;
- if (f5 & (TR5_CRIT)) p_ptr->xtra_crit += pval;
+ if (f & TR_BLOWS) extra_blows += pval;
+ if (f & TR_CRIT) p_ptr->xtra_crit += pval;
/* Hack -- Sensible fire */
- if (f2 & (TR2_SENS_FIRE)) p_ptr->sensible_fire = TRUE;
+ if (f & TR_SENS_FIRE) p_ptr->sensible_fire = TRUE;
/* Hack -- cause earthquakes */
- if (f1 & (TR1_IMPACT)) p_ptr->impact = TRUE;
+ if (f & TR_IMPACT) p_ptr->impact = TRUE;
/* Affect invisibility */
- if (f2 & (TR2_INVIS)) p_ptr->invis += (pval * 10);
+ if (f & TR_INVIS) p_ptr->invis += (pval * 10);
/* Boost shots */
- if (f3 & (TR3_XTRA_SHOTS)) extra_shots++;
+ if (f & TR_XTRA_SHOTS) extra_shots++;
/* Various flags */
- if (f3 & (TR3_AGGRAVATE)) p_ptr->aggravate = TRUE;
- if (f3 & (TR3_TELEPORT)) p_ptr->teleport = TRUE;
- if (f5 & (TR5_DRAIN_MANA)) p_ptr->drain_mana++;
- if (f5 & (TR5_DRAIN_HP)) p_ptr->drain_life++;
- if (f3 & (TR3_DRAIN_EXP)) p_ptr->exp_drain = TRUE;
- if (f3 & (TR3_BLESSED)) p_ptr->bless_blade = TRUE;
- if (f3 & (TR3_XTRA_MIGHT)) p_ptr->xtra_might += pval;
- if (f3 & (TR3_SLOW_DIGEST)) p_ptr->slow_digest = TRUE;
- if (f3 & (TR3_REGEN)) p_ptr->regenerate = TRUE;
- if (esp) p_ptr->telepathy |= esp;
- if ((tval != TV_LITE) && (f3 & (TR3_LITE1))) p_ptr->lite = TRUE;
- if ((tval != TV_LITE) && (f4 & (TR4_LITE2))) p_ptr->lite = TRUE;
- if ((tval != TV_LITE) && (f4 & (TR4_LITE3))) p_ptr->lite = TRUE;
- if (f3 & (TR3_SEE_INVIS)) p_ptr->see_inv = TRUE;
- if (f2 & (TR2_FREE_ACT)) p_ptr->free_act = TRUE;
- if (f2 & (TR2_HOLD_LIFE)) p_ptr->hold_life = TRUE;
- if (f3 & (TR3_WRAITH)) p_ptr->wraith_form = TRUE;
- if (f3 & (TR3_FEATHER)) p_ptr->ffall = TRUE;
- if (f4 & (TR4_FLY)) p_ptr->fly = TRUE;
- if (f4 & (TR4_CLIMB)) p_ptr->climb = TRUE;
+ if (f & TR_AGGRAVATE) p_ptr->aggravate = TRUE;
+ if (f & TR_TELEPORT) p_ptr->teleport = TRUE;
+ if (f & TR_DRAIN_MANA) p_ptr->drain_mana++;
+ if (f & TR_DRAIN_HP) p_ptr->drain_life++;
+ if (f & TR_DRAIN_EXP) p_ptr->exp_drain = TRUE;
+ if (f & TR_BLESSED) p_ptr->bless_blade = TRUE;
+ if (f & TR_XTRA_MIGHT) p_ptr->xtra_might += pval;
+ if (f & TR_SLOW_DIGEST) p_ptr->slow_digest = TRUE;
+ if (f & TR_REGEN) p_ptr->regenerate = TRUE;
+ if ((tval != TV_LITE) && (f & TR_LITE1)) p_ptr->lite = TRUE;
+ if ((tval != TV_LITE) && (f & TR_LITE2)) p_ptr->lite = TRUE;
+ if ((tval != TV_LITE) && (f & TR_LITE3)) p_ptr->lite = TRUE;
+ if (f & TR_SEE_INVIS) p_ptr->see_inv = TRUE;
+ if (f & TR_FREE_ACT) p_ptr->free_act = TRUE;
+ if (f & TR_HOLD_LIFE) p_ptr->hold_life = TRUE;
+ if (f & TR_WRAITH) p_ptr->wraith_form = TRUE;
+ if (f & TR_FEATHER) p_ptr->ffall = TRUE;
+ if (f & TR_FLY) p_ptr->fly = TRUE;
+ if (f & TR_CLIMB) p_ptr->climb = TRUE;
/* Immunity flags */
- if (f2 & (TR2_IM_FIRE)) p_ptr->immune_fire = TRUE;
- if (f2 & (TR2_IM_ACID)) p_ptr->immune_acid = TRUE;
- if (f2 & (TR2_IM_COLD)) p_ptr->immune_cold = TRUE;
- if (f2 & (TR2_IM_ELEC)) p_ptr->immune_elec = TRUE;
+ if (f & TR_IM_FIRE) p_ptr->immune_fire = TRUE;
+ if (f & TR_IM_ACID) p_ptr->immune_acid = TRUE;
+ if (f & TR_IM_COLD) p_ptr->immune_cold = TRUE;
+ if (f & TR_IM_ELEC) p_ptr->immune_elec = TRUE;
/* Resistance flags */
- if (f2 & (TR2_RES_ACID)) p_ptr->resist_acid = TRUE;
- if (f2 & (TR2_RES_ELEC)) p_ptr->resist_elec = TRUE;
- if (f2 & (TR2_RES_FIRE)) p_ptr->resist_fire = TRUE;
- if (f2 & (TR2_RES_COLD)) p_ptr->resist_cold = TRUE;
- if (f2 & (TR2_RES_POIS)) p_ptr->resist_pois = TRUE;
- if (f2 & (TR2_RES_FEAR)) p_ptr->resist_fear = TRUE;
- if (f2 & (TR2_RES_CONF)) p_ptr->resist_conf = TRUE;
- if (f2 & (TR2_RES_SOUND)) p_ptr->resist_sound = TRUE;
- if (f2 & (TR2_RES_LITE)) p_ptr->resist_lite = TRUE;
- if (f2 & (TR2_RES_DARK)) p_ptr->resist_dark = TRUE;
- if (f2 & (TR2_RES_CHAOS)) p_ptr->resist_chaos = TRUE;
- if (f2 & (TR2_RES_DISEN)) p_ptr->resist_disen = TRUE;
- if (f2 & (TR2_RES_SHARDS)) p_ptr->resist_shard = TRUE;
- if (f2 & (TR2_RES_NEXUS)) p_ptr->resist_nexus = TRUE;
- if (f2 & (TR2_RES_BLIND)) p_ptr->resist_blind = TRUE;
- if (f2 & (TR2_RES_NETHER)) p_ptr->resist_neth = TRUE;
- if (f4 & (TR4_IM_NETHER)) p_ptr->immune_neth = TRUE;
-
- if (f2 & (TR2_REFLECT)) p_ptr->reflect = TRUE;
- if (f3 & (TR3_SH_FIRE)) p_ptr->sh_fire = TRUE;
- if (f3 & (TR3_SH_ELEC)) p_ptr->sh_elec = TRUE;
- if (f3 & (TR3_NO_MAGIC)) p_ptr->anti_magic = TRUE;
- if (f3 & (TR3_NO_TELE)) p_ptr->anti_tele = TRUE;
+ if (f & TR_RES_ACID) p_ptr->resist_acid = TRUE;
+ if (f & TR_RES_ELEC) p_ptr->resist_elec = TRUE;
+ if (f & TR_RES_FIRE) p_ptr->resist_fire = TRUE;
+ if (f & TR_RES_COLD) p_ptr->resist_cold = TRUE;
+ if (f & TR_RES_POIS) p_ptr->resist_pois = TRUE;
+ if (f & TR_RES_FEAR) p_ptr->resist_fear = TRUE;
+ if (f & TR_RES_CONF) p_ptr->resist_conf = TRUE;
+ if (f & TR_RES_SOUND) p_ptr->resist_sound = TRUE;
+ if (f & TR_RES_LITE) p_ptr->resist_lite = TRUE;
+ if (f & TR_RES_DARK) p_ptr->resist_dark = TRUE;
+ if (f & TR_RES_CHAOS) p_ptr->resist_chaos = TRUE;
+ if (f & TR_RES_DISEN) p_ptr->resist_disen = TRUE;
+ if (f & TR_RES_SHARDS) p_ptr->resist_shard = TRUE;
+ if (f & TR_RES_NEXUS) p_ptr->resist_nexus = TRUE;
+ if (f & TR_RES_BLIND) p_ptr->resist_blind = TRUE;
+ if (f & TR_RES_NETHER) p_ptr->resist_neth = TRUE;
+ if (f & TR_IM_NETHER) p_ptr->immune_neth = TRUE;
+
+ if (f & TR_REFLECT) p_ptr->reflect = TRUE;
+ if (f & TR_SH_FIRE) p_ptr->sh_fire = TRUE;
+ if (f & TR_SH_ELEC) p_ptr->sh_elec = TRUE;
+ if (f & TR_NO_MAGIC) p_ptr->anti_magic = TRUE;
+ if (f & TR_NO_TELE) p_ptr->anti_tele = TRUE;
/* Sustain flags */
- if (f2 & (TR2_SUST_STR)) p_ptr->sustain_str = TRUE;
- if (f2 & (TR2_SUST_INT)) p_ptr->sustain_int = TRUE;
- if (f2 & (TR2_SUST_WIS)) p_ptr->sustain_wis = TRUE;
- if (f2 & (TR2_SUST_DEX)) p_ptr->sustain_dex = TRUE;
- if (f2 & (TR2_SUST_CON)) p_ptr->sustain_con = TRUE;
- if (f2 & (TR2_SUST_CHR)) p_ptr->sustain_chr = TRUE;
+ if (f & TR_SUST_STR) p_ptr->sustain_str = TRUE;
+ if (f & TR_SUST_INT) p_ptr->sustain_int = TRUE;
+ if (f & TR_SUST_WIS) p_ptr->sustain_wis = TRUE;
+ if (f & TR_SUST_DEX) p_ptr->sustain_dex = TRUE;
+ if (f & TR_SUST_CON) p_ptr->sustain_con = TRUE;
+ if (f & TR_SUST_CHR) p_ptr->sustain_chr = TRUE;
- if (f4 & (TR4_PRECOGNITION)) p_ptr->precognition = TRUE;
+ if (f & TR_PRECOGNITION) p_ptr->precognition = TRUE;
antimagic_mod = to_h + to_d + to_a;
- if (f4 & (TR4_ANTIMAGIC_50))
+ if (f & TR_ANTIMAGIC_50)
{
s32b tmp;
@@ -2695,7 +2558,7 @@ void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pva
if (tmp > 0) p_ptr->antimagic_dis += tmp;
}
- if (f4 & (TR4_AUTO_ID))
+ if (f & TR_AUTO_ID)
{
p_ptr->auto_id = TRUE;
}
@@ -2705,13 +2568,17 @@ void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pva
* "black_breath". This flag can also be set by a unlucky blow from
* an undead. -LM-
*/
- if (f4 & (TR4_BLACK_BREATH)) p_ptr->black_breath = TRUE;
+ if (f & TR_BLACK_BREATH) p_ptr->black_breath = TRUE;
- if (f5 & (TR5_IMMOVABLE)) p_ptr->immovable = TRUE;
+ if (f & TR_IMMOVABLE) p_ptr->immovable = TRUE;
/* Breaths */
- if (f5 & (TR5_WATER_BREATH)) p_ptr->water_breath = TRUE;
- if (f5 & (TR5_MAGIC_BREATH))
+ if (f & TR_WATER_BREATH)
+ {
+ p_ptr->water_breath = TRUE;
+ }
+
+ if (f & TR_MAGIC_BREATH)
{
p_ptr->magical_breath = TRUE;
p_ptr->water_breath = TRUE;
@@ -2719,11 +2586,23 @@ void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pva
}
+/**
+ * Apply player level flags
+ */
+template <class LF>
+static void apply_lflags(LF const &lflags)
+{
+ for (int i = 1; i <= p_ptr->lev; i++)
+ {
+ apply_flags(lflags[i].oflags, lflags[i].pval, 0, 0, 0, 0);
+ }
+}
+
/**
* Are barehand fighter's hands empty?
*/
-static bool_ monk_empty_hands(void)
+static bool_ monk_empty_hands()
{
int i;
object_type *o_ptr;
@@ -2768,23 +2647,28 @@ static bool_ monk_empty_hands(void)
*/
void calc_bonuses(bool_ silent)
{
+ auto const &s_descriptors = game->edit_data.s_descriptors;
+ auto const &r_info = game->edit_data.r_info;
+ auto &s_info = game->s_info;
+ auto const &a_info = game->edit_data.a_info;
+
static bool_ monk_notify_aux = FALSE;
int i, j, hold;
int old_speed;
- u32b old_telepathy;
int old_see_inv;
int old_dis_ac;
int old_dis_to_a;
object_type *o_ptr;
- u32b f1, f2, f3, f4, f5, esp;
bool_ monk_armour_aux;
+ /* Save the old computed_flags */
+ auto old_computed_flags = p_ptr->computed_flags;
+
/* Save the old speed */
old_speed = p_ptr->pspeed;
/* Save the old vision stuff */
- old_telepathy = p_ptr->telepathy;
old_see_inv = p_ptr->see_inv;
/* Save the old armor class */
@@ -2852,7 +2736,7 @@ void calc_bonuses(bool_ silent)
p_ptr->climb = FALSE;
p_ptr->ffall = FALSE;
p_ptr->hold_life = FALSE;
- p_ptr->telepathy = 0;
+ p_ptr->computed_flags = object_flag_set();
p_ptr->lite = FALSE;
p_ptr->sustain_str = FALSE;
p_ptr->sustain_int = FALSE;
@@ -2906,10 +2790,6 @@ void calc_bonuses(bool_ silent)
/* Base infravision (purely racial) */
p_ptr->see_infra = rp_ptr->infra + rmp_ptr->infra;
-
- /* Base skill -- disarming */
- p_ptr->skill_dis = 0;
-
/* Base skill -- magic devices */
p_ptr->skill_dev = 0;
@@ -2919,12 +2799,6 @@ void calc_bonuses(bool_ silent)
/* Base skill -- stealth */
p_ptr->skill_stl = 0;
- /* Base skill -- searching ability */
- p_ptr->skill_srh = 0;
-
- /* Base skill -- searching frequency */
- p_ptr->skill_fos = 0;
-
/* Base skill -- combat (normal) */
p_ptr->skill_thn = 0;
@@ -2939,18 +2813,15 @@ void calc_bonuses(bool_ silent)
p_ptr->skill_dig = 0;
/* Xtra player flags */
- p_ptr->xtra_f1 = 0;
- p_ptr->xtra_f2 = 0;
- p_ptr->xtra_f3 = 0;
- p_ptr->xtra_f4 = 0;
- p_ptr->xtra_f5 = 0;
- p_ptr->xtra_esp = 0;
+ p_ptr->xtra_flags = object_flag_set();
/* Hide the skills that should auto hide */
- for (i = 0; i < max_s_idx; i++)
+ for (std::size_t i = 0; i < s_descriptors.size(); i++)
{
- if (s_info[i].flags1 & SKF1_AUTO_HIDE)
- s_info[i].hidden = TRUE;
+ if (s_descriptors[i].flags & SKF_AUTO_HIDE)
+ {
+ s_info[i].hidden = true;
+ }
}
/* Base Luck */
@@ -2975,10 +2846,8 @@ void calc_bonuses(bool_ silent)
/* The powers gived by the wielded monster */
calc_wield_monster();
- for (i = 1; i <= p_ptr->lev; i++)
- {
- apply_flags(cp_ptr->oflags1[i], cp_ptr->oflags2[i], cp_ptr->oflags3[i], cp_ptr->oflags4[i], cp_ptr->oflags5[i], cp_ptr->oesp[i], cp_ptr->opval[i], 0, 0, 0, 0);
- }
+ /* Apply all the level-dependent class flags */
+ apply_lflags(cp_ptr->lflags);
if (p_ptr->melee_style == SKILL_HAND)
{
@@ -3006,7 +2875,10 @@ void calc_bonuses(bool_ silent)
if (get_skill(SKILL_DAEMON) > 20) p_ptr->resist_conf = TRUE;
if (get_skill(SKILL_DAEMON) > 30) p_ptr->resist_fear = TRUE;
- if ( get_skill(SKILL_MINDCRAFT) >= 40 ) p_ptr->telepathy = ESP_ALL;
+ if ( get_skill(SKILL_MINDCRAFT) >= 40 )
+ {
+ p_ptr->computed_flags |= ESP_ALL;
+ }
if (p_ptr->astral)
{
@@ -3016,26 +2888,23 @@ void calc_bonuses(bool_ silent)
/***** Races ****/
if ((!p_ptr->mimic_form) && (!p_ptr->body_monster))
{
- int i;
+ /* Apply level-dependent flags from race/sub-race */
+ apply_lflags(rp_ptr->lflags);
+ apply_lflags(rmp_ptr->lflags);
- for (i = 1; i <= p_ptr->lev; i++)
- {
- apply_flags(rp_ptr->oflags1[i], rp_ptr->oflags2[i], rp_ptr->oflags3[i], rp_ptr->oflags4[i], rp_ptr->oflags5[i], rp_ptr->oesp[i], rp_ptr->opval[i], 0, 0, 0, 0);
- apply_flags(rmp_ptr->oflags1[i], rmp_ptr->oflags2[i], rmp_ptr->oflags3[i], rmp_ptr->oflags4[i], rmp_ptr->oflags5[i], rmp_ptr->oesp[i], rmp_ptr->opval[i], 0, 0, 0, 0);
- }
-
- if (race_flags1_p(PR1_HURT_LITE))
+ /* Is the player's race hurt by light? */
+ if (race_flags_p(PR_HURT_LITE))
p_ptr->sensible_lite = TRUE;
}
/* The extra flags */
- apply_flags(p_ptr->xtra_f1, p_ptr->xtra_f2, p_ptr->xtra_f3, p_ptr->xtra_f4, p_ptr->xtra_f5, p_ptr->xtra_esp, 0, 0, 0, 0, 0);
+ apply_flags(p_ptr->xtra_flags, 0, 0, 0, 0, 0);
/* Apply the racial modifiers */
for (i = 0; i < 6; i++)
{
/* Modify the stats for "race" */
- p_ptr->stat_add[i] += (rp_ptr->r_adj[i] + rmp_ptr->r_adj[i] + cp_ptr->c_adj[i]);
+ p_ptr->stat_add[i] += (rp_ptr->ps.adj[i] + rmp_ptr->ps.adj[i] + cp_ptr->ps.adj[i]);
}
@@ -3049,7 +2918,7 @@ void calc_bonuses(bool_ silent)
/* Extract the item flags */
object_flags_no_set = TRUE;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ auto flags = object_flags(o_ptr);
object_flags_no_set = FALSE;
/* MEGA ugly hack -- set spacetime distortion resistance */
@@ -3061,10 +2930,10 @@ void calc_bonuses(bool_ silent)
/* Hack - don't give the Black Breath when merely inspecting a weapon */
if (silent)
{
- f4 &= ~TR4_BLACK_BREATH;
+ flags &= ~TR_BLACK_BREATH;
}
- apply_flags(f1, f2, f3, f4, f5, esp, o_ptr->pval, o_ptr->tval, o_ptr->to_h, o_ptr->to_d, o_ptr->to_a);
+ apply_flags(flags, o_ptr->pval, o_ptr->tval, o_ptr->to_h, o_ptr->to_d, o_ptr->to_a);
if (o_ptr->name1)
{
@@ -3142,7 +3011,7 @@ void calc_bonuses(bool_ silent)
/* Hack -- aura of fire also provides light */
if (p_ptr->sh_fire) p_ptr->lite = TRUE;
- if (race_flags1_p(PR1_AC_LEVEL))
+ if (race_flags_p(PR_AC_LEVEL))
{
p_ptr->to_a += 20 + (p_ptr->lev / 5);
p_ptr->dis_to_a += 20 + (p_ptr->lev / 5);
@@ -3247,12 +3116,9 @@ void calc_bonuses(bool_ silent)
p_ptr->to_a += tactic_info[(byte)p_ptr->tactic].to_ac;
p_ptr->skill_stl += tactic_info[(byte)p_ptr->tactic].to_stealth;
- p_ptr->skill_dis += tactic_info[(byte)p_ptr->tactic].to_disarm;
p_ptr->skill_sav += tactic_info[(byte)p_ptr->tactic].to_saving;
p_ptr->pspeed += move_info[(byte)p_ptr->movement].to_speed;
- p_ptr->skill_srh += move_info[(byte)p_ptr->movement].to_search;
- p_ptr->skill_fos += move_info[(byte)p_ptr->movement].to_percep;
p_ptr->skill_stl += move_info[(byte)p_ptr->movement].to_stealth;
/* Apply temporary "stun" */
@@ -3282,7 +3148,7 @@ void calc_bonuses(bool_ silent)
/* Temporary precognition */
if (p_ptr->tim_precognition > 0)
{
- apply_flags(0, 0, 0, TR4_PRECOGNITION, 0, 0, 0, 0, 0, 0, 0);
+ apply_flags(TR_PRECOGNITION, 0, 0, 0, 0, 0);
}
/* Breath */
@@ -3391,13 +3257,6 @@ void calc_bonuses(bool_ silent)
p_ptr->fly = TRUE;
}
- /* Oppose Light & Dark */
- if (p_ptr->oppose_ld)
- {
- p_ptr->resist_lite = TRUE;
- p_ptr->resist_dark = TRUE;
- }
-
/* Oppose Chaos & Confusion */
if (p_ptr->oppose_cc)
{
@@ -3405,19 +3264,6 @@ void calc_bonuses(bool_ silent)
p_ptr->resist_conf = TRUE;
}
- /* Oppose Sound & Shards */
- if (p_ptr->oppose_ss)
- {
- p_ptr->resist_sound = TRUE;
- p_ptr->resist_shard = TRUE;
- }
-
- /* Oppose Nexus */
- if (p_ptr->oppose_nex)
- {
- p_ptr->resist_nexus = TRUE;
- }
-
/* Temporary "fast" */
if (p_ptr->fast)
{
@@ -3438,7 +3284,7 @@ void calc_bonuses(bool_ silent)
if (p_ptr->tim_esp)
{
- p_ptr->telepathy |= ESP_ALL;
+ p_ptr->computed_flags |= ESP_ALL;
}
/* Temporary see invisible */
@@ -3479,9 +3325,12 @@ void calc_bonuses(bool_ silent)
/* Hack -- Telepathy Change */
- if (p_ptr->telepathy != old_telepathy)
{
- p_ptr->update |= (PU_MONSTERS);
+ auto const &esp_mask = object_flags_esp();
+ if ((p_ptr->computed_flags & esp_mask) != (old_computed_flags & esp_mask))
+ {
+ p_ptr->update |= (PU_MONSTERS);
+ }
}
/* Hack -- See Invis Change */
@@ -3503,9 +3352,6 @@ void calc_bonuses(bool_ silent)
/* Bloating slows the player down (a little) */
if (p_ptr->food >= PY_FOOD_MAX) p_ptr->pspeed -= 10;
- /* Searching slows the player down */
- if (p_ptr->searching) p_ptr->pspeed -= 10;
-
/* Display the speed (if needed) */
if (p_ptr->pspeed != old_speed) p_ptr->redraw |= (PR_FRAME);
@@ -3610,13 +3456,13 @@ void calc_bonuses(bool_ silent)
if (p_ptr->num_fire < 1) p_ptr->num_fire = 1;
}
- if (race_flags1_p(PR1_XTRA_MIGHT_BOW) && p_ptr->tval_ammo == TV_ARROW)
+ if (race_flags_p(PR_XTRA_MIGHT_BOW) && p_ptr->tval_ammo == TV_ARROW)
p_ptr->xtra_might += 1;
- if (race_flags1_p(PR1_XTRA_MIGHT_SLING) && p_ptr->tval_ammo == TV_SHOT)
+ if (race_flags_p(PR_XTRA_MIGHT_SLING) && p_ptr->tval_ammo == TV_SHOT)
p_ptr->xtra_might += 1;
- if (race_flags1_p(PR1_XTRA_MIGHT_XBOW) && p_ptr->tval_ammo == TV_BOLT)
+ if (race_flags_p(PR_XTRA_MIGHT_XBOW) && p_ptr->tval_ammo == TV_BOLT)
p_ptr->xtra_might += 1;
/* Examine the "current tool" */
@@ -3823,10 +3669,8 @@ void calc_bonuses(bool_ silent)
/* 2handed weapon and shield = less damage */
if (p_ptr->inventory[INVEN_WIELD + i].k_idx && p_ptr->inventory[INVEN_ARM + i].k_idx)
{
- /* Extract the item flags */
- object_flags(&p_ptr->inventory[INVEN_WIELD + i], &f1, &f2, &f3, &f4, &f5, &esp);
-
- if (f4 & TR4_COULD2H)
+ auto const flags = object_flags(&p_ptr->inventory[INVEN_WIELD + i]);
+ if (flags & TR_COULD2H)
{
int tmp;
@@ -3900,22 +3744,12 @@ void calc_bonuses(bool_ silent)
/* Affect Skill -- stealth (bonus one) */
p_ptr->skill_stl += 1;
- /* Affect Skill -- disarming (DEX and INT) */
- p_ptr->skill_dis += adj_dex_dis[p_ptr->stat_ind[A_DEX]];
- p_ptr->skill_dis += adj_int_dis[p_ptr->stat_ind[A_INT]];
-
- /* Affect Skill -- magic devices (INT) */
- p_ptr->skill_dev += get_skill_scale(SKILL_DEVICE, 20);
-
/* Affect Skill -- saving throw (WIS) */
p_ptr->skill_sav += adj_wis_sav[p_ptr->stat_ind[A_WIS]];
/* Affect Skill -- digging (STR) */
p_ptr->skill_dig += adj_str_dig[p_ptr->stat_ind[A_STR]];
- /* Affect Skill -- disarming (skill) */
- p_ptr->skill_dis += (get_skill_scale(SKILL_DISARMING, 75));
-
/* Affect Skill -- magic devices (skill) */
p_ptr->skill_dev += (get_skill_scale(SKILL_DEVICE, 150));
@@ -3925,12 +3759,6 @@ void calc_bonuses(bool_ silent)
/* Affect Skill -- stealth (skill) */
p_ptr->skill_stl += (get_skill_scale(SKILL_STEALTH, 25));
- /* Affect Skill -- search ability (Sneakiness skill) */
- p_ptr->skill_srh += (get_skill_scale(SKILL_SNEAK, 35));
-
- /* Affect Skill -- search frequency (Sneakiness skill) */
- p_ptr->skill_fos += (get_skill_scale(SKILL_SNEAK, 25));
-
/* Affect Skill -- combat (Combat skill + mastery) */
p_ptr->skill_thn += (50 * (((7 * get_skill(p_ptr->melee_style)) + (3 * get_skill(SKILL_COMBAT))) / 10) / 10);
@@ -4065,7 +3893,7 @@ void calc_bonuses(bool_ silent)
/*
* Handle "p_ptr->notice"
*/
-void notice_stuff(void)
+void notice_stuff()
{
/* Notice stuff */
if (!p_ptr->notice) return;
@@ -4090,7 +3918,7 @@ void notice_stuff(void)
/*
* Handle "p_ptr->update"
*/
-void update_stuff(void)
+void update_stuff()
{
/* Update stuff */
if (!p_ptr->update) return;
@@ -4197,7 +4025,7 @@ void update_stuff(void)
/*
* Handle "p_ptr->redraw"
*/
-void redraw_stuff(void)
+void redraw_stuff()
{
/* Redraw stuff */
if (!p_ptr->redraw) return;
@@ -4238,7 +4066,7 @@ void redraw_stuff(void)
/*
* Handle "p_ptr->window"
*/
-void window_stuff(void)
+void window_stuff()
{
int j;
@@ -4249,7 +4077,7 @@ void window_stuff(void)
if (!p_ptr->window) return;
/* Scan windows */
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ANGBAND_TERM_MAX; j++)
{
/* Save usable flags */
if (angband_term[j]) mask |= window_flag[j];
@@ -4323,7 +4151,7 @@ void window_stuff(void)
/*
* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window"
*/
-void handle_stuff(void)
+void handle_stuff()
{
/* Update stuff */
if (p_ptr->update) update_stuff();
@@ -4336,7 +4164,7 @@ void handle_stuff(void)
}
-bool_ monk_heavy_armor(void)
+bool_ monk_heavy_armor()
{
u16b monk_arm_wgt = 0;
@@ -4355,15 +4183,17 @@ bool_ monk_heavy_armor(void)
static int get_artifact_idx(int level)
{
+ auto const &a_info = game->edit_data.a_info;
+
int count = 0, i;
while (count < 1000)
{
- artifact_type *a_ptr;
count++;
- i = randint(max_a_idx - 1);
- a_ptr = &a_info[i];
+ i = rand_int(a_info.size());
+
+ auto a_ptr = &a_info[i];
if (!a_ptr->tval) continue;
/* It is found/lost */
@@ -4373,7 +4203,7 @@ static int get_artifact_idx(int level)
if (a_ptr->level > level) continue;
/* Avoid granting SPECIAL_GENE artifacts */
- if (a_ptr->flags4 & TR4_SPECIAL_GENE) continue;
+ if (a_ptr->flags & TR_SPECIAL_GENE) continue;
return i;
}
@@ -4386,6 +4216,9 @@ static int get_artifact_idx(int level)
/* Chose a fate */
void gain_fate(byte fate)
{
+ auto const &k_info = game->edit_data.k_info;
+ auto &alloc = game->alloc;
+
int i;
int level;
@@ -4456,7 +4289,6 @@ void gain_fate(byte fate)
{
while (TRUE)
{
- object_kind *k_ptr;
obj_theme theme;
/* No themes */
@@ -4475,11 +4307,11 @@ void gain_fate(byte fate)
fates[i].o_idx = get_obj_num(max_dlv[dungeon_type] + randint(10));
/* Invalidate the cached allocation table */
- alloc_kind_table_valid = FALSE;
+ alloc.kind_table_valid = false;
- k_ptr = &k_info[fates[i].o_idx];
+ auto k_ptr = &k_info[fates[i].o_idx];
- if (!(k_ptr->flags3 & TR3_INSTA_ART) && !(k_ptr->flags3 & TR3_NORM_ART)) break;
+ if (!(k_ptr->flags & TR_INSTA_ART) && !(k_ptr->flags & TR_NORM_ART)) break;
}
level = rand_range(max_dlv[dungeon_type] - 20, max_dlv[dungeon_type] + 20);
fates[i].level = (level < 1) ? 1 : (level > 98) ? 98 : level;
@@ -4529,18 +4361,21 @@ void gain_fate(byte fate)
}
}
-void fate_desc(char *desc, int fate)
+std::string fate_desc(int fate)
{
- char buf[120];
+ auto const &a_info = game->edit_data.a_info;
+
+ fmt::MemoryWriter w;
if (fates[fate].serious)
{
- strcpy(desc, "You are fated to ");
+ w.write("You are fated to ");
}
else
{
- strcpy(desc, "You may ");
+ w.write("You may ");
}
+
switch (fates[fate].fate)
{
case FATE_FIND_O:
@@ -4552,15 +4387,14 @@ void fate_desc(char *desc, int fate)
object_prep(o_ptr, fates[fate].o_idx);
object_desc_store(o_name, o_ptr, 1, 0);
- sprintf(buf, "find %s on level %d.", o_name, fates[fate].level);
- strcat(desc, buf);
+ w.write("find {} on level {}.", o_name, fates[fate].level);
break;
}
case FATE_FIND_A:
{
object_type *q_ptr, forge;
char o_name[80];
- artifact_type *a_ptr = &a_info[fates[fate].a_idx];
+ auto a_ptr = &a_info[fates[fate].a_idx];
int I_kind;
/* Failed artefact allocation XXX XXX XXX */
@@ -4598,61 +4432,62 @@ void fate_desc(char *desc, int fate)
q_ptr->weight = a_ptr->weight;
/* Hack -- acquire "cursed" flag */
- if (a_ptr->flags3 & (TR3_CURSED)) q_ptr->ident |= (IDENT_CURSED);
+ if (a_ptr->flags & (TR_CURSED)) q_ptr->ident |= (IDENT_CURSED);
random_artifact_resistance(q_ptr);
object_desc_store(o_name, q_ptr, 1, 0);
}
- sprintf(buf, "find %s on level %d.", o_name, fates[fate].level);
- strcat(desc, buf);
+ w.write("find {} on level {}.", o_name, fates[fate].level);
break;
}
case FATE_FIND_R:
{
char m_name[80];
-
monster_race_desc(m_name, fates[fate].r_idx, 0);
- sprintf(buf, "meet %s on level %d.", m_name, fates[fate].level);
- strcat(desc, buf);
+
+ w.write("meet {} on level {}.", m_name, fates[fate].level);
break;
}
case FATE_DIE:
{
- sprintf(buf, "die on level %d.", fates[fate].level);
- strcat(desc, buf);
+ w.write("die on level {}.", fates[fate].level);
break;
}
case FATE_NO_DIE_MORTAL:
{
- strcat(desc, "never to die by the hand of a mortal being.");
+ w.write("never to die by the hand of a mortal being.");
break;
}
}
+
+ return w.str();
}
-void dump_fates(FILE *outfile)
+std::string dump_fates()
{
- int i;
- char buf[120];
bool_ pending = FALSE;
- if (!outfile) return;
+ fmt::MemoryWriter w;
- for (i = 0; i < MAX_FATES; i++)
+ for (int i = 0; i < MAX_FATES; i++)
{
if ((fates[i].fate) && (fates[i].know))
{
- fate_desc(buf, i);
- fprintf(outfile, "%s\n", buf);
+ w.write("{}\n", fate_desc(i));
}
- if ((fates[i].fate) && !(fates[i].know)) pending = TRUE;
+
+ // Pending gets set if there's at least one fate we don't know
+ pending |= ((fates[i].fate) && !(fates[i].know));
}
+
if (pending)
{
- fprintf(outfile, "You do not know all of your fate.\n");
+ w.write("You do not know all of your fate.\n");
}
+
+ return w.str();
}
/*
@@ -4673,12 +4508,7 @@ int luck(int min, int max)
return (luck + min);
}
-bool race_flags1_p(u32b flags1_mask)
-{
- return (rp_ptr->flags1 | rmp_ptr->flags1 | cp_ptr->flags1 | spp_ptr->flags1) & flags1_mask;
-}
-
-bool race_flags2_p(u32b flags2_mask)
+bool race_flags_p(player_race_flag_set const &flags_mask)
{
- return (rp_ptr->flags2 | rmp_ptr->flags2 | cp_ptr->flags2 | spp_ptr->flags2) & flags2_mask;
+ return bool((rp_ptr->flags | rmp_ptr->flags | cp_ptr->flags | spp_ptr->flags) & flags_mask);
}
diff --git a/src/xtra1.hpp b/src/xtra1.hpp
index df2592ac..4fde1619 100644
--- a/src/xtra1.hpp
+++ b/src/xtra1.hpp
@@ -1,24 +1,27 @@
#pragma once
#include "h-basic.h"
+#include "object_flag_set.hpp"
+#include "player_race_flag_set.hpp"
-extern void fix_message(void);
-extern void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a);
-extern int luck(int min, int max);
-extern int weight_limit(void);
+#include <string>
+
+void fix_message();
+void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a);
+int luck(int min, int max);
+int weight_limit();
extern bool_ calc_powers_silent;
-extern void cnv_stat(int i, char *out_val);
-extern s16b modify_stat_value(int value, int amount);
-extern void calc_hitpoints(void);
-extern void notice_stuff(void);
-extern void update_stuff(void);
-extern void redraw_stuff(void);
-extern void window_stuff(void);
-extern void handle_stuff(void);
-extern bool_ monk_heavy_armor(void);
-extern void calc_bonuses(bool_ silent);
-extern void gain_fate(byte fate);
-extern void fate_desc(char *desc, int fate);
-extern void dump_fates(FILE *OutFile);
-extern bool race_flags1_p(u32b flags1_mask);
-extern bool race_flags2_p(u32b flags2_mask);
+void cnv_stat(int i, char *out_val);
+s16b modify_stat_value(int value, int amount);
+void calc_hitpoints();
+void notice_stuff();
+void update_stuff();
+void redraw_stuff();
+void window_stuff();
+void handle_stuff();
+bool_ monk_heavy_armor();
+void calc_bonuses(bool_ silent);
+void gain_fate(byte fate);
+std::string fate_desc(int fate);
+std::string dump_fates();
+bool race_flags_p(player_race_flag_set const &flags_mask);
diff --git a/src/xtra2.cc b/src/xtra2.cc
index 096f8966..d8b87f51 100644
--- a/src/xtra2.cc
+++ b/src/xtra2.cc
@@ -14,8 +14,10 @@
#include "corrupt.hpp"
#include "dungeon_info_type.hpp"
#include "ego_item_type.hpp"
+#include "feature_flag.hpp"
#include "feature_type.hpp"
#include "files.hpp"
+#include "game.hpp"
#include "gods.hpp"
#include "hook_player_level_in.hpp"
#include "hook_monster_death_in.hpp"
@@ -27,17 +29,20 @@
#include "monster3.hpp"
#include "monster_ego.hpp"
#include "monster_race.hpp"
+#include "monster_race_flag.hpp"
#include "monster_type.hpp"
#include "notes.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
#include "object_kind.hpp"
#include "options.hpp"
#include "player_class.hpp"
#include "player_race.hpp"
+#include "player_race_flag.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
-#include "quark.hpp"
+#include "point.hpp"
#include "randart.hpp"
#include "skill_type.hpp"
#include "skills.hpp"
@@ -46,7 +51,6 @@
#include "stats.hpp"
#include "store_info_type.hpp"
#include "tables.hpp"
-#include "trap_type.hpp"
#include "util.hpp"
#include "util.h"
#include "variable.h"
@@ -57,14 +61,16 @@
#include "xtra1.hpp"
#include "z-rand.hpp"
-#include <type_traits>
+#include <boost/algorithm/string/predicate.hpp>
#include <cassert>
+#include <fmt/format.h>
+#include <type_traits>
+
-#include <boost/algorithm/string/predicate.hpp>
using boost::algorithm::iequals;
-static void corrupt_corrupted(void);
+static void corrupt_corrupted();
/*
* Set "p_ptr->parasite" and "p_ptr->parasite_r_idx"
@@ -129,7 +135,7 @@ bool_ set_parasite(int v, int r)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -182,8 +188,7 @@ static bool_ set_simple_field(
return (FALSE);
/* Disturb */
- if (disturb_state)
- disturb(0);
+ disturb_on_state();
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -398,17 +403,6 @@ bool_ set_strike(int v)
}
/*
- * Set "p_ptr->oppose_ld"
- */
-bool_ set_oppose_ld(int v)
-{
- return set_simple_field(
- &p_ptr->oppose_ld, v,
- TERM_WHITE, "You feel protected against light's fluctuation.",
- TERM_WHITE, "You are no longer protected against light's fluctuation.");
-}
-
-/*
* Set "p_ptr->oppose_cc"
*/
bool_ set_oppose_cc(int v)
@@ -420,33 +414,13 @@ bool_ set_oppose_cc(int v)
}
/*
- * Set "p_ptr->oppose_ss"
- */
-bool_ set_oppose_ss(int v)
-{
- return set_simple_field(
- &p_ptr->oppose_ss, v,
- TERM_WHITE, "You feel protected against the ravages of sound and shards.",
- TERM_WHITE, "You are no longer protected against the ravages of sound and shards.");
-}
-
-/*
- * Set "p_ptr->oppose_nex"
- */
-bool_ set_oppose_nex(int v)
-{
- return set_simple_field(
- &p_ptr->oppose_nex, v,
- TERM_WHITE, "You feel protected against the strange forces of nexus.",
- TERM_WHITE, "You are no longer protected against the strange forces of nexus.");
-}
-
-/*
* Set "p_ptr->tim_mimic", and "p_ptr->mimic_form",
* notice observable changes
*/
bool_ set_mimic(int v, int p, int level)
{
+ auto &s_info = game->s_info;
+
bool_ notice = FALSE;
/* Hack -- Force good values */
@@ -473,7 +447,7 @@ bool_ set_mimic(int v, int p, int level)
notice = TRUE;
if (p == resolve_mimic_name("Bear"))
{
- s_info[SKILL_BEAR].hidden = TRUE;
+ s_info[SKILL_BEAR].hidden = true;
select_default_melee();
}
p = 0;
@@ -488,7 +462,7 @@ bool_ set_mimic(int v, int p, int level)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Redraw title */
p_ptr->redraw |= (PR_FRAME);
@@ -785,7 +759,7 @@ bool_ set_fast(int v, int p)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -963,45 +937,6 @@ bool_ set_protevil(int v)
}
/*
- * Set "p_ptr->protgood", notice observable changes
- */
-bool_ set_protgood(int v)
-{
- bool_ notice = set_simple_field(
- &p_ptr->protgood, v,
- TERM_WHITE, "You feel safe from good!",
- TERM_WHITE, "You no longer feel safe from good.");
-
- if (notice)
- {
- /* Handle stuff */
- handle_stuff();
- }
-
- /* Result */
- return notice;
-}
-
-/*
- * Set "p_ptr->protundead", notice observable changes
- */
-bool_ set_protundead(int v)
-{
- bool_ notice = set_simple_field(
- &p_ptr->protundead, v,
- TERM_WHITE, "You feel safe from undead!",
- TERM_WHITE, "You no longer feel safe from undead.");
-
- if (notice) {
- /* Handle stuff */
- handle_stuff();
- }
-
- /* Result */
- return notice;
-}
-
-/*
* Set "p_ptr->set_shadow", notice observable changes
*/
bool_ set_shadow(int v)
@@ -1127,7 +1062,7 @@ bool_ set_tim_thunder(int v, int p1, int p2)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -1334,7 +1269,7 @@ bool_ set_tim_regen(int v, int p)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Handle stuff */
handle_stuff();
@@ -1358,7 +1293,7 @@ bool_ set_stun(int v)
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
- if (race_flags1_p(PR1_NO_STUN)) v = 0;
+ if (race_flags_p(PR_NO_STUN)) v = 0;
/* Knocked out */
if (p_ptr->stun > 100)
@@ -1438,25 +1373,25 @@ bool_ set_stun(int v)
{
if (!p_ptr->sustain_int)
{
- (void) do_dec_stat(A_INT, STAT_DEC_NORMAL);
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
}
if (!p_ptr->sustain_wis)
{
- (void) do_dec_stat(A_WIS, STAT_DEC_NORMAL);
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
}
}
else if (randint(2) == 1)
{
if (!p_ptr->sustain_int)
{
- (void) do_dec_stat(A_INT, STAT_DEC_NORMAL);
+ do_dec_stat(A_INT, STAT_DEC_NORMAL);
}
}
else
{
if (!p_ptr->sustain_wis)
{
- (void) do_dec_stat(A_WIS, STAT_DEC_NORMAL);
+ do_dec_stat(A_WIS, STAT_DEC_NORMAL);
}
}
}
@@ -1474,7 +1409,7 @@ bool_ set_stun(int v)
/* None */
case 0:
msg_print("You are no longer stunned.");
- if (disturb_state) disturb(0);
+ disturb_on_state();
break;
}
@@ -1489,7 +1424,7 @@ bool_ set_stun(int v)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -1519,7 +1454,7 @@ bool_ set_cut(int v)
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
- if (race_flags1_p(PR1_NO_CUT)) v = 0;
+ if (race_flags_p(PR_NO_CUT)) v = 0;
/* Mortal wound */
if (p_ptr->cut > 1000)
@@ -1682,7 +1617,7 @@ bool_ set_cut(int v)
/* None */
case 0:
msg_print("You are no longer bleeding.");
- if (disturb_state) disturb(0);
+ disturb_on_state();
break;
}
@@ -1697,7 +1632,7 @@ bool_ set_cut(int v)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -1911,7 +1846,7 @@ bool_ set_food(int v)
if (!notice) return (FALSE);
/* Disturb */
- if (disturb_state) disturb(0);
+ disturb_on_state();
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
@@ -1930,7 +1865,7 @@ bool_ set_food(int v)
/*
* Advance experience levels and print experience
*/
-void check_experience(void)
+void check_experience()
{
int gained = 0;
bool_ level_corruption = FALSE;
@@ -1982,8 +1917,8 @@ void check_experience(void)
/* Gain levels while possible */
- while ((p_ptr->lev < PY_MAX_LEVEL) && (p_ptr->lev < max_plev) &&
- (p_ptr->exp >= (player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L)))
+ while ((p_ptr->lev < PY_MAX_LEVEL) &&
+ (p_ptr->exp >= (player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L)))
{
/* Gain a level */
p_ptr->lev++;
@@ -1994,16 +1929,13 @@ void check_experience(void)
if (p_ptr->lev > p_ptr->max_plv)
{
p_ptr->max_plv = p_ptr->lev;
- if ((race_flags1_p(PR1_CORRUPT)) &&
+ if ((race_flags_p(PR_CORRUPT)) &&
(randint(3) == 1))
{
level_corruption = TRUE;
}
}
- /* Sound */
- sound(SOUND_LEVEL);
-
/* Message */
cmsg_format(TERM_L_GREEN, "Welcome to level %d.", p_ptr->lev);
@@ -2067,7 +1999,7 @@ void check_experience_obj(object_type *o_ptr)
/* Gain levels while possible */
while ((o_ptr->elevel < PY_MAX_LEVEL) &&
- (o_ptr->exp >= (player_exp[o_ptr->elevel - 1] * 5 / 2)))
+ (o_ptr->exp >= calc_object_need_exp(o_ptr)))
{
char buf[100];
@@ -2089,7 +2021,7 @@ void check_experience_obj(object_type *o_ptr)
*/
void gain_exp(s32b amount)
{
- if ((p_ptr->max_exp > 0) && (race_flags1_p(PR1_CORRUPT)))
+ if ((p_ptr->max_exp > 0) && (race_flags_p(PR_CORRUPT)))
{
if ((randint(p_ptr->max_exp) < amount) || (randint(12000000) < amount))
{
@@ -2181,13 +2113,13 @@ void place_corpse(monster_type *m_ptr)
auto const r_ptr = m_ptr->race();
/* It has a physical form */
- if (r_ptr->flags9 & RF9_DROP_CORPSE)
+ if (r_ptr->flags & RF_DROP_CORPSE)
{
/* Wipe the object */
object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_CORPSE));
/* Unique corpses are unique */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
object_aware(i_ptr);
i_ptr->name1 = 201;
@@ -2217,13 +2149,13 @@ void place_corpse(monster_type *m_ptr)
}
/* The creature is an animated skeleton. */
- if (!(r_ptr->flags9 & RF9_DROP_CORPSE) && (r_ptr->flags9 & RF9_DROP_SKELETON))
+ if (!(r_ptr->flags & RF_DROP_CORPSE) && (r_ptr->flags & RF_DROP_SKELETON))
{
/* Wipe the object */
object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_SKELETON));
/* Unique corpses are unique */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
object_aware(i_ptr);
i_ptr->name1 = 201;
@@ -2469,15 +2401,14 @@ static void monster_death_gods(int m_idx, monster_type *m_ptr)
*/
void monster_death(int m_idx)
{
- int dump_item = 0;
- int dump_gold = 0;
+ auto const &d_info = game->edit_data.d_info;
+ auto const &f_info = game->edit_data.f_info;
+ auto &a_info = game->edit_data.a_info;
monster_type *m_ptr = &m_list[m_idx];
auto const r_ptr = m_ptr->race();
- bool_ visible = (m_ptr->ml || (r_ptr->flags1 & (RF1_UNIQUE)));
-
bool_ create_stairs = FALSE;
int force_coin = get_coin_type(r_ptr);
@@ -2524,7 +2455,7 @@ void monster_death(int m_idx)
}
/* If the doppleganger die, the variable must be set accordingly */
- if (r_ptr->flags9 & RF9_DOPPLEGANGER) doppleganger = 0;
+ if (r_ptr->flags & RF_DOPPLEGANGER) doppleganger = 0;
/* Need copy of object list since we're going to mutate it */
auto const object_idxs(m_ptr->hold_o_idxs);
@@ -2547,9 +2478,6 @@ void monster_death(int m_idx)
/* Delete the object */
delete_object_idx(this_o_idx);
- if (q_ptr->tval == TV_GOLD) dump_gold++;
- else dump_item++;
-
/* Drop it */
drop_near(q_ptr, -1, y, x);
}
@@ -2571,31 +2499,41 @@ void monster_death(int m_idx)
/* Mega-Hack -- Name the sword */
- q_ptr->art_name = quark_add("'Stormbringer'");
+ q_ptr->artifact_name = "'Stormbringer'";
q_ptr->to_h = 16;
q_ptr->to_d = 16;
q_ptr->ds = 6;
q_ptr->dd = 6;
q_ptr->pval = 2;
- q_ptr->art_flags1 |= ( TR1_VAMPIRIC | TR1_STR | TR1_CON | TR1_BLOWS );
- q_ptr->art_flags2 |= ( TR2_FREE_ACT | TR2_HOLD_LIFE |
- TR2_RES_NEXUS | TR2_RES_CHAOS | TR2_RES_NETHER |
- TR2_RES_CONF ); /* No longer resist_disen */
- q_ptr->art_flags3 |= ( TR3_IGNORE_ACID | TR3_IGNORE_ELEC |
- TR3_IGNORE_FIRE | TR3_IGNORE_COLD);
- /* Just to be sure */
-
- q_ptr->art_flags3 |= TR3_NO_TELE; /* How's that for a downside? */
+ q_ptr->art_flags |=
+ TR_VAMPIRIC |
+ TR_STR |
+ TR_CON |
+ TR_BLOWS |
+ TR_FREE_ACT |
+ TR_HOLD_LIFE |
+ TR_RES_NEXUS |
+ TR_RES_CHAOS |
+ TR_RES_NETHER |
+ TR_RES_CONF |
+ TR_IGNORE_ACID |
+ TR_IGNORE_ELEC |
+ TR_IGNORE_FIRE |
+ TR_IGNORE_COLD |
+ TR_NO_TELE |
+ TR_CURSED |
+ TR_HEAVY_CURSE;
- /* For game balance... */
- q_ptr->art_flags3 |= (TR3_CURSED | TR3_HEAVY_CURSE);
q_ptr->ident |= IDENT_CURSED;
-
if (randint(2) == 1)
- q_ptr->art_flags3 |= (TR3_DRAIN_EXP);
+ {
+ q_ptr->art_flags |= TR_DRAIN_EXP;
+ }
else
- q_ptr->art_flags3 |= (TR3_AGGRAVATE);
+ {
+ q_ptr->art_flags |= TR_AGGRAVATE;
+ }
q_ptr->found = OBJ_FOUND_MONSTER;
q_ptr->found_aux1 = m_ptr->r_idx;
@@ -2650,7 +2588,7 @@ void monster_death(int m_idx)
else if (strstr(r_ptr->name, "Unmaker"))
{
int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
- (void)project(m_idx, 6, y, x, 100, GF_CHAOS, flg);
+ project(m_idx, 6, y, x, 100, GF_CHAOS, flg);
}
/* Pink horrors are replaced with 2 Blue horrors */
else if (strstr(r_ptr->name, "ink horror"))
@@ -2678,7 +2616,7 @@ void monster_death(int m_idx)
}
/* Mega-Hack -- drop "winner" treasures */
- else if (r_ptr->flags1 & (RF1_DROP_CHOSEN))
+ else if (r_ptr->flags & RF_DROP_CHOSEN)
{
if (strstr(r_ptr->name, "Morgoth, Lord of Darkness"))
{
@@ -2740,7 +2678,7 @@ void monster_death(int m_idx)
/* Drop it in the dungeon */
drop_near(q_ptr, -1, y, x);
}
- else if (r_ptr->flags7 & RF7_NAZGUL)
+ else if (r_ptr->flags & RF_NAZGUL)
{
/* Get local object */
q_ptr = &forge;
@@ -2757,7 +2695,7 @@ void monster_death(int m_idx)
create_artifact(q_ptr, TRUE, FALSE);
/* Save the inscription */
- q_ptr->art_name = quark_add(format("of %s", r_ptr->name));
+ q_ptr->artifact_name = fmt::format("of {}", r_ptr->name);
q_ptr->found = OBJ_FOUND_MONSTER;
q_ptr->found_aux1 = m_ptr->r_idx;
@@ -2770,46 +2708,14 @@ void monster_death(int m_idx)
}
else
{
- byte a_idx = 0;
- int chance = 0;
- int I_kind = 0;
-
- if (strstr(r_ptr->name, "Marda, rider of the Gold Laronth"))
- {
- a_idx = ART_MARDA;
- chance = 50;
- }
- else if (strstr(r_ptr->name, "Saruman of Many Colours"))
- {
- a_idx = ART_PALANTIR;
- chance = 30;
- }
- else if (strstr(r_ptr->name, "Hagen, son of Alberich"))
- {
- a_idx = ART_NIMLOTH;
- chance = 66;
- }
- else if (strstr(r_ptr->name, "Durin's Bane"))
- {
- a_idx = ART_CALRIS;
- chance = 60;
- }
- else if (strstr(r_ptr->name, "Gothmog, the High Captain of Balrogs"))
- {
- a_idx = ART_GOTHMOG;
- chance = 50;
- }
- else if (strstr(r_ptr->name, "Eol, the Dark Elf"))
- {
- a_idx = ART_ANGUIREL;
- chance = 50;
- }
+ byte a_idx = r_ptr->artifact_idx;
+ int chance = r_ptr->artifact_chance;
if ((a_idx > 0) && ((randint(99) < chance) || (wizard)))
{
if (a_info[a_idx].cur_num == 0)
{
- artifact_type *a_ptr = &a_info[a_idx];
+ auto a_ptr = &a_info[a_idx];
/* Get local object */
q_ptr = &forge;
@@ -2818,7 +2724,7 @@ void monster_death(int m_idx)
object_wipe(q_ptr);
/* Acquire the "kind" index */
- I_kind = lookup_kind(a_ptr->tval, a_ptr->sval);
+ int I_kind = lookup_kind(a_ptr->tval, a_ptr->sval);
/* Create the artifact */
object_prep(q_ptr, I_kind);
@@ -2837,7 +2743,7 @@ void monster_death(int m_idx)
q_ptr->weight = a_ptr->weight;
/* Hack -- acquire "cursed" flag */
- if (a_ptr->flags3 & (TR3_CURSED)) q_ptr->ident |= (IDENT_CURSED);
+ if (a_ptr->flags & TR_CURSED) q_ptr->ident |= (IDENT_CURSED);
random_artifact_resistance(q_ptr);
@@ -2857,7 +2763,7 @@ void monster_death(int m_idx)
}
/* Hack - the protected monsters must be advanged */
- else if (r_ptr->flags9 & RF9_WYRM_PROTECT)
+ else if (r_ptr->flags & RF_WYRM_PROTECT)
{
int xx = x, yy = y;
int attempts = 100;
@@ -2995,13 +2901,6 @@ void monster_death(int m_idx)
if ((!force_coin) && (magik(10 + get_skill_scale(SKILL_PRESERVATION, 75))) && (!(m_ptr->mflag & MFLAG_NO_DROP)))
place_corpse(m_ptr);
- /* Take note of any dropped treasure */
- if (visible && (dump_item || dump_gold))
- {
- /* Take notes on treasure */
- lore_treasure(m_idx, dump_item, dump_gold);
- }
-
/* Create a magical staircase */
if (create_stairs && (dun_level < d_info[dungeon_type].maxdepth))
{
@@ -3009,7 +2908,7 @@ void monster_death(int m_idx)
{
for (int j = -1; j <= 1; j++)
{
- if (!(f_info[cave[y + j][x + i].feat].flags1 & FF1_PERMANENT))
+ if (!(f_info[cave[y + j][x + i].feat].flags & FF_PERMANENT))
{
cave_set_feat(y + j, x + i, d_info[dungeon_type].floor1);
}
@@ -3082,7 +2981,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
if (health_who == m_idx) p_ptr->redraw |= (PR_FRAME);
/* Some mosnters are immune to death */
- if (r_ptr->flags7 & RF7_NO_DEATH) return FALSE;
+ if (r_ptr->flags & RF_NO_DEATH) return FALSE;
/* Wake it up */
m_ptr->csleep = 0;
@@ -3106,7 +3005,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
/* Extract monster name */
monster_desc(m_name, m_ptr, 0);
- if ((r_ptr->flags7 & RF7_DG_CURSE) && (randint(2) == 1))
+ if ((r_ptr->flags & RF_DG_CURSE) && (randint(2) == 1))
{
int curses = 2 + randint(5);
@@ -3120,7 +3019,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
while (--curses);
}
- if (r_ptr->flags2 & (RF2_CAN_SPEAK))
+ if (r_ptr->flags & RF_CAN_SPEAK)
{
char line_got[80];
/* Dump a message */
@@ -3129,10 +3028,6 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
msg_format("%^s says: %s", m_name, line_got);
}
-
- /* Make a sound */
- sound(SOUND_KILL);
-
/* Death by Missile/Spell attack */
if (note)
{
@@ -3146,10 +3041,10 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
}
/* Death by Physical attack -- non-living monster */
- else if ((r_ptr->flags3 & (RF3_DEMON)) ||
- (r_ptr->flags3 & (RF3_UNDEAD)) ||
- (r_ptr->flags2 & (RF2_STUPID)) ||
- (r_ptr->flags3 & (RF3_NONLIVING)) ||
+ else if ((r_ptr->flags & RF_DEMON) ||
+ (r_ptr->flags & RF_UNDEAD) ||
+ (r_ptr->flags & RF_STUPID) ||
+ (r_ptr->flags & RF_NONLIVING) ||
(strchr("Evg", r_ptr->d_char)))
{
cmsg_format(TERM_L_RED, "You have destroyed %s.", m_name);
@@ -3190,15 +3085,12 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
if (!note)
{
- object_type *o_ptr;
- u32b f1, f2, f3, f4, f5, esp;
-
/* Access the weapon */
- o_ptr = &p_ptr->inventory[INVEN_WIELD];
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
+ object_type *o_ptr = &p_ptr->inventory[INVEN_WIELD];
+ auto const flags = object_flags(o_ptr);
/* Can the weapon gain levels ? */
- if ((o_ptr->k_idx) && (f4 & TR4_LEVELS))
+ if ((o_ptr->k_idx) && (flags & TR_LEVELS))
{
/* Give some experience for the kill */
const int new_exp = ((long)r_ptr->mexp * m_ptr->level) / (div * 2);
@@ -3210,7 +3102,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
}
/* When the player kills a Unique, it stays dead */
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
r_ptr->max_num = 0;
}
@@ -3219,7 +3111,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
monster_death(m_idx);
/* Eru doesn't appreciate good monster death */
- if (r_ptr->flags3 & RF3_GOOD)
+ if (r_ptr->flags & RF_GOOD)
{
inc_piety(GOD_ERU, -7 * m_ptr->level);
inc_piety(GOD_MANWE, -10 * m_ptr->level);
@@ -3231,7 +3123,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
}
/* Manwe appreciate evil monster death */
- if (r_ptr->flags3 & RF3_EVIL)
+ if (r_ptr->flags & RF_EVIL)
{
int inc = std::max(1, m_ptr->level / 2);
@@ -3247,7 +3139,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
if (praying_to(GOD_TULKAS))
{
inc_piety(GOD_TULKAS, inc / 2);
- if (r_ptr->flags3 & RF3_DEMON)
+ if (r_ptr->flags & RF_DEMON)
{
inc_piety(GOD_TULKAS, inc);
}
@@ -3255,7 +3147,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
}
/* Yavanna likes when corruption is destroyed */
- if ((r_ptr->flags3 & RF3_NONLIVING) || (r_ptr->flags3 & RF3_DEMON) || (r_ptr->flags3 & RF3_UNDEAD))
+ if ((r_ptr->flags & RF_NONLIVING) || (r_ptr->flags & RF_DEMON) || (r_ptr->flags & RF_UNDEAD))
{
int inc = std::max(1, m_ptr->level / 2);
inc_piety(GOD_YAVANNA, inc);
@@ -3268,12 +3160,12 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
inc_piety(GOD_YAVANNA, -inc);
/* Killing animals in her name is a VERY bad idea */
- if (r_ptr->flags3 & RF3_ANIMAL)
+ if (r_ptr->flags & RF_ANIMAL)
inc_piety(GOD_YAVANNA, -(inc * 3));
}
/* SHould we absorb its soul? */
- if (p_ptr->absorb_soul && (!(r_ptr->flags3 & RF3_UNDEAD)) && (!(r_ptr->flags3 & RF3_NONLIVING)))
+ if (p_ptr->absorb_soul && (!(r_ptr->flags & RF_UNDEAD)) && (!(r_ptr->flags & RF_NONLIVING)))
{
msg_print("You absorb the life of the dying soul.");
hp_player(1 + (m_ptr->level / 2) + get_skill_scale(SKILL_NECROMANCY, 40));
@@ -3283,7 +3175,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
* XXX XXX XXX Mega-Hack -- Remove random quest rendered
* impossible
*/
- if (r_ptr->flags1 & (RF1_UNIQUE))
+ if (r_ptr->flags & RF_UNIQUE)
{
int i;
@@ -3311,7 +3203,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
}
/* Make note of unique kills */
- if (r_ptr->flags1 & RF1_UNIQUE)
+ if (r_ptr->flags & RF_UNIQUE)
{
char note[80];
@@ -3322,14 +3214,11 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
}
/* Recall even invisible uniques or winners */
- if (m_ptr->ml || (r_ptr->flags1 & (RF1_UNIQUE)))
+ if (m_ptr->ml || (r_ptr->flags & RF_UNIQUE))
{
/* Count kills this life */
if (r_ptr->r_pkills < MAX_SHORT) r_ptr->r_pkills++;
- /* Count kills in all lives */
- if (r_ptr->r_tkills < MAX_SHORT) r_ptr->r_tkills++;
-
/* Hack -- Auto-recall */
monster_race_track(m_ptr->r_idx, m_ptr->ego);
}
@@ -3366,7 +3255,7 @@ void get_screen_size(int *wid_p, int *hgt_p)
* Calculates current boundaries
* Called below.
*/
-static void panel_bounds(void)
+static void panel_bounds()
{
int wid, hgt;
@@ -3449,7 +3338,7 @@ bool_ change_panel(int dy, int dx)
*
* The map is reprinted if necessary, and "TRUE" is returned.
*/
-void verify_panel(void)
+void verify_panel()
{
int y = p_ptr->py;
int x = p_ptr->px;
@@ -3488,7 +3377,7 @@ void verify_panel(void)
if (max_pcol_min < 0) max_pcol_min = 0;
/* An option: center on player */
- if (center_player)
+ if (options->center_player)
{
/* Center vertically */
prow_min = y - panel_hgt;
@@ -3562,7 +3451,10 @@ void verify_panel(void)
panel_col_min = pcol_min;
/* Hack -- optional disturb on "panel change" */
- if (disturb_panel && !center_player) disturb(0);
+ if (options->disturb_panel && !options->center_player)
+ {
+ disturb();
+ }
/* Recalculate the boundaries */
panel_bounds();
@@ -3581,7 +3473,7 @@ void verify_panel(void)
/*
* Map resizing whenever the main term changes size
*/
-void resize_map(void)
+void resize_map()
{
/* Only if the dungeon exists */
if (!character_dungeon) return;
@@ -3630,7 +3522,7 @@ void resize_map(void)
/*
* Redraw a term when it is resized
*/
-void resize_window(void)
+void resize_window()
{
/* Only if the dungeon exists */
if (!character_dungeon) return;
@@ -3669,9 +3561,9 @@ static cptr look_mon_desc(int m_idx)
/* Determine if the monster is "living" (vs "undead") */
monster_type *m_ptr = &m_list[m_idx];
auto const r_ptr = m_ptr->race();
- if (r_ptr->flags3 & (RF3_UNDEAD)) living = FALSE;
- if (r_ptr->flags3 & (RF3_DEMON)) living = FALSE;
- if (r_ptr->flags3 & (RF3_NONLIVING)) living = FALSE;
+ if (r_ptr->flags & RF_UNDEAD) living = FALSE;
+ if (r_ptr->flags & RF_DEMON) living = FALSE;
+ if (r_ptr->flags & RF_NONLIVING) living = FALSE;
if (strchr("Egv", r_ptr->d_char)) living = FALSE;
@@ -3706,81 +3598,6 @@ static cptr look_mon_desc(int m_idx)
-/*
- * Current "comp" function for ang_sort()
- */
-static bool_ (*ang_sort_comp)(vptr u, vptr v, int a, int b) = nullptr;
-
-/*
- * Current "swap" function for ang_sort()
- */
-static void (*ang_sort_swap)(vptr u, vptr v, int a, int b) = nullptr;
-
-
-
-/*
- * Angband sorting algorithm -- quick sort in place
- *
- * Note that the details of the data we are sorting is hidden,
- * and we rely on the "ang_sort_comp()" and "ang_sort_swap()"
- * function hooks to interact with the data, which is given as
- * two pointers, and which may have any user-defined form.
- */
-static void ang_sort_aux(vptr u, vptr v, int p, int q)
-{
- int z, a, b;
-
- /* Done sort */
- if (p >= q) return;
-
- /* Pivot */
- z = p;
-
- /* Begin */
- a = p;
- b = q;
-
- /* Partition */
- while (TRUE)
- {
- /* Slide i2 */
- while (!(*ang_sort_comp)(u, v, b, z)) b--;
-
- /* Slide i1 */
- while (!(*ang_sort_comp)(u, v, z, a)) a++;
-
- /* Done partition */
- if (a >= b) break;
-
- /* Swap */
- (*ang_sort_swap)(u, v, a, b);
-
- /* Advance */
- a++, b--;
- }
-
- /* Recurse left side */
- ang_sort_aux(u, v, p, b);
-
- /* Recurse right side */
- ang_sort_aux(u, v, b + 1, q);
-}
-
-
-/*
- * Angband sorting algorithm -- quick sort in place
- *
- * Note that the details of the data we are sorting is hidden,
- * and we rely on the "ang_sort_comp()" and "ang_sort_swap()"
- * function hooks to interact with the data, which is given as
- * two pointers, and which may have any user-defined form.
- */
-static void ang_sort(vptr u, vptr v, int n)
-{
- /* Sort the array */
- ang_sort_aux(u, v, 0, n - 1);
-}
-
/*** Targetting Code ***/
@@ -3802,6 +3619,8 @@ static void ang_sort(vptr u, vptr v, int n)
*/
static bool target_able(int m_idx)
{
+ auto const &r_info = game->edit_data.r_info;
+
monster_type *m_ptr = &m_list[m_idx];
/* Monster must be alive */
@@ -3820,7 +3639,7 @@ static bool target_able(int m_idx)
if (is_friend(m_ptr) > 0) return (FALSE);
/* Honor flag */
- if (r_info[m_ptr->r_idx].flags7 & RF7_NO_TARGET) return (FALSE);
+ if (r_info[m_ptr->r_idx].flags & RF_NO_TARGET) return (FALSE);
/* XXX XXX XXX Hack -- Never target trappers */
/* if (CLEAR_ATTR && (CLEAR_CHAR)) return (FALSE); */
@@ -3837,7 +3656,7 @@ static bool target_able(int m_idx)
*
* We return TRUE if the target is "okay" and FALSE otherwise.
*/
-bool_ target_okay(void)
+bool_ target_okay()
{
/* Accept stationary targets */
if (target_who < 0) return (TRUE);
@@ -3866,108 +3685,37 @@ bool_ target_okay(void)
/*
- * Sorting hook -- comp function -- by "distance to player"
- *
- * We use "u" and "v" to point to arrays of "x" and "y" positions,
- * and sort the arrays by double-distance to the player.
- */
-static bool_ ang_sort_comp_distance(vptr u, vptr v, int a, int b)
-{
- byte *x = (byte*)(u);
- byte *y = (byte*)(v);
-
- int da, db, kx, ky;
-
- /* Absolute distance components */
- kx = x[a];
- kx -= p_ptr->px;
- kx = ABS(kx);
- ky = y[a];
- ky -= p_ptr->py;
- ky = ABS(ky);
-
- /* Approximate Double Distance to the first point */
- da = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx));
-
- /* Absolute distance components */
- kx = x[b];
- kx -= p_ptr->px;
- kx = ABS(kx);
- ky = y[b];
- ky -= p_ptr->py;
- ky = ABS(ky);
-
- /* Approximate Double Distance to the first point */
- db = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx));
-
- /* Compare the distances */
- return (da <= db);
-}
-
-
-/*
- * Sorting hook -- swap function -- by "distance to player"
- *
- * We use "u" and "v" to point to arrays of "x" and "y" positions,
- * and sort the arrays by distance to the player.
- */
-static void ang_sort_swap_distance(vptr u, vptr v, int a, int b)
-{
- byte *x = (byte*)(u);
- byte *y = (byte*)(v);
-
- byte temp;
-
- /* Swap "x" */
- temp = x[a];
- x[a] = x[b];
- x[b] = temp;
-
- /* Swap "y" */
- temp = y[a];
- y[a] = y[b];
- y[b] = temp;
-}
-
-
-
-/*
* Hack -- help "select" a location (see below)
*/
-static s16b target_pick(int y1, int x1, int dy, int dx)
+static s16b target_pick(point p, int dy, int dx, std::vector<point> const &points)
{
- int i, v;
-
- int x2, y2, x3, y3, x4, y4;
-
int b_i = -1, b_v = 9999;
-
/* Scan the locations */
- for (i = 0; i < temp_n; i++)
+ for (std::size_t i = 0; i < points.size(); i++)
{
/* Point 2 */
- x2 = temp_x[i];
- y2 = temp_y[i];
+ int x2 = points[i].x();
+ int y2 = points[i].y();
/* Directed distance */
- x3 = (x2 - x1);
- y3 = (y2 - y1);
+ int x3 = (x2 - p.x());
+ int y3 = (y2 - p.y());
/* Verify quadrant */
if (dx && (x3 * dx <= 0)) continue;
if (dy && (y3 * dy <= 0)) continue;
/* Absolute distance */
- x4 = ABS(x3);
- y4 = ABS(y3);
+ int x4 = ABS(x3);
+ int y4 = ABS(y3);
/* Verify quadrant */
if (dy && !dx && (x4 > y4)) continue;
if (dx && !dy && (y4 > x4)) continue;
/* Approximate Double Distance */
- v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4));
+ int v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4));
/* XXX XXX XXX Penalize location */
@@ -3989,6 +3737,9 @@ static s16b target_pick(int y1, int x1, int dy, int dx)
*/
static bool_ target_set_accept(int y, int x)
{
+ auto const &r_info = game->edit_data.r_info;
+ auto const &f_info = game->edit_data.f_info;
+
/* Player grid is always interesting */
if ((y == p_ptr->py) && (x == p_ptr->px)) return (TRUE);
@@ -4001,7 +3752,7 @@ static bool_ target_set_accept(int y, int x)
cave_type *c_ptr = &cave[y][x];
/* Visible monsters */
- if (c_ptr->m_idx && c_ptr->m_idx < max_r_idx)
+ if (c_ptr->m_idx && c_ptr->m_idx < static_cast<int>(r_info.size()))
{
monster_type *m_ptr = &m_list[c_ptr->m_idx];
@@ -4025,9 +3776,6 @@ static bool_ target_set_accept(int y, int x)
/* Interesting memorized features */
if (c_ptr->info & (CAVE_MARK))
{
- /* Traps are interesting */
- if (c_ptr->info & (CAVE_TRDT)) return (TRUE);
-
/* Hack -- Doors are boring */
if (c_ptr->feat == FEAT_OPEN) return (FALSE);
if (c_ptr->feat == FEAT_BROKEN) return (FALSE);
@@ -4035,7 +3783,7 @@ static bool_ target_set_accept(int y, int x)
(c_ptr->feat <= FEAT_DOOR_TAIL)) return (FALSE);
/* Accept 'naturally' interesting features */
- if (f_info[c_ptr->feat].flags1 & FF1_NOTICE) return (TRUE);
+ if (f_info[c_ptr->feat].flags & FF_NOTICE) return (TRUE);
}
/* Nope */
@@ -4048,39 +3796,42 @@ static bool_ target_set_accept(int y, int x)
*
* Return the number of target_able monsters in the set.
*/
-static void target_set_prepare(int mode)
+static std::vector<point> target_set_prepare(int mode)
{
- int y, x;
+ std::vector<point> points;
- /* Reset "temp" array */
- temp_n = 0;
-
- /* Scan the current panel */
- for (y = panel_row_min; y <= panel_row_max; y++)
+ // Scan the current panel
+ for (int y = panel_row_min; y <= panel_row_max; y++)
{
- for (x = panel_col_min; x <= panel_col_max; x++)
+ for (int x = panel_col_min; x <= panel_col_max; x++)
{
cave_type *c_ptr = &cave[y][x];
- /* Require "interesting" contents */
+ // Require "interesting" contents
if (!target_set_accept(y, x)) continue;
- /* Require target_able monsters for "TARGET_KILL" */
+ // Require target_able monsters for "TARGET_KILL"
if ((mode & (TARGET_KILL)) && !target_able(c_ptr->m_idx)) continue;
- /* Save the location */
- temp_x[temp_n] = x;
- temp_y[temp_n] = y;
- temp_n++;
+ // Save the location
+ points.push_back(point(x,y));
}
}
- /* Set the sort hooks */
- ang_sort_comp = ang_sort_comp_distance;
- ang_sort_swap = ang_sort_swap_distance;
+ // Sort the points by distance to player; we'll
+ // use a stable sort to avoid equidistant targets
+ // "swapping" priorities.
+ std::stable_sort(
+ std::begin(points),
+ std::end(points),
+ [](point i, point j) -> bool {
+ auto di = distance(p_ptr->py, p_ptr->px, i.y(), i.x());
+ auto dj = distance(p_ptr->py, p_ptr->px, j.y(), j.x());
+ return di < dj;
+ }
+ );
- /* Sort the positions */
- ang_sort(temp_x, temp_y, temp_n);
+ return points;
}
@@ -4142,6 +3893,12 @@ bool_ target_object(int y, int x, int mode, cptr info, bool_ *boring,
*/
static int target_set_aux(int y, int x, int mode, cptr info)
{
+ auto const &d_info = game->edit_data.d_info;
+ auto const &st_info = game->edit_data.st_info;
+ auto const &wf_info = game->edit_data.wf_info;
+ auto const &f_info = game->edit_data.f_info;
+ auto const &k_info = game->edit_data.k_info;
+
cave_type *c_ptr = &cave[y][x];
cptr s1, s2, s3;
@@ -4206,7 +3963,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
auto const r_ptr = m_ptr->race();
/* Mimics special treatment -- looks like an object */
- if ((r_ptr->flags9 & RF9_MIMIC) && (m_ptr->csleep))
+ if ((r_ptr->flags & RF_MIMIC) && (m_ptr->csleep))
{
/* Acquire object */
object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()];
@@ -4254,7 +4011,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
Term_save();
/* Recall on screen */
- screen_roff(m_ptr->r_idx, m_ptr->ego, 0);
+ screen_roff(m_ptr->r_idx, m_ptr->ego);
/* Hack -- Complete the prompt (again) */
Term_addstr( -1, TERM_WHITE, format(" [r,%s]", info));
@@ -4329,8 +4086,8 @@ static int target_set_aux(int y, int x, int mode, cptr info)
s1 = "It is ";
/* Hack -- take account of gender */
- if (r_ptr->flags1 & (RF1_FEMALE)) s1 = "She is ";
- else if (r_ptr->flags1 & (RF1_MALE)) s1 = "He is ";
+ if (r_ptr->flags & RF_FEMALE) s1 = "She is ";
+ else if (r_ptr->flags & RF_MALE) s1 = "He is ";
/* Use a preposition */
s2 = "carrying ";
@@ -4404,34 +4161,6 @@ static int target_set_aux(int y, int x, int mode, cptr info)
}
}
- /* Actual traps */
- if ((c_ptr->info & (CAVE_TRDT)) && c_ptr->t_idx)
- {
- cptr name = "a trap", s4;
-
- /* Name trap */
- if (t_info[c_ptr->t_idx].ident)
- {
- s4 = format("(%s)", t_info[c_ptr->t_idx].name);
- }
- else
- {
- s4 = "an unknown trap";
- }
-
- /* Display a message */
- sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name, s4);
- prt(out_val, 0, 0);
- move_cursor_relative(y, x);
- query = inkey();
-
- /* Stop on everything but "return" */
- if ((query != '\r') && (query != '\n')) break;
-
- /* Repeat forever */
- continue;
- }
-
/* Feature (apply "mimic") */
if (c_ptr->mimic)
{
@@ -4452,7 +4181,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
/* Terrain feature if needed */
if (boring || (feat >= FEAT_GLYPH))
{
- cptr name;
+ std::string name;
/* Hack -- special handling for building doors */
if (feat == FEAT_SHOP)
@@ -4494,10 +4223,11 @@ static int target_set_aux(int y, int x, int mode, cptr info)
if (p_ptr->wild_mode && (feat == FEAT_TOWN))
{
+ auto const &wilderness = game->wilderness;
+ auto const &wf = wf_info[wilderness(x, y).feat];
+
s3 = "";
- name = format("%s(%s)",
- wf_info[wild_map[y][x].feat].name,
- wf_info[wild_map[y][x].feat].text);
+ name = fmt::format("{}({})", wf.name, wf.text);
}
if ((feat == FEAT_FOUNTAIN) && (c_ptr->info & CAVE_IDNT))
@@ -4521,12 +4251,12 @@ static int target_set_aux(int y, int x, int mode, cptr info)
/* Display a message */
if (!wizard)
{
- sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name, info);
+ sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name.c_str(), info);
}
else
{
sprintf(out_val, "%s%s%s%s [%s] (%d:%d:%d)",
- s1, s2, s3, name, info,
+ s1, s2, s3, name.c_str(), info,
c_ptr->feat, c_ptr->mimic, c_ptr->special);
}
prt(out_val, 0, 0);
@@ -4603,8 +4333,6 @@ bool_ target_set(int mode)
char info[80];
- cave_type *c_ptr;
-
int screen_wid, screen_hgt;
int panel_wid, panel_hgt;
@@ -4624,7 +4352,7 @@ bool_ target_set(int mode)
/* Prepare the "temp" array */
- target_set_prepare(mode);
+ std::vector<point> points = target_set_prepare(mode);
/* Start near the player */
m = 0;
@@ -4633,13 +4361,13 @@ bool_ target_set(int mode)
while (!done)
{
/* Interesting grids */
- if (flag && temp_n)
+ if (flag && points.size())
{
- y = temp_y[m];
- x = temp_x[m];
+ y = points[m].y();
+ x = points[m].x();
/* Access */
- c_ptr = &cave[y][x];
+ cave_type *c_ptr = &cave[y][x];
/* Allow target */
if (target_able(c_ptr->m_idx))
@@ -4696,7 +4424,7 @@ bool_ target_set(int mode)
case '*':
case '+':
{
- if (++m == temp_n)
+ if (++m == points.size())
{
m = 0;
}
@@ -4707,7 +4435,7 @@ bool_ target_set(int mode)
{
if (m-- == 0)
{
- m = temp_n - 1;
+ m = points.size() - 1;
}
break;
}
@@ -4763,7 +4491,7 @@ bool_ target_set(int mode)
if (d)
{
/* Find a new monster */
- i = target_pick(temp_y[m], temp_x[m], ddy[d], ddx[d]);
+ i = target_pick(points[m], ddy[d], ddx[d], points);
/* Scroll to find interesting grid */
if (i < 0)
@@ -4777,14 +4505,13 @@ bool_ target_set(int mode)
/* Note panel change */
if (change_panel(dy, dx))
{
- int ty = temp_y[m];
- int tx = temp_x[m];
+ auto const t = points[m];
/* Recalculate interesting grids */
target_set_prepare(mode);
/* Find a new monster */
- i = target_pick(ty, tx, dy, dx);
+ i = target_pick(t, dy, dx, points);
/* Restore panel if needed */
if (i < 0)
@@ -4806,9 +4533,6 @@ bool_ target_set(int mode)
/* Arbitrary grids */
else
{
- /* Access */
- c_ptr = &cave[y][x];
-
/* Default prompt */
strcpy(info, "q,t,p,m,+,-,'dir'");
@@ -4936,9 +4660,6 @@ bool_ target_set(int mode)
}
}
- /* Forget */
- temp_n = 0;
-
/* Clear the top line */
prt("", 0, 0);
@@ -5003,7 +4724,10 @@ bool_ get_aim_dir(int *dp)
dir = command_dir;
/* Hack -- auto-target if requested */
- if (use_old_target && target_okay()) dir = 5;
+ if (options->use_old_target && target_okay())
+ {
+ dir = 5;
+ }
/* Ask until satisfied */
while (!dir)
@@ -5250,19 +4974,22 @@ void set_grace(s32b v)
static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge, const char *what)
{
- int i, j, jb, save_aware;
+ auto &k_info = game->edit_data.k_info;
+ auto const &e_info = game->edit_data.e_info;
+
+ int save_aware;
char buf[200];
/* try all objects, this *IS* a very ugly and slow method :( */
- for (i = 0; i < max_k_idx; i++)
+ for (std::size_t i = 0; i < k_info.size(); i++)
{
- object_kind *k_ptr = &k_info[i];
+ auto k_ptr = &k_info[i];
o_ptr = forge;
if (!k_ptr->name) continue;
- if (k_ptr->flags3 & TR3_NORM_ART) continue;
- if (k_ptr->flags3 & TR3_INSTA_ART) continue;
+ if (k_ptr->flags & TR_NORM_ART) continue;
+ if (k_ptr->flags & TR_INSTA_ART) continue;
if (k_ptr->tval == TV_GOLD) continue;
object_prep(o_ptr, i);
@@ -5282,9 +5009,9 @@ static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge
(o_ptr->tval == TV_ROD_MAIN && strstr(name, "rod of")))
{
/* try all ego */
- for (j = max_e_idx - 1; j >= 0; j--)
+ for (std::size_t j = 0; j < e_info.size(); j++)
{
- ego_item_type *e_ptr = &e_info[j];
+ auto e_ptr = &e_info[j];
bool_ ok = FALSE;
if (j && !e_ptr->name) continue;
@@ -5310,9 +5037,9 @@ static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge
}
/* try all ego */
- for (jb = max_e_idx - 1; jb >= 0; jb--)
+ for (std::size_t jb = 0; jb < e_info.size(); jb++)
{
- ego_item_type *eb_ptr = &e_info[jb];
+ auto eb_ptr = &e_info[jb];
bool_ ok = FALSE;
if (jb && !eb_ptr->name) continue;
@@ -5403,13 +5130,17 @@ static void clean_wish_name(char *buf, char *name)
/*
* Allow the player to make a wish
*/
-void make_wish(void)
+void make_wish()
{
- char buf[200], name[200], *mname;
- int i, j, mstatus = MSTATUS_ENEMY;
+ auto const &re_info = game->edit_data.re_info;
+ auto const &r_info = game->edit_data.r_info;
+
+ char name[200], *mname;
+ int mstatus = MSTATUS_ENEMY;
object_type forge, *o_ptr = &forge;
/* Make an empty string */
+ char buf[200];
buf[0] = 0;
/* Ask for the wish */
@@ -5461,16 +5192,20 @@ void make_wish(void)
else mstatus = MSTATUS_PET;
mname = name + 10;
}
- else mname = name;
- for (i = 1; i < max_r_idx; i++)
+ else
+ {
+ mname = name;
+ }
+
+ for (std::size_t i = 1; i < r_info.size(); i++)
{
- monster_race *r_ptr = &r_info[i];
+ auto r_ptr = &r_info[i];
if (!r_ptr->name) continue;
- if (r_ptr->flags9 & RF9_SPECIAL_GENE) continue;
- if (r_ptr->flags9 & RF9_NEVER_GENE) continue;
- if (r_ptr->flags1 & RF1_UNIQUE) continue;
+ if (r_ptr->flags & RF_SPECIAL_GENE) continue;
+ if (r_ptr->flags & RF_NEVER_GENE) continue;
+ if (r_ptr->flags & RF_UNIQUE) continue;
sprintf(buf, "%s", r_ptr->name);
strlower(buf);
@@ -5478,9 +5213,9 @@ void make_wish(void)
if (strstr(mname, buf))
{
/* try all ego */
- for (j = max_re_idx - 1; j >= 0; j--)
+ for (std::size_t j = 0; j < re_info.size(); j++)
{
- monster_ego *re_ptr = &re_info[j];
+ auto re_ptr = &re_info[j];
if (j && !re_ptr->name) continue;
@@ -5501,6 +5236,7 @@ void make_wish(void)
{
sprintf(buf, "%s", r_ptr->name);
}
+
strlower(buf);
if (iequals(mname, buf))
@@ -5516,7 +5252,9 @@ void make_wish(void)
/* Create the monster */
if (place_monster_one(wy, wx, i, j, FALSE, mstatus))
+ {
msg_print("Your wish becomes truth!");
+ }
/* Don't search any more */
return;
@@ -5531,7 +5269,7 @@ void make_wish(void)
* Corrupted have a 1/3 chance of losing a mutation each time this is called,
* assuming they have any in the first place
*/
-static void corrupt_corrupted(void)
+static void corrupt_corrupted()
{
if (magik(45))
{
@@ -5549,66 +5287,37 @@ static void corrupt_corrupted(void)
/*
* Change to an other subrace
*/
-void switch_subrace(int racem, bool_ copy_old)
+void switch_subrace(std::size_t racem, bool_ copy_old)
{
- if ((racem < 0) && (racem >= max_rmp_idx)) return;
+ auto &race_mod_info = game->edit_data.race_mod_info;
+
+ assert(racem < race_mod_info.size());
/* If we switch to the saved subrace, we copy over the old subrace data */
if (copy_old && (racem == SUBRACE_SAVE))
{
- // This code is very reliant on the race_mod_info
- // elements being simple PODs, in particular the
- // text pointers being *unmanaged* owned pointers.
- static_assert(std::is_pod<player_race_mod>::value,
- "This code needs reworking");
- // Keep references to owned pointers.
- auto old_title = race_mod_info[SUBRACE_SAVE].title;
- auto old_desc = race_mod_info[SUBRACE_SAVE].desc;
+ // Keep old description
+ auto old_desc = race_mod_info[SUBRACE_SAVE].description;
// Copy everything
race_mod_info[SUBRACE_SAVE] = race_mod_info[p_ptr->pracem];
- // "Undo" copy of title and description (since they're *owned* pointers)
- race_mod_info[SUBRACE_SAVE].title = old_title;
- race_mod_info[SUBRACE_SAVE].desc = old_desc;
- // Replace subrace title with the title currently held by player.
- set_subrace_title(&race_mod_info[SUBRACE_SAVE], race_mod_info[p_ptr->pracem].title);
+ // Reinstate description
+ race_mod_info[SUBRACE_SAVE].description = old_desc;
}
p_ptr->pracem = racem;
rmp_ptr = &race_mod_info[p_ptr->pracem];
}
-void set_subrace_title(player_race_mod *rmp_ptr, cptr name)
-{
- // Free old title.
- free(rmp_ptr->title);
- // Allocate copy of new title.
- rmp_ptr->title = strdup(name);
- if (!rmp_ptr->title) {
- abort();
- }
-}
-
-void set_subrace_description(player_race_mod *rmp_ptr, cptr desc)
-{
- // Free old description
- free(rmp_ptr->desc);
- // Allocate copy of new description.
- rmp_ptr->desc = strdup(desc);
- if (!rmp_ptr->desc) {
- abort();
- }
-}
-
/*
* Rebirth, recalc hp & exp/level
*/
void do_rebirth()
{
/* Experience factor */
- p_ptr->expfact = rp_ptr->r_exp + rmp_ptr->r_exp + cp_ptr->c_exp;
+ p_ptr->expfact = rp_ptr->ps.exp + rmp_ptr->ps.exp + cp_ptr->ps.exp;
/* Hitdice */
- p_ptr->hitdie = rp_ptr->r_mhp + rmp_ptr->r_mhp + cp_ptr->c_mhp;
+ p_ptr->hitdie = rp_ptr->ps.mhp + rmp_ptr->ps.mhp + cp_ptr->ps.mhp;
/* Recalc HP */
do_cmd_rerate();
diff --git a/src/xtra2.hpp b/src/xtra2.hpp
index 10d752a2..9edcec1e 100644
--- a/src/xtra2.hpp
+++ b/src/xtra2.hpp
@@ -7,90 +7,83 @@
#include <memory>
-extern void do_rebirth(void);
-extern void set_subrace_title(player_race_mod *rmp_ptr, cptr name);
-extern void set_subrace_description(player_race_mod *rmp_ptr, cptr desc);
-extern void switch_subrace(int racem, bool_ copy_old);
-extern void drop_from_wild(void);
-extern bool_ set_roots(int v, s16b ac, s16b dam);
-extern bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag);
-extern bool_ set_parasite(int v, int r);
-extern bool_ set_disrupt_shield(int v);
-extern bool_ set_prob_travel(int v);
-extern bool_ set_absorb_soul(int v);
-extern bool_ set_tim_breath(int v, bool_ magical);
-extern bool_ set_tim_precognition(int v);
-extern bool_ set_tim_deadly(int v);
-extern bool_ set_tim_reflect(int v);
-extern bool_ set_tim_thunder(int v, int p1, int p2);
-extern bool_ set_strike(int v);
-extern bool_ set_tim_regen(int v, int p);
-extern bool_ set_tim_ffall(int v);
-extern bool_ set_tim_fly(int v);
-extern bool_ set_poison(int v);
-extern bool_ set_holy(int v);
-extern void set_grace(s32b v);
-extern bool_ set_mimic(int v, int p, int level);
-extern bool_ set_no_breeders(int v);
-extern bool_ set_invis(int v,int p);
-extern bool_ set_lite(int v);
-extern bool_ set_blind(int v);
-extern bool_ set_confused(int v);
-extern bool_ set_poisoned(int v);
-extern bool_ set_afraid(int v);
-extern bool_ set_paralyzed(int v);
-extern void dec_paralyzed();
-extern bool_ set_image(int v);
-extern bool_ set_fast(int v, int p);
-extern bool_ set_light_speed(int v);
-extern bool_ set_slow(int v);
-extern bool_ set_shield(int v, int p, s16b o, s16b d1, s16b d2);
-extern bool_ set_blessed(int v);
-extern bool_ set_hero(int v);
-extern bool_ set_shero(int v);
-extern bool_ set_protevil(int v);
-extern bool_ set_protgood(int v);
-extern bool_ set_protundead(int v);
-extern bool_ set_invuln(int v);
-extern bool_ set_tim_invis(int v);
-extern bool_ set_tim_infra(int v);
-extern bool_ set_mental_barrier(int v);
-extern bool_ set_oppose_acid(int v);
-extern bool_ set_oppose_elec(int v);
-extern bool_ set_oppose_fire(int v);
-extern bool_ set_oppose_cold(int v);
-extern bool_ set_oppose_pois(int v);
-extern bool_ set_oppose_ld(int v);
-extern bool_ set_oppose_cc(int v);
-extern bool_ set_oppose_ss(int v);
-extern bool_ set_oppose_nex(int v);
-extern bool_ set_stun(int v);
-extern bool_ set_cut(int v);
-extern bool_ set_food(int v);
-extern void check_experience(void);
-extern void check_experience_obj(object_type *o_ptr);
-extern void gain_exp(s32b amount);
-extern void lose_exp(s32b amount);
-extern int get_coin_type(std::shared_ptr<monster_race const> r_ptr);
-extern void monster_death(int m_idx);
-extern bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note);
-extern bool_ change_panel(int dy, int dx);
-extern void verify_panel(void);
-extern bool_ target_okay(void);
-extern bool_ target_set(int mode);
-extern bool_ get_aim_dir(int *dp);
-extern bool_ get_rep_dir(int *dp);
-extern bool_ set_shadow(int v);
-extern bool_ set_tim_esp(int v);
-extern bool_ tgp_pt(int *x, int * y);
-extern bool_ tgt_pt (int *x, int *y);
-extern void do_poly_self(void);
-extern bool_ curse_weapon(void);
-extern bool_ curse_armor(void);
-extern void make_wish(void);
-extern void create_between_gate(int dist, int y, int x);
+void do_rebirth();
+void switch_subrace(std::size_t racem, bool_ copy_old);
+void drop_from_wild();
+bool_ set_roots(int v, s16b ac, s16b dam);
+bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag);
+bool_ set_parasite(int v, int r);
+bool_ set_disrupt_shield(int v);
+bool_ set_prob_travel(int v);
+bool_ set_absorb_soul(int v);
+bool_ set_tim_breath(int v, bool_ magical);
+bool_ set_tim_precognition(int v);
+bool_ set_tim_deadly(int v);
+bool_ set_tim_reflect(int v);
+bool_ set_tim_thunder(int v, int p1, int p2);
+bool_ set_strike(int v);
+bool_ set_tim_regen(int v, int p);
+bool_ set_tim_ffall(int v);
+bool_ set_tim_fly(int v);
+bool_ set_poison(int v);
+bool_ set_holy(int v);
+void set_grace(s32b v);
+bool_ set_mimic(int v, int p, int level);
+bool_ set_no_breeders(int v);
+bool_ set_invis(int v,int p);
+bool_ set_lite(int v);
+bool_ set_blind(int v);
+bool_ set_confused(int v);
+bool_ set_poisoned(int v);
+bool_ set_afraid(int v);
+bool_ set_paralyzed(int v);
+void dec_paralyzed();
+bool_ set_image(int v);
+bool_ set_fast(int v, int p);
+bool_ set_light_speed(int v);
+bool_ set_slow(int v);
+bool_ set_shield(int v, int p, s16b o, s16b d1, s16b d2);
+bool_ set_blessed(int v);
+bool_ set_hero(int v);
+bool_ set_shero(int v);
+bool_ set_protevil(int v);
+bool_ set_invuln(int v);
+bool_ set_tim_invis(int v);
+bool_ set_tim_infra(int v);
+bool_ set_mental_barrier(int v);
+bool_ set_oppose_acid(int v);
+bool_ set_oppose_elec(int v);
+bool_ set_oppose_fire(int v);
+bool_ set_oppose_cold(int v);
+bool_ set_oppose_pois(int v);
+bool_ set_oppose_cc(int v);
+bool_ set_stun(int v);
+bool_ set_cut(int v);
+bool_ set_food(int v);
+void check_experience();
+void check_experience_obj(object_type *o_ptr);
+void gain_exp(s32b amount);
+void lose_exp(s32b amount);
+int get_coin_type(std::shared_ptr<monster_race const> r_ptr);
+void monster_death(int m_idx);
+bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note);
+bool_ change_panel(int dy, int dx);
+void verify_panel();
+bool_ target_okay();
+bool_ target_set(int mode);
+bool_ get_aim_dir(int *dp);
+bool_ get_rep_dir(int *dp);
+bool_ set_shadow(int v);
+bool_ set_tim_esp(int v);
+bool_ tgp_pt(int *x, int * y);
+bool_ tgt_pt (int *x, int *y);
+void do_poly_self();
+bool_ curse_weapon();
+bool_ curse_armor();
+void make_wish();
+void create_between_gate(int dist, int y, int x);
extern "C" {
- extern void resize_map(void);
- extern void resize_window(void);
+ void resize_map();
+ void resize_window();
}
diff --git a/src/z-form.h b/src/z-form.h
index ac49c658..f67d1484 100644
--- a/src/z-form.h
+++ b/src/z-form.h
@@ -21,16 +21,16 @@ extern "C" {
/**** Available Functions ****/
/* Format arguments into given bounded-length buffer */
-extern uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp);
+uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp);
/* Simple interface to "vstrnfmt()" */
-extern uint strnfmt(char *buf, uint max, cptr fmt, ...);
+uint strnfmt(char *buf, uint max, cptr fmt, ...);
/* Simple interface to "vformat()" */
-extern char *format(cptr fmt, ...);
+char *format(cptr fmt, ...);
/* Vararg interface to "quit()", using "format()" */
-extern void quit_fmt(cptr fmt, ...);
+void quit_fmt(cptr fmt, ...);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/z-rand.cc b/src/z-rand.cc
index e2960a55..a35eb08b 100644
--- a/src/z-rand.cc
+++ b/src/z-rand.cc
@@ -4,329 +4,186 @@
#include "z-rand.hpp"
-
-
-
-/*
- * Angband 2.7.9 introduced a new (optimized) random number generator,
- * based loosely on the old "random.c" from Berkeley but with some major
- * optimizations and algorithm changes. See below for more details.
- *
- * Code by myself (benh@phial.com) and Randy (randy@stat.tamu.edu).
- *
- * This code provides (1) a "decent" RNG, based on the "BSD-degree-63-RNG"
- * used in Angband 2.7.8, but rather optimized, and (2) a "simple" RNG,
- * based on the simple "LCRNG" currently used in Angband, but "corrected"
- * to give slightly better values. Both of these are available in two
- * flavors, first, the simple "mod" flavor, which is fast, but slightly
- * biased at high values, and second, the simple "div" flavor, which is
- * less fast (and potentially non-terminating) but which is not biased
- * and is much less subject to low-bit-non-randomness problems.
- *
- * You can select your favorite flavor by proper definition of the
- * "rand_int()" macro in the "defines.h" file.
- *
- * Note that, in Angband 2.8.0, the "state" table will be saved in the
- * savefile, so a special "initialization" phase will be necessary.
- *
- * Note the use of the "simple" RNG, first you activate it via
- * "Rand_quick = TRUE" and "Rand_value = seed" and then it is used
- * automatically used instead of the "complex" RNG, and when you are
- * done, you de-activate it via "Rand_quick = FALSE" or choose a new
- * seed via "Rand_value = seed".
+#include <assert.h>
+#include <cstdint>
+#include <limits>
+#include <random>
+#include <sstream>
+#include <type_traits>
+
+#include "pcg_random.hpp"
+#include "seed.hpp"
+
+/**
+ * Choice of RNG; we use the "statistically most powerful" (per the
+ * documentation) RNG. The "insecure" bit just means that the RNG
+ * is definitely known to *not* be cryptographically secure.
*/
+using rng_t = pcg64_once_insecure;
-
-/*
- * Random Number Generator -- Linear Congruent RNG
- */
-#define LCRNG(X) ((X) * 1103515245 + 12345)
-
-
-
-/*
- * Use the "simple" LCRNG
+/**
+ * Reseed the given RNG.
*/
-bool_ Rand_quick = TRUE;
-
+static void reseed_rng(rng_t *rng, seed_t const &seed)
+{
+ assert(rng != nullptr);
+ // Create a seed_seq from the seed data.
+ std::uint32_t data[seed_t::n_uint32];
+ std::seed_seq seed_seq(
+ std::begin(data),
+ std::end(data)
+ );
+ // Seed the RNG.
+ rng->seed(seed_seq);
+}
-/*
- * Current "value" of the "simple" RNG
+/**
+ * Allocate a new RNG and initialize with the given seed.
*/
-u32b Rand_value;
-
+static rng_t *new_seeded_rng(seed_t const &seed)
+{
+ rng_t *rng = new rng_t;
+ reseed_rng(rng, seed);
+ return rng;
+}
-/*
- * Current "index" for the "complex" RNG
+/**
+ * The "quick" RNG is used for fixed-seed applications.
*/
-u16b Rand_place;
+static rng_t *quick_rng()
+{
+ // Note that the "quick_rng" will always be seeded explicitly
+ // whenever it's used, so we don't need to do any seeding here.
+ static rng_t *instance = new rng_t();
+ return instance;
+}
-/*
- * Current "state" table for the "complex" RNG
+/**
+ * The "complex" RNG is used when we really want non-deterministic
+ * random numbers.
*/
-u32b Rand_state[RAND_DEG];
+static rng_t *complex_rng()
+{
+ static rng_t *instance = new_seeded_rng(seed_t::system());
+ return instance;
+}
+/**
+ * Current RNG.
+ */
+static rng_t *current_rng = nullptr;
-/*
- * Initialize the "complex" RNG using a new seed
+/**
+ * Get the current RNG.
*/
-void Rand_state_init(u32b seed)
+static rng_t *get_current_rng()
{
- int i, j;
+ // Do we need to initialize?
+ if (current_rng == nullptr)
+ {
+ // We start with the complex RNG.
+ current_rng = complex_rng();
+ }
- /* Seed the table */
- Rand_state[0] = seed;
+ return current_rng;
+}
- /* Propagate the seed */
- for (i = 1; i < RAND_DEG; i++) Rand_state[i] = LCRNG(Rand_state[i - 1]);
+void set_quick_rng(seed_t const &seed)
+{
+ reseed_rng(quick_rng(), seed);
+ current_rng = quick_rng();
+}
- /* Cycle the table ten times per degree */
- for (i = 0; i < RAND_DEG * 10; i++)
- {
- /* Acquire the next index */
- j = Rand_place + 1;
- if (j == RAND_DEG) j = 0;
+void set_complex_rng()
+{
+ current_rng = complex_rng();
+}
- /* Update the table, extract an entry */
- Rand_state[j] += Rand_state[Rand_place];
+std::string get_complex_rng_state()
+{
+ std::stringstream s;
+ s << *complex_rng();
+ return s.str();
+}
- /* Advance the index */
- Rand_place = j;
- }
+void set_complex_rng_state(std::string const &state)
+{
+ std::stringstream s(state);
+ s >> *complex_rng();
}
+
/*
- * Extract a "random" number from 0 to m-1, via "modulus"
- *
- * Note that "m" should probably be less than 500000, or the
- * results may be rather biased towards low values.
+ * Stochastic rounding
*/
-s32b Rand_mod(s32b m)
+static double round_stochastic(double x)
{
- int j;
- u32b r;
-
- /* Hack -- simple case */
- if (m <= 1) return (0);
+ double n;
+ double f = std::modf(x, &n);
- /* Use the "simple" RNG */
- if (Rand_quick)
+ // Round up?
+ if (f > 0.5)
{
- /* Cycle the generator */
- r = (Rand_value = LCRNG(Rand_value));
-
- /* Mutate a 28-bit "random" number */
- r = (r >> 4) % m;
+ return n + 1;
}
- /* Use the "complex" RNG */
- else
+ // Round down?
+ if (f < 0.5)
{
- /* Acquire the next index */
- j = Rand_place + 1;
- if (j == RAND_DEG) j = 0;
-
- /* Update the table, extract an entry */
- r = (Rand_state[j] += Rand_state[Rand_place]);
-
- /* Advance the index */
- Rand_place = j;
-
- /* Extract a "random" number */
- r = (r >> 4) % m;
+ return n - 1;
}
- /* Use the value */
- return (r);
-}
-
-
-/*
- * Extract a "random" number from 0 to m-1, via "division"
- *
- * This method selects "random" 28-bit numbers, and then uses
- * division to drop those numbers into "m" different partitions,
- * plus a small non-partition to reduce bias, taking as the final
- * value the first "good" partition that a number falls into.
- *
- * This method has no bias, and is much less affected by patterns
- * in the "low" bits of the underlying RNG's.
- */
-static s32b Rand_div(s32b m)
-{
- u32b r, n;
-
- /* Hack -- simple case */
- if (m <= 1) return (0);
-
- /* Partition size */
- n = (0x10000000 / m);
-
- /* Use a simple RNG */
- if (Rand_quick)
+ // Tie breaker is random; hence 'stochastic'.
+ std::uniform_int_distribution<int> distribution(0, 1);
+ if (distribution(*get_current_rng()) == 0)
{
- /* Wait for it */
- while (1)
- {
- /* Cycle the generator */
- r = (Rand_value = LCRNG(Rand_value));
-
- /* Mutate a 28-bit "random" number */
- r = ((r >> 4) & 0x0FFFFFFF) / n;
-
- /* Done */
- if (r < (u32b)m) break;
- }
+ return n - 1;
}
-
- /* Use a complex RNG */
else
{
- /* Wait for it */
- while (1)
- {
- int j;
-
- /* Acquire the next index */
- j = Rand_place + 1;
- if (j == RAND_DEG) j = 0;
-
- /* Update the table, extract an entry */
- r = (Rand_state[j] += Rand_state[Rand_place]);
-
- /* Hack -- extract a 28-bit "random" number */
- r = ((r >> 4) & 0x0FFFFFFF) / n;
-
- /* Advance the index */
- Rand_place = j;
-
- /* Done */
- if (r < (u32b)m) break;
- }
+ return n + 1;
}
-
- /* Use the value */
- return (r);
}
-
-
-/*
- * The number of entries in the "randnor_table"
- */
-#define RANDNOR_NUM 256
-
-/*
- * The standard deviation of the "randnor_table"
- */
-#define RANDNOR_STD 64
-
-/*
- * The normal distribution table for the "randnor()" function (below)
- */
-static s16b randnor_table[RANDNOR_NUM] =
-{
- 206, 613, 1022, 1430, 1838, 2245, 2652, 3058,
- 3463, 3867, 4271, 4673, 5075, 5475, 5874, 6271,
- 6667, 7061, 7454, 7845, 8234, 8621, 9006, 9389,
- 9770, 10148, 10524, 10898, 11269, 11638, 12004, 12367,
- 12727, 13085, 13440, 13792, 14140, 14486, 14828, 15168,
- 15504, 15836, 16166, 16492, 16814, 17133, 17449, 17761,
- 18069, 18374, 18675, 18972, 19266, 19556, 19842, 20124,
- 20403, 20678, 20949, 21216, 21479, 21738, 21994, 22245,
-
- 22493, 22737, 22977, 23213, 23446, 23674, 23899, 24120,
- 24336, 24550, 24759, 24965, 25166, 25365, 25559, 25750,
- 25937, 26120, 26300, 26476, 26649, 26818, 26983, 27146,
- 27304, 27460, 27612, 27760, 27906, 28048, 28187, 28323,
- 28455, 28585, 28711, 28835, 28955, 29073, 29188, 29299,
- 29409, 29515, 29619, 29720, 29818, 29914, 30007, 30098,
- 30186, 30272, 30356, 30437, 30516, 30593, 30668, 30740,
- 30810, 30879, 30945, 31010, 31072, 31133, 31192, 31249,
-
- 31304, 31358, 31410, 31460, 31509, 31556, 31601, 31646,
- 31688, 31730, 31770, 31808, 31846, 31882, 31917, 31950,
- 31983, 32014, 32044, 32074, 32102, 32129, 32155, 32180,
- 32205, 32228, 32251, 32273, 32294, 32314, 32333, 32352,
- 32370, 32387, 32404, 32420, 32435, 32450, 32464, 32477,
- 32490, 32503, 32515, 32526, 32537, 32548, 32558, 32568,
- 32577, 32586, 32595, 32603, 32611, 32618, 32625, 32632,
- 32639, 32645, 32651, 32657, 32662, 32667, 32672, 32677,
-
- 32682, 32686, 32690, 32694, 32698, 32702, 32705, 32708,
- 32711, 32714, 32717, 32720, 32722, 32725, 32727, 32729,
- 32731, 32733, 32735, 32737, 32739, 32740, 32742, 32743,
- 32745, 32746, 32747, 32748, 32749, 32750, 32751, 32752,
- 32753, 32754, 32755, 32756, 32757, 32757, 32758, 32758,
- 32759, 32760, 32760, 32761, 32761, 32761, 32762, 32762,
- 32763, 32763, 32763, 32764, 32764, 32764, 32764, 32765,
- 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32767,
-};
-
-
-
/*
* Generate a random integer number of NORMAL distribution
- *
- * The table above is used to generate a psuedo-normal distribution,
- * in a manner which is much faster than calling a transcendental
- * function to calculate a true normal distribution.
- *
- * Basically, entry 64*N in the table above represents the number of
- * times out of 32767 that a random variable with normal distribution
- * will fall within N standard deviations of the mean. That is, about
- * 68 percent of the time for N=1 and 95 percent of the time for N=2.
- *
- * The table above contains a "faked" final entry which allows us to
- * pretend that all values in a normal distribution are strictly less
- * than four standard deviations away from the mean. This results in
- * "conservative" distribution of approximately 1/32768 values.
- *
- * Note that the binary search takes up to 16 quick iterations.
*/
s16b randnor(int mean, int stand)
{
- s16b tmp;
- s16b offset;
-
- s16b low = 0;
- s16b high = RANDNOR_NUM;
+ // Get our own return type; we need it for limits and casting.
+ using retval_t = std::result_of<decltype(&randnor)(int, int)>::type;
- /* Paranoia */
- if (stand < 1) return (mean);
-
- /* Roll for probability */
- tmp = (s16b)rand_int(32768);
-
- /* Binary Search */
- while (low < high)
+ // Degenerate case
+ if (stand < 1)
{
- int mid = (low + high) >> 1;
-
- /* Move right if forced */
- if (randnor_table[mid] < tmp)
- {
- low = mid + 1;
- }
-
- /* Move left otherwise */
- else
- {
- high = mid;
- }
+ return 0;
}
- /* Convert the index into an offset */
- offset = (long)stand * (long)low / RANDNOR_STD;
-
- /* One half should be negative */
- if (rand_int(100) < 50) return (mean - offset);
-
- /* One half should be positive */
- return (mean + offset);
+ // Sample from normal distribution
+ std::normal_distribution<double> distribution(mean, stand);
+ double x = distribution(*get_current_rng());
+
+ // Stochastic rounding to avoid rounding bias
+ double rounded_x = round_stochastic(x);
+
+ // Enforce limits of retval_t. Given that we're talking about a normal
+ // distribution, we're usually very unlikely to actually hit these (given
+ // reasonable values for 'mean' and 'stand' parameters), but in (very) rare
+ // cases it's needed to avoid undefined behavior due to the conversion
+ // we're going to do. This does introduce some (very minor) bias, but
+ // it's really unavoidable since retval_t cannot represent all possible
+ // values. We also assuming that a double can accurately represent all
+ // values in the range of retval_t.
+ double clipped_x = std::min(
+ static_cast<double>(std::numeric_limits<retval_t>::max()),
+ std::max(static_cast<double>(std::numeric_limits<retval_t>::min()),
+ rounded_x));
+
+ // Done: We just need to convert to retval_t.
+ return static_cast<retval_t>(clipped_x);
}
@@ -357,20 +214,41 @@ bool magik(s32b p) {
s32b rand_int(s32b m)
{
- return Rand_div(m);
+ /* Degenerate case */
+ if (m < 1)
+ {
+ return 0;
+ }
+ /* Normal case */
+ std::uniform_int_distribution<s32b> distribution(0, m - 1);
+ return distribution(*get_current_rng());
}
s32b randint(s32b m)
{
- return rand_int(m) + 1;
+ /* Degenerate case */
+ if (m < 2)
+ {
+ return 1;
+ }
+ /* Normal case */
+ std::uniform_int_distribution<s32b> distribution(1, m);
+ return distribution(*get_current_rng());
}
s32b rand_range(s32b a, s32b b)
{
- return a + rand_int(1 + b - a);
+ /* Degenerate case */
+ if (b < a)
+ {
+ return a;
+ }
+ /* Normal case */
+ std::uniform_int_distribution<s32b> distribution(a, b);
+ return distribution(*get_current_rng());
}
s32b rand_spread(s32b a, s32b d)
{
- return a + rand_int(1 + d + d) - d;
+ return rand_range(a-d, a+d);
}
diff --git a/src/z-rand.hpp b/src/z-rand.hpp
index f2e3ce5c..b04523c3 100644
--- a/src/z-rand.hpp
+++ b/src/z-rand.hpp
@@ -1,8 +1,9 @@
#pragma once
#include "h-basic.h"
+#include "seed_fwd.hpp"
-
+#include <string>
/**** Available constants ****/
@@ -19,17 +20,34 @@
/**** Available Variables ****/
-extern bool_ Rand_quick;
-extern u32b Rand_value;
-extern u16b Rand_place;
-extern u32b Rand_state[RAND_DEG];
+/**
+ * Change to "quick" RNG, using the given seed.
+ */
+void set_quick_rng(seed_t const &seed);
+
+
+/**
+ * Change to "complex" RNG which uses the "non-deterministic" seed.
+ */
+void set_complex_rng();
+
+
+/**
+ * Get a copy of the state of the "complex" RNG.
+ */
+std::string get_complex_rng_state();
+
+/**
+ * Set the state of the "complex" RNG. The given array must have
+ * been previously obtained via the get_complex_rng_state() function.
+ */
+void set_complex_rng_state(std::string const &state);
/**** Available Functions ****/
-void Rand_state_init(u32b seed);
-s32b Rand_mod(s32b m);
+void Rand_state_init();
s16b randnor(int mean, int stand);
s32b damroll(s16b num, s16b sides);
s32b maxroll(s16b num, s16b sides);
@@ -40,7 +58,7 @@ s32b maxroll(s16b num, s16b sides);
bool magik(s32b p);
/*
- * Generates a random long integer X where O<=X<M.
+ * Generates a random long integer X where 0<=X<M.
* The integer X falls along a uniform distribution.
* For example, if M is 100, you get "percentile dice"
*/
@@ -65,3 +83,23 @@ s32b rand_range(s32b a, s32b b);
* Note: rand_spread(A,D) == rand_range(A-D,A+D)
*/
s32b rand_spread(s32b a, s32b d);
+
+/**
+ * Choose a random element in from the given container.
+ * The container, C, must fulfill the Container concept
+ * whose iterators fulfill the RandomIterator concept.
+ **/
+template <class C> typename C::const_iterator uniform_element(C const &c)
+{
+ return c.cbegin() + rand_int(c.size());
+}
+
+/**
+ * Choose a random element in from the given container.
+ * The container, C, must fulfill the Container concept
+ * whose iterators fulfill the RandomIterator concept.
+ **/
+template <class C> typename C::iterator uniform_element(C &c)
+{
+ return c.begin() + rand_int(c.size());
+}
diff --git a/src/z-term.h b/src/z-term.h
index 01795629..92f09577 100644
--- a/src/z-term.h
+++ b/src/z-term.h
@@ -150,7 +150,7 @@ struct term
errr (*text_hook)(int x, int y, int n, byte a, cptr s);
- void (*resize_hook)(void);
+ void (*resize_hook)();
};
@@ -220,46 +220,46 @@ extern term *Term;
/**** Available Functions ****/
-extern errr Term_xtra(int n, int v);
-
-extern void Term_queue_char(int x, int y, byte a, char c);
-extern void Term_queue_chars(int x, int y, int n, byte a, cptr s);
-
-extern errr Term_fresh(void);
-extern errr Term_set_cursor(int v);
-extern errr Term_gotoxy(int x, int y);
-extern errr Term_draw(int x, int y, byte a, char c);
-extern errr Term_addch(byte a, char c);
-extern errr Term_addstr(int n, byte a, cptr s);
-extern errr Term_putch(int x, int y, byte a, char c);
-extern errr Term_putstr(int x, int y, int n, byte a, cptr s);
-extern errr Term_erase(int x, int y, int n);
-extern errr Term_clear(void);
-extern errr Term_redraw(void);
-extern errr Term_redraw_section(int x1, int y1, int x2, int y2);
-extern void Term_bell();
-
-extern errr Term_get_cursor(int *v);
-extern errr Term_get_size(int *w, int *h);
-extern errr Term_locate(int *x, int *y);
-extern errr Term_what(int x, int y, byte *a, char *c);
-
-extern errr Term_flush(void);
-extern errr Term_keypress(int k);
-extern errr Term_key_push(int k);
-extern errr Term_inkey(char *ch, bool_ wait, bool_ take);
-
-extern errr Term_save(void);
-extern term_win* Term_save_to(void);
-extern errr Term_load(void);
-extern errr Term_load_from(term_win *save);
-
-extern errr Term_resize(int w, int h);
-
-extern errr Term_activate(term *t);
-
-extern errr term_nuke(term *t);
-extern errr term_init(term *t, int w, int h, int k);
+errr Term_xtra(int n, int v);
+
+void Term_queue_char(int x, int y, byte a, char c);
+void Term_queue_chars(int x, int y, int n, byte a, cptr s);
+
+errr Term_fresh();
+errr Term_set_cursor(int v);
+errr Term_gotoxy(int x, int y);
+errr Term_draw(int x, int y, byte a, char c);
+errr Term_addch(byte a, char c);
+errr Term_addstr(int n, byte a, cptr s);
+errr Term_putch(int x, int y, byte a, char c);
+errr Term_putstr(int x, int y, int n, byte a, cptr s);
+errr Term_erase(int x, int y, int n);
+errr Term_clear();
+errr Term_redraw();
+errr Term_redraw_section(int x1, int y1, int x2, int y2);
+void Term_bell();
+
+errr Term_get_cursor(int *v);
+errr Term_get_size(int *w, int *h);
+errr Term_locate(int *x, int *y);
+errr Term_what(int x, int y, byte *a, char *c);
+
+errr Term_flush();
+errr Term_keypress(int k);
+errr Term_key_push(int k);
+errr Term_inkey(char *ch, bool_ wait, bool_ take);
+
+errr Term_save();
+term_win* Term_save_to();
+errr Term_load();
+errr Term_load_from(term_win *save);
+
+errr Term_resize(int w, int h);
+
+errr Term_activate(term *t);
+
+errr term_nuke(term *t);
+errr term_init(term *t, int w, int h, int k);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/z-util.h b/src/z-util.h
index 914a64e7..d2fa79dc 100644
--- a/src/z-util.h
+++ b/src/z-util.h
@@ -21,19 +21,19 @@ extern void (*quit_aux)(cptr);
/* Test equality, prefix, suffix */
-extern bool_ streq(cptr s, cptr t);
-extern bool_ prefix(cptr s, cptr t);
-extern bool_ suffix(cptr s, cptr t);
+bool_ streq(cptr s, cptr t);
+bool_ prefix(cptr s, cptr t);
+bool_ suffix(cptr s, cptr t);
/* Capitalize the first letter of string. Ignores whitespace at the start of string. */
-extern void capitalize(char *s);
+void capitalize(char *s);
/* Print an error message */
-extern void plog(cptr str);
+void plog(cptr str);
/* Exit, with optional message */
-extern void quit(cptr str);
+void quit(cptr str);
#ifdef __cplusplus