From 2392e8de342935f4aa5b1a175eecb13b7ed385f0 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 19:28:14 +0100 Subject: [PATCH 01/16] use int32_t --- src/creature_battle.h | 2 +- src/game_merge.h | 8 ++++---- src/gui_msgs.h | 4 ++-- src/lvl_script.h | 30 +++++++++++++++--------------- src/map_events.h | 2 +- src/player_complookup.h | 2 +- src/player_computer.h | 26 +++++++++++++------------- src/player_data.h | 2 +- src/room_data.h | 2 +- src/thing_list.h | 4 ++-- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/creature_battle.h b/src/creature_battle.h index 3717350748..9de56e841e 100644 --- a/src/creature_battle.h +++ b/src/creature_battle.h @@ -36,7 +36,7 @@ struct Thing; struct PlayerInfo; struct CreatureBattle { - unsigned long fighters_num; + uint32_t fighters_num; unsigned short first_creatr; unsigned short last_creatr; }; diff --git a/src/game_merge.h b/src/game_merge.h index cd1db88724..29e8b90115 100644 --- a/src/game_merge.h +++ b/src/game_merge.h @@ -118,10 +118,10 @@ enum GameFlags2 { */ struct TextScrollWindow { char text[MESSAGE_TEXT_LEN]; - long start_y; + int32_t start_y; char action; - long text_height; - long window_height; + int32_t text_height; + int32_t window_height; }; /** @@ -131,7 +131,7 @@ struct TextScrollWindow { struct IntralevelData { unsigned char bonuses_found[BONUS_LEVEL_STORAGE_COUNT]; struct CreatureStorage transferred_creatures[PLAYERS_COUNT][TRANSFER_CREATURE_STORAGE_COUNT]; - long campaign_flags[PLAYERS_FOR_CAMPAIGN_FLAGS][CAMPAIGN_FLAGS_PER_PLAYER]; + int32_t campaign_flags[PLAYERS_FOR_CAMPAIGN_FLAGS][CAMPAIGN_FLAGS_PER_PLAYER]; char next_level; }; diff --git a/src/gui_msgs.h b/src/gui_msgs.h index df58fef97b..7c8350f889 100644 --- a/src/gui_msgs.h +++ b/src/gui_msgs.h @@ -46,13 +46,13 @@ enum MessageTypes { struct GuiMessage_OLD { // sizeof = 0x45 (69) char text[64]; PlayerNumber plyr_idx; -unsigned long expiration_turn; +uint32_t expiration_turn; }; struct GuiMessage { char text[64]; PlayerNumber plyr_idx; -unsigned long expiration_turn; +uint32_t expiration_turn; PlayerNumber target_idx; char type; }; diff --git a/src/lvl_script.h b/src/lvl_script.h index c2bd3c3533..1f1890b64c 100644 --- a/src/lvl_script.h +++ b/src/lvl_script.h @@ -75,9 +75,9 @@ struct TunnellerTrigger { unsigned char flags; unsigned short condit_idx; unsigned char plyr_idx; - unsigned long location; - unsigned long heading; // originally was 'target' - long carried_gold; + uint32_t location; + uint32_t heading; // originally was 'target' + int32_t carried_gold; CrtrExpLevel exp_level; char party_id; }; @@ -94,7 +94,7 @@ struct PartyTrigger { union { TbMapLocation location; - unsigned long countdown; + uint32_t countdown; }; char spawn_type; CrtrExpLevel exp_level; @@ -124,9 +124,9 @@ struct ScriptValue { char chars[32]; short shorts[16]; unsigned short ushorts[16]; - long longs[8]; + int32_t longs[8]; long long longlongs[4]; - unsigned long ulongs[8]; + uint32_t ulongs[8]; unsigned long long ulonglongs[4]; }; }; @@ -138,7 +138,7 @@ struct Condition { unsigned char variabl_type; unsigned short variabl_idx; unsigned char operation; - unsigned long rvalue; + uint32_t rvalue; unsigned char plyr_range_right; unsigned char variabl_type_right; unsigned short variabl_idx_right; @@ -167,23 +167,23 @@ struct ScriptFxLine struct LevelScript { struct TunnellerTrigger tunneller_triggers[TUNNELLER_TRIGGERS_COUNT]; - unsigned long tunneller_triggers_num; + uint32_t tunneller_triggers_num; struct PartyTrigger party_triggers[PARTY_TRIGGERS_COUNT]; - unsigned long party_triggers_num; + uint32_t party_triggers_num; struct ScriptValue values[SCRIPT_VALUES_COUNT]; - unsigned long values_num; + uint32_t values_num; struct Condition conditions[CONDITIONS_COUNT]; - unsigned long conditions_num; + uint32_t conditions_num; struct Party creature_partys[CREATURE_PARTYS_COUNT]; - unsigned long creature_partys_num; + uint32_t creature_partys_num; unsigned short win_conditions[WIN_CONDITIONS_COUNT]; - unsigned long win_conditions_num; + uint32_t win_conditions_num; unsigned short lose_conditions[WIN_CONDITIONS_COUNT]; - unsigned long lose_conditions_num; + uint32_t lose_conditions_num; // Store strings used at level here char strings[2048]; - long next_string_offset; + int32_t next_string_offset; }; /******************************************************************************/ diff --git a/src/map_events.h b/src/map_events.h index dfa2f6bf87..d141a8766d 100644 --- a/src/map_events.h +++ b/src/map_events.h @@ -91,7 +91,7 @@ struct Event { unsigned char kind; int32_t target; /** Button lifespan, decreased over time. When reaches 0, the button disappears. */ - unsigned long lifespan_turns; + uint32_t lifespan_turns; }; struct Bookmark { diff --git a/src/player_complookup.h b/src/player_complookup.h index 153e03ed08..96d7723c47 100644 --- a/src/player_complookup.h +++ b/src/player_complookup.h @@ -40,7 +40,7 @@ struct GoldLookup { // sizeof = 28 MapSubtlCoord stl_x; MapSubtlCoord stl_y; unsigned short num_gold_slabs; -unsigned long num_gem_slabs; +uint32_t num_gem_slabs; }; #pragma pack() diff --git a/src/player_computer.h b/src/player_computer.h index ad5d93eadd..5613186143 100644 --- a/src/player_computer.h +++ b/src/player_computer.h @@ -281,25 +281,25 @@ struct ComputerDig { struct Coord3d pos_dest; /**< used by dig to position - the destination */ struct Coord3d pos_begin; /**< used by dig to position (the start of the path) and for room dig/place (the centre of the room) */ struct Coord3d pos_next; /**< used by dig to position - the next position in the path to check */ - long distance; /**< used by dig to position - the distance between a given position and the destination */ + int32_t distance; /**< used by dig to position - the distance between a given position and the destination */ unsigned char hug_side; /**< used by dig to position - the rule to follow when hugging the wall (left-hand rule/side or right-hand rule/side) */ SmallAroundIndex direction_around; /**< used by dig to position - the forwards direction of the path */ - unsigned long action_success_flag; /**< this is always set to 1... but it's value is used to create a bool test: did action fail */ - long number_of_failed_actions; /**< used by dig to position (incremented when gold is found but digflags is 0, or a mark for digging action failed) */ + uint32_t action_success_flag; /**< this is always set to 1... but it's value is used to create a bool test: did action fail */ + int32_t number_of_failed_actions; /**< used by dig to position (incremented when gold is found but digflags is 0, or a mark for digging action failed) */ MapSubtlCoord last_backwards_step_stl_x; /**< used by dig to position - ?? when a dig action fails, we step backwards, this is this the X coordinate of the slab we stepped back in to */ MapSubtlCoord last_backwards_step_stl_y; /**< used by dig to position - ?? when a dig action fails, we step backwards, this is this the Y coordinate of the slab we stepped back in to */ - long calls_count; /**< used by dig to position */ - long valuable_slabs_tagged; /**< used by dig to position - Amount of valuable slabs tagged for digging during this dig process. */ + int32_t calls_count; /**< used by dig to position */ + int32_t valuable_slabs_tagged; /**< used by dig to position - Amount of valuable slabs tagged for digging during this dig process. */ /** Variables for digging (or placing) a room. */ struct { - long area; /**< The number of slabs in the room. */ - long slabs_processed; /**< The number of slabs marked for digging or converted in to a room. */ + int32_t area; /**< The number of slabs in the room. */ + int32_t slabs_processed; /**< The number of slabs marked for digging or converted in to a room. */ /** Variables for the spiral used to dig slabs/place rooms. */ struct { SmallAroundIndex forward_direction; /**< The current direction we are moving through the spiral. */ - long turns_made; /**< The number of turns made in the spiral. */ - long steps_to_take_before_turning; /**< The number of steps to take before the next turn in the spiral. */ - long steps_remaining_before_turn; /**< The number of steps we have left to take before we need to turn in the spiral. */ + int32_t turns_made; /**< The number of turns made in the spiral. */ + int32_t steps_to_take_before_turning; /**< The number of steps to take before the next turn in the spiral. */ + int32_t steps_remaining_before_turn; /**< The number of steps we have left to take before we need to turn in the spiral. */ } spiral; } room; }; @@ -341,7 +341,7 @@ struct ComputerTask { } move_gold; struct { struct Coord3d target_pos; - long repeat_num; + int32_t repeat_num; } magic_cta; struct { KeepPwrLevel power_level; @@ -397,7 +397,7 @@ struct ComputerTask { short width; short height; RoomKind kind; - long area; + int32_t area; } create_room; struct { TbBool skip_speed; @@ -437,7 +437,7 @@ struct Computer2 { // sizeof = 5322 // TODO we could use coord2d for trap locations struct Coord3d trap_locations[COMPUTER_TRAP_LOC_COUNT]; /** Stores Sight Of Evil target points data. */ - unsigned long soe_targets[COMPUTER_SOE_GRID_SIZE]; + uint32_t soe_targets[COMPUTER_SOE_GRID_SIZE]; short ongoing_process; short task_idx; short held_thing_idx; diff --git a/src/player_data.h b/src/player_data.h index c621ba2dc2..8167f4f559 100644 --- a/src/player_data.h +++ b/src/player_data.h @@ -209,7 +209,7 @@ struct PlayerInfo { unsigned char cursor_button_down; // left or right button down (whilst using the bounding box cursor) /** Player instance, from PlayerInstanceNum enum. */ unsigned char instance_num; - unsigned long instance_remain_turns; + GameTurnDelta instance_remain_turns; /** If view mode is temporarily covered by another, the original mode which is to be restored later will be saved here.*/ char view_mode_restore; int32_t dungeon_camera_zoom; diff --git a/src/room_data.h b/src/room_data.h index 4fd9a90da5..b06cfad101 100644 --- a/src/room_data.h +++ b/src/room_data.h @@ -95,7 +95,7 @@ struct Room { /** For rooms which can store things, amount of storage space, or sum of gold, used by them. * Rooms which can store things are workshops, libraries, treasure rooms etc. */ struct { - unsigned long capacity_used_for_storage; + uint32_t capacity_used_for_storage; ThingIndex cached_nearby_creature_index; }; /** For rooms which are often browsed for various reasons, list of all rooms of given kind. diff --git a/src/thing_list.h b/src/thing_list.h index b4aead10cd..29b18ece56 100644 --- a/src/thing_list.h +++ b/src/thing_list.h @@ -175,8 +175,8 @@ struct CompoundTngFilterParam { }; struct StructureList { - unsigned long count; - unsigned long index; + uint32_t count; + uint32_t index; }; struct Things { From 8d25637750ccf4e9c6a84980d7587c4fdced9252 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 19:32:04 +0100 Subject: [PATCH 02/16] typedefs --- src/gui_msgs.h | 4 ++-- src/lvl_script.h | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gui_msgs.h b/src/gui_msgs.h index 7c8350f889..7ddd16d196 100644 --- a/src/gui_msgs.h +++ b/src/gui_msgs.h @@ -46,13 +46,13 @@ enum MessageTypes { struct GuiMessage_OLD { // sizeof = 0x45 (69) char text[64]; PlayerNumber plyr_idx; -uint32_t expiration_turn; +GameTurn expiration_turn; }; struct GuiMessage { char text[64]; PlayerNumber plyr_idx; -uint32_t expiration_turn; +GameTurn expiration_turn; PlayerNumber target_idx; char type; }; diff --git a/src/lvl_script.h b/src/lvl_script.h index 1f1890b64c..e7aaf2897e 100644 --- a/src/lvl_script.h +++ b/src/lvl_script.h @@ -74,10 +74,10 @@ struct ScriptContext struct TunnellerTrigger { unsigned char flags; unsigned short condit_idx; - unsigned char plyr_idx; - uint32_t location; - uint32_t heading; // originally was 'target' - int32_t carried_gold; + PlayerNumber plyr_idx; + TbMapLocation location; + TbMapLocation heading; // originally was 'target' + GoldAmount carried_gold; CrtrExpLevel exp_level; char party_id; }; @@ -88,7 +88,7 @@ struct PartyTrigger { char creatr_id; union { - unsigned char plyr_idx; + PlayerNumber plyr_idx; char party_id; // for add_to_party }; union @@ -98,7 +98,7 @@ struct PartyTrigger { }; char spawn_type; CrtrExpLevel exp_level; - unsigned short carried_gold; + GoldAmount carried_gold; union { unsigned short ncopies; From 60858e92b96d2f3d04905a83de1bdd44459fc1ff Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 19:53:16 +0100 Subject: [PATCH 03/16] packet_save_fp --- src/game_legacy.h | 1 - src/packets_misc.c | 43 ++++++++++++++++++++++--------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/game_legacy.h b/src/game_legacy.h index 121ef4638d..8fde29d2cf 100644 --- a/src/game_legacy.h +++ b/src/game_legacy.h @@ -227,7 +227,6 @@ struct Game { unsigned char packet_load_enable; char packet_fname[150]; char packet_fopened; - TbFileHandle packet_save_fp; unsigned int packet_file_pos; struct PacketSaveHead packet_save_head; uint32_t turns_stored; diff --git a/src/packets_misc.c b/src/packets_misc.c index 6a085e6d24..ce0d453484 100644 --- a/src/packets_misc.c +++ b/src/packets_misc.c @@ -40,6 +40,7 @@ extern "C" { struct Packet bad_packet; unsigned long initial_replay_seed; unsigned long last_pause_toggle_time = 0; +static TbFileHandle packet_save_fp = NULL; extern TbBool IMPRISON_BUTTON_DEFAULT; extern TbBool FLEE_BUTTON_DEFAULT; extern TbBool get_skip_heart_zoom_feature(void); @@ -138,24 +139,24 @@ TbBool open_packet_file_for_load(char *fname, struct CatalogueEntry *centry) { memset(centry, 0, sizeof(struct CatalogueEntry)); strcpy(game.packet_fname, fname); - game.packet_save_fp = LbFileOpen(game.packet_fname, Lb_FILE_MODE_READ_ONLY); - if (!game.packet_save_fp) + packet_save_fp = LbFileOpen(game.packet_fname, Lb_FILE_MODE_READ_ONLY); + if (!packet_save_fp) { ERRORLOG("Cannot open keeper packet file for load"); game.packet_fopened = 0; return false; } - int i = load_game_chunks(game.packet_save_fp, centry); + int i = load_game_chunks(packet_save_fp, centry); if ((i != GLoad_PacketStart) && (i != GLoad_PacketContinue)) { - LbFileClose(game.packet_save_fp); - game.packet_save_fp = NULL; + LbFileClose(packet_save_fp); + packet_save_fp = NULL; game.packet_fopened = 0; WARNMSG("Couldn't correctly read packet file \"%s\" header.",fname); return false; } - game.packet_file_pos = LbFilePosition(game.packet_save_fp); - game.turns_stored = (LbFileLengthHandle(game.packet_save_fp) - game.packet_file_pos) / PACKET_TURN_SIZE; + game.packet_file_pos = LbFilePosition(packet_save_fp); + game.turns_stored = (LbFileLengthHandle(packet_save_fp) - game.packet_file_pos) / PACKET_TURN_SIZE; if ((game.packet_checksum_verify) && (!game.packet_save_head.chksum_available)) { WARNMSG("PacketSave checksum not available, checking disabled."); @@ -221,24 +222,24 @@ short save_packets(void) chksum = compute_replay_integrity(); else chksum = 0; - LbFileSeek(game.packet_save_fp, 0, Lb_FILE_SEEK_END); + LbFileSeek(packet_save_fp, 0, Lb_FILE_SEEK_END); // Prepare data in the buffer for (int i = 0; i < NET_PLAYERS_COUNT; i++) memcpy(&pckt_buf[i*sizeof(struct Packet)], &game.packets[i], sizeof(struct Packet)); memcpy(&pckt_buf[NET_PLAYERS_COUNT*sizeof(struct Packet)], &chksum, sizeof(TbBigChecksum)); // Write buffer into file - if (LbFileWrite(game.packet_save_fp, &pckt_buf, turn_data_size) != turn_data_size) + if (LbFileWrite(packet_save_fp, &pckt_buf, turn_data_size) != turn_data_size) { ERRORLOG("Packet file write error"); } for (int i = 0; i < NET_PLAYERS_COUNT; i++) { if (game.packets[i].action == PckA_PlyrMsgEnd) { - if (LbFileWrite(game.packet_save_fp, get_player(i)->mp_pending_message, PLAYER_MP_MESSAGE_LEN) != PLAYER_MP_MESSAGE_LEN) { + if (LbFileWrite(packet_save_fp, get_player(i)->mp_pending_message, PLAYER_MP_MESSAGE_LEN) != PLAYER_MP_MESSAGE_LEN) { ERRORLOG("Chat message file write error"); } } } - if ( !LbFileFlush(game.packet_save_fp) ) + if ( !LbFileFlush(packet_save_fp) ) { ERRORLOG("Unable to flush PacketSave File"); return false; @@ -250,9 +251,9 @@ void close_packet_file(void) { if ( game.packet_fopened ) { - LbFileClose(game.packet_save_fp); + LbFileClose(packet_save_fp); game.packet_fopened = 0; - game.packet_save_fp = NULL; + packet_save_fp = NULL; } } @@ -284,7 +285,7 @@ TbBool reinit_packets_after_load(void) { game.packet_save_enable = false; game.packet_load_enable = false; - game.packet_save_fp = NULL; + packet_save_fp = NULL; game.packet_fopened = 0; return true; } @@ -321,8 +322,8 @@ TbBool open_new_packet_file_for_save(void) } } LbFileDelete(game.packet_fname); - game.packet_save_fp = LbFileOpen(game.packet_fname, Lb_FILE_MODE_NEW); - if (!game.packet_save_fp) + packet_save_fp = LbFileOpen(game.packet_fname, Lb_FILE_MODE_NEW); + if (!packet_save_fp) { ERRORLOG("Cannot open keeper packet file for save, \"%s\".",game.packet_fname); game.packet_fopened = 0; @@ -330,12 +331,12 @@ TbBool open_new_packet_file_for_save(void) } struct CatalogueEntry centry; fill_game_catalogue_entry(¢ry, "Packet file"); - if (!save_packet_chunks(game.packet_save_fp,¢ry)) + if (!save_packet_chunks(packet_save_fp,¢ry)) { WARNMSG("Cannot write to packet file, \"%s\".",game.packet_fname); - LbFileClose(game.packet_save_fp); + LbFileClose(packet_save_fp); game.packet_fopened = 0; - game.packet_save_fp = NULL; + packet_save_fp = NULL; return false; } game.packet_fopened = 1; @@ -354,7 +355,7 @@ void load_packets_for_turn(GameTurn nturn) return; } - if (LbFileRead(game.packet_save_fp, &pckt_buf, turn_data_size) == -1) + if (LbFileRead(packet_save_fp, &pckt_buf, turn_data_size) == -1) { ERRORDBG(18,"Cannot read turn data from Packet File"); erstat_inc(ESE_CantReadPackets); @@ -365,7 +366,7 @@ void load_packets_for_turn(GameTurn nturn) memcpy(&game.packets[i], &pckt_buf[i * sizeof(struct Packet)], sizeof(struct Packet)); for (long i = 0; i < NET_PLAYERS_COUNT; i++) { if (game.packets[i].action == PckA_PlyrMsgEnd) { - if (LbFileRead(game.packet_save_fp, get_player(i)->mp_pending_message, PLAYER_MP_MESSAGE_LEN) == PLAYER_MP_MESSAGE_LEN) { + if (LbFileRead(packet_save_fp, get_player(i)->mp_pending_message, PLAYER_MP_MESSAGE_LEN) == PLAYER_MP_MESSAGE_LEN) { game.packet_file_pos += PLAYER_MP_MESSAGE_LEN; } else { ERRORDBG(18,"Cannot read chat message from Packet File"); From ae7aef12d767b366211287a2d6673e6184ef896d Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 19:59:19 +0100 Subject: [PATCH 04/16] remove unused soundptrs --- src/sounds.c | 2 -- src/sounds.h | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/sounds.c b/src/sounds.c index acde9f20fa..2275f7ef5b 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -395,8 +395,6 @@ TbBool init_sound(void) struct SoundSettings* snd_settng = &game.sound_settings; snd_settng->flags = SndSetting_Sound; snd_settng->sound_type = 1622; - snd_settng->sound_data_path = sound_dir; - snd_settng->dir3 = sound_dir; snd_settng->sound_buffer_enable = 1; snd_settng->stereo = 1; snd_settng->max_number_of_samples = 100; diff --git a/src/sounds.h b/src/sounds.h index 5bf9e78819..4dd81abe18 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -39,9 +39,6 @@ extern "C" { struct Thing; struct SoundSettings { - char *sound_data_path; - char *music_data_path; - char *dir3; unsigned short sound_type; unsigned short flags; unsigned char max_number_of_samples; From 5927c78252305f5c4cabb9beda356a38502d75f1 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 20:26:43 +0100 Subject: [PATCH 05/16] move pallete pointer out of gamestruct --- src/kfx/lense/PaletteEffect.cpp | 2 +- src/main.cpp | 6 +++--- src/player_data.c | 29 +++++++++++++++++++++++++++++ src/player_data.h | 4 +++- src/player_utils.c | 2 +- src/vidfade.c | 3 ++- 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/kfx/lense/PaletteEffect.cpp b/src/kfx/lense/PaletteEffect.cpp index 9f785f84dc..d48b07a2ef 100644 --- a/src/kfx/lense/PaletteEffect.cpp +++ b/src/kfx/lense/PaletteEffect.cpp @@ -60,7 +60,7 @@ void PaletteEffect::Cleanup() if (m_current_lens >= 0) { struct PlayerInfo* player = get_my_player(); player->lens_palette = NULL; - player->main_palette = engine_palette; + set_player_main_palette(player, engine_palette); m_current_lens = -1; SYNCDBG(9, "Palette effect cleaned up"); } diff --git a/src/main.cpp b/src/main.cpp index fee2316133..a95c92d348 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1548,7 +1548,7 @@ void reinit_level_after_load(void) // Reinit structures from within the game player = get_my_player(); player->lens_palette = 0; - player->main_palette = engine_palette; + set_player_main_palette(player, engine_palette); init_lookups(); init_navigation(); reinit_packets_after_load(); @@ -1817,9 +1817,9 @@ void PaletteSetPlayerPalette(struct PlayerInfo *player, unsigned char *pal) { player->additional_flags &= ~PlaAF_FreezePaletteIsActive; // flag Freeze palette is not active } - if ( (player->lens_palette == 0) || ((pal != player->main_palette) && (pal == player->lens_palette)) ) + if ( (player->lens_palette == 0) || ((pal != get_player_main_palette(player)) && (pal == player->lens_palette)) ) { - player->main_palette = pal; + set_player_main_palette(player, pal); player->palette_fade_step_pain = 0; player->palette_fade_step_possession = 0; if (is_my_player(player)) diff --git a/src/player_data.c b/src/player_data.c index 0a0de09c7b..c73424f36c 100644 --- a/src/player_data.c +++ b/src/player_data.c @@ -44,10 +44,38 @@ TbPixel possession_hit_colours[] = {133, 89, 167, 141, 31, 31, 110, 54, 46 unsigned short const player_cubes[] = {0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C7, 0x00C6 }; struct PlayerInfo bad_player; +static unsigned char *player_main_palettes[PLAYERS_COUNT]; /** The current player's number. */ unsigned char my_player_number; /******************************************************************************/ +static int get_player_runtime_index(const struct PlayerInfo *player) +{ + if (player == NULL) + return -1; + if ((player < &game.players[0]) || (player >= &game.players[PLAYERS_COUNT])) + return -1; + return (int)(player - &game.players[0]); +} + +unsigned char *get_player_main_palette(const struct PlayerInfo *player) +{ + const int idx = get_player_runtime_index(player); + if (idx < 0) + return engine_palette; + if (player_main_palettes[idx] == NULL) + return engine_palette; + return player_main_palettes[idx]; +} + +void set_player_main_palette(struct PlayerInfo *player, unsigned char *palette) +{ + const int idx = get_player_runtime_index(player); + if (idx < 0) + return; + player_main_palettes[idx] = palette; +} + struct PlayerInfo *get_player_f(PlayerNumber plyr_idx,const char *func_name) { if ((plyr_idx >= 0) && (plyr_idx < PLAYERS_COUNT)) @@ -228,6 +256,7 @@ void clear_players(void) for (int i = 0; i < PLAYERS_COUNT; i++) { struct PlayerInfo* player = &game.players[i]; + player_main_palettes[i] = NULL; memset(player, 0, sizeof(struct PlayerInfo)); player->id_number = PLAYERS_COUNT; switch (i) diff --git a/src/player_data.h b/src/player_data.h index 8167f4f559..3a20571f37 100644 --- a/src/player_data.h +++ b/src/player_data.h @@ -216,7 +216,6 @@ struct PlayerInfo { int32_t palette_fade_step_map; int32_t palette_fade_step_pain; int32_t palette_fade_step_possession; - unsigned char *main_palette; /** Overcharge level while casting keeper powers. */ int32_t cast_expand_level; char video_cluedo_mode; @@ -306,6 +305,9 @@ void reset_player_mode(struct PlayerInfo *player, unsigned short nview); void clear_players(void); +unsigned char *get_player_main_palette(const struct PlayerInfo *player); +void set_player_main_palette(struct PlayerInfo *player, unsigned char *palette); + unsigned char rotate_mode_to_view_mode(unsigned char mode); unsigned char get_player_color_idx(PlayerNumber plyr_idx); diff --git a/src/player_utils.c b/src/player_utils.c index 3f580fe141..7acd1a9c37 100644 --- a/src/player_utils.c +++ b/src/player_utils.c @@ -780,7 +780,7 @@ void init_player(struct PlayerInfo *player, short no_explore) setup_engine_window(0, 0, MyScreenWidth, MyScreenHeight); player->continue_work_state = PSt_CtrlDungeon; player->work_state = PSt_CtrlDungeon; - player->main_palette = engine_palette; + set_player_main_palette(player, engine_palette); player->minimap_zoom = settings.minimap_zoom; player->isometric_view_zoom_level = settings.isometric_view_zoom_level; player->frontview_zoom_level = settings.frontview_zoom_level; diff --git a/src/vidfade.c b/src/vidfade.c index fd134066b4..2d9b6d47e7 100644 --- a/src/vidfade.c +++ b/src/vidfade.c @@ -302,9 +302,10 @@ long PaletteFadePlayer(struct PlayerInfo *player) i = 120; long step = 120 - i; // Create the new palette + unsigned char* player_palette = get_player_main_palette(player); for (i=0; i < PALETTE_COLORS; i++) { - unsigned char* src = &player->main_palette[3 * i]; + unsigned char* src = &player_palette[3 * i]; unsigned char* dst = &palette[3 * i]; unsigned long pix = ((step * (((long)src[0]) - 63)) / 120) + 63; if (pix > 63) From cc4f4ca5bec692ff734397bf93f4b3de566bdd71 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 20:37:11 +0100 Subject: [PATCH 06/16] palltes --- src/game_saves.c | 7 ++++-- src/kfx/lense/PaletteEffect.cpp | 4 ++-- src/main.cpp | 5 +++-- src/player_data.c | 40 ++++++++++++++++++++++----------- src/player_data.h | 3 ++- 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/game_saves.c b/src/game_saves.c index 46cb23386f..022938a6ec 100644 --- a/src/game_saves.c +++ b/src/game_saves.c @@ -417,11 +417,14 @@ TbBool load_game(long slot_num) clear_flag(player->additional_flags, PlaAF_FreezePaletteIsActive); player->palette_fade_step_pain = 0; player->palette_fade_step_possession = 0; - player->lens_palette = 0; + set_player_lens_palette(player, NULL); // Reinitialize lens first (restores lens_palette pointer from config) reinitialise_eye_lens(game.applied_lens_type); // Apply the appropriate palette (lens palette if active, otherwise engine default) - PaletteSetPlayerPalette(player, player->lens_palette ? player->lens_palette : engine_palette); + { + unsigned char* lens_palette = get_player_lens_palette(player); + PaletteSetPlayerPalette(player, lens_palette ? lens_palette : engine_palette); + } init_local_cameras(player); // Update the lights system state light_import_system_state(&game.lightst); diff --git a/src/kfx/lense/PaletteEffect.cpp b/src/kfx/lense/PaletteEffect.cpp index d48b07a2ef..fb8e2edd3b 100644 --- a/src/kfx/lense/PaletteEffect.cpp +++ b/src/kfx/lense/PaletteEffect.cpp @@ -48,7 +48,7 @@ TbBool PaletteEffect::Setup(long lens_idx) // Set lens_palette - PaletteSetPlayerPalette() will update main_palette and apply // Do NOT set main_palette here, it breaks the condition in PaletteSetPlayerPalette() - player->lens_palette = cfg->palette; + set_player_lens_palette(player, cfg->palette); m_current_lens = lens_idx; SYNCDBG(7, "Palette effect ready"); @@ -59,7 +59,7 @@ void PaletteEffect::Cleanup() { if (m_current_lens >= 0) { struct PlayerInfo* player = get_my_player(); - player->lens_palette = NULL; + set_player_lens_palette(player, NULL); set_player_main_palette(player, engine_palette); m_current_lens = -1; SYNCDBG(9, "Palette effect cleaned up"); diff --git a/src/main.cpp b/src/main.cpp index a95c92d348..6c5ea334f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1547,7 +1547,7 @@ void reinit_level_after_load(void) SYNCDBG(6,"Starting"); // Reinit structures from within the game player = get_my_player(); - player->lens_palette = 0; + set_player_lens_palette(player, NULL); set_player_main_palette(player, engine_palette); init_lookups(); init_navigation(); @@ -1817,7 +1817,8 @@ void PaletteSetPlayerPalette(struct PlayerInfo *player, unsigned char *pal) { player->additional_flags &= ~PlaAF_FreezePaletteIsActive; // flag Freeze palette is not active } - if ( (player->lens_palette == 0) || ((pal != get_player_main_palette(player)) && (pal == player->lens_palette)) ) + unsigned char *lens_palette = get_player_lens_palette(player); + if ( (lens_palette == 0) || ((pal != get_player_main_palette(player)) && (pal == lens_palette)) ) { set_player_main_palette(player, pal); player->palette_fade_step_pain = 0; diff --git a/src/player_data.c b/src/player_data.c index c73424f36c..dc12699787 100644 --- a/src/player_data.c +++ b/src/player_data.c @@ -44,36 +44,49 @@ TbPixel possession_hit_colours[] = {133, 89, 167, 141, 31, 31, 110, 54, 46 unsigned short const player_cubes[] = {0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C7, 0x00C6 }; struct PlayerInfo bad_player; -static unsigned char *player_main_palettes[PLAYERS_COUNT]; +static unsigned char *local_player_main_palette; +static unsigned char *local_player_lens_palette; /** The current player's number. */ unsigned char my_player_number; /******************************************************************************/ -static int get_player_runtime_index(const struct PlayerInfo *player) +static TbBool is_local_player_ref(const struct PlayerInfo *player) { if (player == NULL) - return -1; + return false; if ((player < &game.players[0]) || (player >= &game.players[PLAYERS_COUNT])) - return -1; - return (int)(player - &game.players[0]); + return false; + return is_my_player(player); } unsigned char *get_player_main_palette(const struct PlayerInfo *player) { - const int idx = get_player_runtime_index(player); - if (idx < 0) + if (!is_local_player_ref(player)) return engine_palette; - if (player_main_palettes[idx] == NULL) + if (local_player_main_palette == NULL) return engine_palette; - return player_main_palettes[idx]; + return local_player_main_palette; } void set_player_main_palette(struct PlayerInfo *player, unsigned char *palette) { - const int idx = get_player_runtime_index(player); - if (idx < 0) + if (!is_local_player_ref(player)) + return; + local_player_main_palette = palette; +} + +unsigned char *get_player_lens_palette(const struct PlayerInfo *player) +{ + if (!is_local_player_ref(player)) + return NULL; + return local_player_lens_palette; +} + +void set_player_lens_palette(struct PlayerInfo *player, unsigned char *palette) +{ + if (!is_local_player_ref(player)) return; - player_main_palettes[idx] = palette; + local_player_lens_palette = palette; } struct PlayerInfo *get_player_f(PlayerNumber plyr_idx,const char *func_name) @@ -253,10 +266,11 @@ TbBool player_is_friendly_or_defeated(PlayerNumber check_plyr_idx, PlayerNumber void clear_players(void) { + local_player_main_palette = NULL; + local_player_lens_palette = NULL; for (int i = 0; i < PLAYERS_COUNT; i++) { struct PlayerInfo* player = &game.players[i]; - player_main_palettes[i] = NULL; memset(player, 0, sizeof(struct PlayerInfo)); player->id_number = PLAYERS_COUNT; switch (i) diff --git a/src/player_data.h b/src/player_data.h index 3a20571f37..583743c4d5 100644 --- a/src/player_data.h +++ b/src/player_data.h @@ -156,7 +156,6 @@ struct PlayerInfo { unsigned char input_crtr_control; unsigned char input_crtr_query; unsigned char display_flags; - unsigned char *lens_palette; /** Index of packet slot associated with this player. */ unsigned char packet_num; int32_t hand_animationId; @@ -307,6 +306,8 @@ void clear_players(void); unsigned char *get_player_main_palette(const struct PlayerInfo *player); void set_player_main_palette(struct PlayerInfo *player, unsigned char *palette); +unsigned char *get_player_lens_palette(const struct PlayerInfo *player); +void set_player_lens_palette(struct PlayerInfo *player, unsigned char *palette); unsigned char rotate_mode_to_view_mode(unsigned char mode); From ef9e4a8ab98d3307c42f20f5e0a299545abf8b43 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 20:56:15 +0100 Subject: [PATCH 07/16] get rid of lookup stuff --- src/creature_control.c | 18 +++++++++--------- src/creature_control.h | 7 +------ src/game_legacy.h | 1 - src/main.cpp | 2 -- src/main_game.c | 7 ------- 5 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/creature_control.c b/src/creature_control.c index e1f3b2183b..829d4aa125 100644 --- a/src/creature_control.c +++ b/src/creature_control.c @@ -46,9 +46,9 @@ extern "C" { */ struct CreatureControl *creature_control_get(CctrlIndex cctrl_idx) { - if ((cctrl_idx < 1) || (cctrl_idx >= CREATURES_COUNT)) - return INVALID_CRTR_CONTROL; - return game.persons.cctrl_lookup[cctrl_idx]; + if ((cctrl_idx < 1) || (cctrl_idx >= CREATURES_COUNT)) + return INVALID_CRTR_CONTROL; + return &game.cctrl_data[cctrl_idx]; } /** @@ -57,9 +57,9 @@ struct CreatureControl *creature_control_get(CctrlIndex cctrl_idx) */ struct CreatureControl *creature_control_get_from_thing(const struct Thing *thing) { - if ((thing->ccontrol_idx < 1) || (thing->ccontrol_idx >= CREATURES_COUNT)) - return INVALID_CRTR_CONTROL; - return game.persons.cctrl_lookup[thing->ccontrol_idx]; + if ((thing->ccontrol_idx < 1) || (thing->ccontrol_idx >= CREATURES_COUNT)) + return INVALID_CRTR_CONTROL; + return &game.cctrl_data[thing->ccontrol_idx]; } /** @@ -67,7 +67,7 @@ struct CreatureControl *creature_control_get_from_thing(const struct Thing *thin */ TbBool creature_control_invalid(const struct CreatureControl *cctrl) { - return (cctrl <= game.persons.cctrl_lookup[0]) || (cctrl == NULL); + return (cctrl <= &game.cctrl_data[0]) || (cctrl == NULL); } TbBool creature_control_exists(const struct CreatureControl *cctrl) @@ -83,7 +83,7 @@ CctrlIndex i_can_allocate_free_control_structure(void) { for (CctrlIndex i = 1; i < CREATURES_COUNT; i++) { - struct CreatureControl* cctrl = game.persons.cctrl_lookup[i]; + struct CreatureControl* cctrl = &game.cctrl_data[i]; if (!creature_control_invalid(cctrl)) { if ((cctrl->creature_control_flags & CCFlg_Exists) == 0) @@ -97,7 +97,7 @@ struct CreatureControl *allocate_free_control_structure(void) { for (long i = 1; i < CREATURES_COUNT; i++) { - struct CreatureControl* cctrl = game.persons.cctrl_lookup[i]; + struct CreatureControl* cctrl = &game.cctrl_data[i]; if (!creature_control_invalid(cctrl)) { if ((cctrl->creature_control_flags & CCFlg_Exists) == 0) diff --git a/src/creature_control.h b/src/creature_control.h index 5ff8c149a0..8c43abad24 100644 --- a/src/creature_control.h +++ b/src/creature_control.h @@ -48,7 +48,7 @@ extern "C" { #define INSTANCE_TYPES_MAX 2000 #define LAIR_ENEMY_MAX 5 -#define INVALID_CRTR_CONTROL (game.persons.cctrl_lookup[0]) +#define INVALID_CRTR_CONTROL (&game.cctrl_data[0]) /******************************************************************************/ #pragma pack(1) @@ -417,11 +417,6 @@ struct CreatureControl { GameTurnDelta hand_blocked_turns; }; -struct Persons { - struct CreatureControl *cctrl_lookup[CREATURES_COUNT]; - struct CreatureControl *cctrl_end; -}; - struct CreatureSound { int32_t index; int32_t count; diff --git a/src/game_legacy.h b/src/game_legacy.h index 8fde29d2cf..4e20dc873c 100644 --- a/src/game_legacy.h +++ b/src/game_legacy.h @@ -203,7 +203,6 @@ struct Game { struct PlayerInfo players[PLAYERS_COUNT]; struct Column columns_data[COLUMNS_COUNT]; struct Things things; - struct Persons persons; struct Columns columns; unsigned short slabset_num; struct SlabSet slabset[SLABSET_COUNT]; diff --git a/src/main.cpp b/src/main.cpp index 6c5ea334f4..73e54bb664 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2045,8 +2045,6 @@ void clear_lookups(void) } game.things.end = NULL; - memset(&game.persons, 0, sizeof(struct Persons)); - for (i=0; i < COLUMNS_COUNT; i++) { game.columns.lookup[i] = NULL; diff --git a/src/main_game.c b/src/main_game.c index 7b1b3f9583..b98bb6a45b 100644 --- a/src/main_game.c +++ b/src/main_game.c @@ -136,13 +136,6 @@ void init_lookups(void) } game.things.end = &game.things_data[THINGS_COUNT]; - memset(&game.persons, 0, sizeof(struct Persons)); - for (i=0; i < CREATURES_COUNT; i++) - { - game.persons.cctrl_lookup[i] = &game.cctrl_data[i]; - } - game.persons.cctrl_end = &game.cctrl_data[CREATURES_COUNT]; - for (i=0; i < COLUMNS_COUNT; i++) { game.columns.lookup[i] = &game.columns_data[i]; From c73f0a238d9ac423b539f2d41f5f8a206451984b Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 21:14:14 +0100 Subject: [PATCH 08/16] fix compile --- src/light_data.c | 2 +- src/lvl_script.c | 6 +++--- src/lvl_script_commands.c | 2 +- src/player_data.c | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/light_data.c b/src/light_data.c index c1363f17fe..61aa9c4912 100644 --- a/src/light_data.c +++ b/src/light_data.c @@ -443,7 +443,7 @@ void light_remove_light_from_list(struct Light *lgt, struct StructureList *list) { if ( list->count == 0 ) { - ERRORLOG("List %lu has no structures", list->index); + ERRORLOG("List %u has no structures", list->index); return; } TbBool Removed = false; diff --git a/src/lvl_script.c b/src/lvl_script.c index 47d4e3149b..0ed6bac70e 100644 --- a/src/lvl_script.c +++ b/src/lvl_script.c @@ -601,9 +601,9 @@ static TbBool process_subfunc(char **line, struct ScriptLine *scline, const stru strcpy(scline->tp[dst], "0"); break; } - SCRPTLOG("Function \"%s\" returned value \"%ld\"", funcmd_desc->textptr, + SCRPTLOG("Function \"%s\" returned value \"%d\"", funcmd_desc->textptr, intralvl.campaign_flags[player_id][flag_id]); - snprintf(scline->tp[dst], MAX_TEXT_LENGTH, "%ld", intralvl.campaign_flags[player_id][flag_id]); + snprintf(scline->tp[dst], MAX_TEXT_LENGTH, "%d", intralvl.campaign_flags[player_id][flag_id]); break; } default: @@ -1069,7 +1069,7 @@ void process_check_new_tunneller_parties(void) } else { - SCRIPTDBG(6, "Adding tunneler, heading %lu", tn_trig->heading); + SCRIPTDBG(6, "Adding tunneler, heading %u", tn_trig->heading); script_process_new_tunneler(tn_trig->plyr_idx, tn_trig->location, tn_trig->heading, tn_trig->exp_level, tn_trig->carried_gold); } diff --git a/src/lvl_script_commands.c b/src/lvl_script_commands.c index 6e3db6fd83..e7e2f54c3d 100644 --- a/src/lvl_script_commands.c +++ b/src/lvl_script_commands.c @@ -1564,7 +1564,7 @@ static void create_effect_process(struct ScriptContext *context) struct Coord3d pos; if (!get_coords_at_location(&pos, context->value->ulongs[1],true)) { - SCRPTWRNLOG("Could not find location %lu to create effect", context->value->ulongs[1]); + SCRPTWRNLOG("Could not find location %u to create effect", context->value->ulongs[1]); return; } script_create_effect(&pos,context->value->shorts[0],context->value->longs[2]); diff --git a/src/player_data.c b/src/player_data.c index dc12699787..693fbd2e8a 100644 --- a/src/player_data.c +++ b/src/player_data.c @@ -26,6 +26,7 @@ #include "config_powerhands.h" #include "player_instances.h" #include "config_players.h" +#include "front_simple.h" #include "game_legacy.h" #include "engine_redraw.h" #include "frontend.h" From d78f466863d8ca892aa471d973daeec7527f8af2 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 21:29:38 +0100 Subject: [PATCH 09/16] cut columns lookup --- src/game_legacy.h | 1 - src/main.cpp | 6 ------ src/main_game.c | 5 ----- src/map_columns.c | 32 ++++++++++++++++---------------- src/map_columns.h | 7 +------ 5 files changed, 17 insertions(+), 34 deletions(-) diff --git a/src/game_legacy.h b/src/game_legacy.h index 4e20dc873c..33dde644c3 100644 --- a/src/game_legacy.h +++ b/src/game_legacy.h @@ -203,7 +203,6 @@ struct Game { struct PlayerInfo players[PLAYERS_COUNT]; struct Column columns_data[COLUMNS_COUNT]; struct Things things; - struct Columns columns; unsigned short slabset_num; struct SlabSet slabset[SLABSET_COUNT]; unsigned short slabobjs_num; diff --git a/src/main.cpp b/src/main.cpp index 73e54bb664..d4b83a9812 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2044,12 +2044,6 @@ void clear_lookups(void) game.things.lookup[i] = NULL; } game.things.end = NULL; - - for (i=0; i < COLUMNS_COUNT; i++) - { - game.columns.lookup[i] = NULL; - } - game.columns.end = NULL; } void interp_fix_mouse_light_off_map(struct PlayerInfo *player) diff --git a/src/main_game.c b/src/main_game.c index b98bb6a45b..36c78f2f60 100644 --- a/src/main_game.c +++ b/src/main_game.c @@ -136,11 +136,6 @@ void init_lookups(void) } game.things.end = &game.things_data[THINGS_COUNT]; - for (i=0; i < COLUMNS_COUNT; i++) - { - game.columns.lookup[i] = &game.columns_data[i]; - } - game.columns.end = &game.columns_data[COLUMNS_COUNT]; } static void init_level(void) diff --git a/src/map_columns.c b/src/map_columns.c index 3ad7dd4a0f..abc19b37f4 100644 --- a/src/map_columns.c +++ b/src/map_columns.c @@ -31,34 +31,34 @@ extern "C" { /******************************************************************************/ struct Column *get_column(long idx) { - if ((idx < 1) || (idx >= COLUMNS_COUNT)) - return INVALID_COLUMN; - return game.columns.lookup[idx]; + if ((idx < 1) || (idx >= COLUMNS_COUNT)) + return INVALID_COLUMN; + return &game.columns_data[idx]; } struct Column *get_column_at(MapSubtlCoord stl_x, MapSubtlCoord stl_y) { - struct Map *mapblk; - mapblk = get_map_block_at(stl_x, stl_y); - if (map_block_invalid(mapblk)) - return INVALID_COLUMN; - return game.columns.lookup[get_mapblk_column_index(mapblk)]; + struct Map *mapblk; + mapblk = get_map_block_at(stl_x, stl_y); + if (map_block_invalid(mapblk)) + return INVALID_COLUMN; + return &game.columns_data[get_mapblk_column_index(mapblk)]; } struct Column *get_map_column(const struct Map *mapblk) { - if (map_block_invalid(mapblk)) - return INVALID_COLUMN; - return game.columns.lookup[get_mapblk_column_index(mapblk)]; + if (map_block_invalid(mapblk)) + return INVALID_COLUMN; + return &game.columns_data[get_mapblk_column_index(mapblk)]; } TbBool column_invalid(const struct Column *colmn) { - if (colmn == NULL) - return true; - if (colmn == INVALID_COLUMN) - return true; - return (colmn <= game.columns.lookup[0]) || (colmn > game.columns.lookup[COLUMNS_COUNT-1]) || (colmn == NULL); + if (colmn == NULL) + return true; + if (colmn == INVALID_COLUMN) + return true; + return (colmn <= &game.columns_data[0]) || (colmn > &game.columns_data[COLUMNS_COUNT-1]); } /** diff --git a/src/map_columns.h b/src/map_columns.h index 255a793f36..5a29dfd393 100644 --- a/src/map_columns.h +++ b/src/map_columns.h @@ -43,11 +43,6 @@ struct Column { // sizeof=0x18 unsigned short cubes[COLUMN_STACK_HEIGHT]; }; -struct Columns { - struct Column *lookup[COLUMNS_COUNT]; - struct Column *end; -}; - enum ColumnFlags { CLF_ACTIVE = 0x01, CLF_CEILING_MASK = 0x0E, // Height of ceiling cube layer. @@ -56,7 +51,7 @@ enum ColumnFlags { #pragma pack() /******************************************************************************/ -#define INVALID_COLUMN game.columns.lookup[0] +#define INVALID_COLUMN (&game.columns_data[0]) /******************************************************************************/ struct Column *get_column_at(MapSubtlCoord stl_x, MapSubtlCoord stl_y); struct Column *get_map_column(const struct Map *map); From beda362089f95b47a090eb7b6bc35b9de643be15 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 21:41:29 +0100 Subject: [PATCH 10/16] remove thing looup --- src/creature_states.c | 3 ++- src/game_legacy.h | 1 - src/game_saves.c | 1 - src/keeperfx.hpp | 1 - src/main.cpp | 13 ------------- src/main_game.c | 11 ----------- src/thing_data.c | 4 ++-- src/thing_data.h | 2 +- src/thing_list.h | 6 ------ 9 files changed, 5 insertions(+), 37 deletions(-) diff --git a/src/creature_states.c b/src/creature_states.c index 27166e0c8f..ec3922c358 100644 --- a/src/creature_states.c +++ b/src/creature_states.c @@ -3966,7 +3966,8 @@ char new_slab_tunneller_check_for_breaches(struct Thing *creatng) if ((col->bitfields & CLF_CEILING_MASK) != 0) continue; - if (!creature_can_navigate_to(creatng, &game.things.lookup[dgn->dnheart_idx]->mappos, NavRtF_Default)) + struct Thing* hearttng = thing_get(dgn->dnheart_idx); + if (!creature_can_navigate_to(creatng, &hearttng->mappos, NavRtF_Default)) continue; set_flag(cctrl->party.player_broken_into_flags, to_flag(i)); diff --git a/src/game_legacy.h b/src/game_legacy.h index 33dde644c3..cef0d994af 100644 --- a/src/game_legacy.h +++ b/src/game_legacy.h @@ -202,7 +202,6 @@ struct Game { unsigned char applied_lens_type; struct PlayerInfo players[PLAYERS_COUNT]; struct Column columns_data[COLUMNS_COUNT]; - struct Things things; unsigned short slabset_num; struct SlabSet slabset[SLABSET_COUNT]; unsigned short slabobjs_num; diff --git a/src/game_saves.c b/src/game_saves.c index 022938a6ec..5f271ae82f 100644 --- a/src/game_saves.c +++ b/src/game_saves.c @@ -401,7 +401,6 @@ TbBool load_game(long slot_num) game.loaded_level_number = centry->level_num; } WARNMSG("Couldn't correctly load saved game in slot %d.",(int)slot_num); - init_lookups(); return false; } my_player_number = game.local_plyr_idx; diff --git a/src/keeperfx.hpp b/src/keeperfx.hpp index d009d05727..10719a3f99 100644 --- a/src/keeperfx.hpp +++ b/src/keeperfx.hpp @@ -265,7 +265,6 @@ void lightning_modify_palette(struct Thing *thing); unsigned long lightning_is_close_to_player(struct PlayerInfo *player, struct Coord3d *pos); unsigned long seed_check_random(unsigned long range, uint32_t *seed, const char *func_name, unsigned long place); -void init_lookups(void); void place_single_slab_type_on_map(SlabKind slbkind, MapSlabCoord slb_x, MapSlabCoord slb_y, PlayerNumber plyr_idx); void turn_off_query(PlayerNumber plyr_idx); TbBool set_gamma(char corrlvl, TbBool do_set); diff --git a/src/main.cpp b/src/main.cpp index d4b83a9812..a1c81660d5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1167,7 +1167,6 @@ short setup_game(void) SetSoundMasterVolume(settings.sound_volume); setup_mesh_randomizers(); setup_stuff(); - init_lookups(); } if (result == 1) @@ -1549,7 +1548,6 @@ void reinit_level_after_load(void) player = get_my_player(); set_player_lens_palette(player, NULL); set_player_main_palette(player, engine_palette); - init_lookups(); init_navigation(); reinit_packets_after_load(); game.easter_eggs_enabled = start_params.easter_egg; @@ -2035,17 +2033,6 @@ short complete_level(struct PlayerInfo *player) return true; } -void clear_lookups(void) -{ - long i; - SYNCDBG(8,"Starting"); - for (i=0; i < THINGS_COUNT; i++) - { - game.things.lookup[i] = NULL; - } - game.things.end = NULL; -} - void interp_fix_mouse_light_off_map(struct PlayerInfo *player) { // This fixes the interpolation issue of moving the mouse off map in one position then back onto the map far elsewhere. diff --git a/src/main_game.c b/src/main_game.c index 36c78f2f60..8e2fe499cb 100644 --- a/src/main_game.c +++ b/src/main_game.c @@ -126,17 +126,6 @@ void init_player_types() } /******************************************************************************/ -void init_lookups(void) -{ - long i; - SYNCDBG(8,"Starting"); - for (i=0; i < THINGS_COUNT; i++) - { - game.things.lookup[i] = &game.things_data[i]; - } - game.things.end = &game.things_data[THINGS_COUNT]; - -} static void init_level(void) { diff --git a/src/thing_data.c b/src/thing_data.c index 7156139e44..a60e107633 100644 --- a/src/thing_data.c +++ b/src/thing_data.c @@ -207,7 +207,7 @@ void delete_thing_structure_f(struct Thing *thing, TbBool deleting_everything, c struct Thing *thing_get_f(ThingIndex tng_idx, const char *func_name) { if ((tng_idx > 0) && (tng_idx < THINGS_COUNT)) { - return game.things.lookup[tng_idx]; + return &game.things_data[tng_idx]; } if (tng_idx >= THINGS_COUNT) { ERRORMSG("%s: Request of invalid thing (no %d) intercepted",func_name,(int)tng_idx); @@ -220,7 +220,7 @@ struct Thing *thing_get_f(ThingIndex tng_idx, const char *func_name) */ short thing_is_invalid(const struct Thing *thing) { - return (thing <= game.things.lookup[0]) || (thing > game.things.lookup[THINGS_COUNT-1]) || (thing == NULL); + return (thing <= &game.things_data[0]) || (thing > &game.things_data[THINGS_COUNT-1]) || (thing == NULL); } /** diff --git a/src/thing_data.h b/src/thing_data.h index d14a87465c..57fd5387c0 100644 --- a/src/thing_data.h +++ b/src/thing_data.h @@ -320,7 +320,7 @@ struct Thing { PlayerNumber holding_player; }; -#define INVALID_THING (game.things.lookup[0]) +#define INVALID_THING (&game.things_data[0]) /** Macro used for debugging problems related to things. * Should be executed in every function which changes a thing. diff --git a/src/thing_list.h b/src/thing_list.h index 29b18ece56..9b32ee2d15 100644 --- a/src/thing_list.h +++ b/src/thing_list.h @@ -179,12 +179,6 @@ struct StructureList { uint32_t index; }; -struct Things { - struct Thing *lookup[THINGS_COUNT]; - struct Thing *end; -}; - - #pragma pack() /******************************************************************************/ extern Thing_Class_Func class_functions[]; From 344a16b56444131323b684a6f58f452d2514b4b4 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Mon, 2 Mar 2026 22:02:27 +0100 Subject: [PATCH 11/16] remove unused strruct --- src/gui_msgs.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/gui_msgs.h b/src/gui_msgs.h index 7ddd16d196..3e84289977 100644 --- a/src/gui_msgs.h +++ b/src/gui_msgs.h @@ -43,12 +43,6 @@ enum MessageTypes { /******************************************************************************/ #pragma pack(1) -struct GuiMessage_OLD { // sizeof = 0x45 (69) - char text[64]; -PlayerNumber plyr_idx; -GameTurn expiration_turn; -}; - struct GuiMessage { char text[64]; PlayerNumber plyr_idx; From bcbad291b30988032f9b9d8fdcd379402566b6c8 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Tue, 3 Mar 2026 19:55:19 +0100 Subject: [PATCH 12/16] acamera --- src/creature_control.c | 2 +- src/engine_camera.c | 4 +++- src/engine_redraw.c | 20 +++++++++++------- src/engine_render.c | 21 +++++++++++-------- src/front_input.c | 19 ++++++++++------- src/frontmenu_ingame_map.c | 31 +++++++++++++++------------ src/gui_tooltips.c | 5 +++-- src/light_data.c | 7 ++++--- src/local_camera.c | 5 +++-- src/main.cpp | 26 +++++++++++++---------- src/net_checksums.c | 10 +++++---- src/packets.c | 9 +++++--- src/player_data.c | 19 +++++++++++++++++ src/player_data.h | 5 +++-- src/player_instances.c | 43 ++++++++++++++++++++++---------------- src/player_utils.c | 2 +- src/power_process.c | 9 ++++---- src/sounds.c | 6 +++--- src/thing_creature.c | 8 +++---- src/thing_traps.c | 6 +++++- 20 files changed, 159 insertions(+), 98 deletions(-) diff --git a/src/creature_control.c b/src/creature_control.c index 829d4aa125..aae80a8895 100644 --- a/src/creature_control.c +++ b/src/creature_control.c @@ -146,7 +146,7 @@ struct Thing *create_and_control_creature_as_controller(struct PlayerInfo *playe toggle_status_menu(0); turn_off_roaming_menus(); } - const struct Camera* cam = player->acamera; + const struct Camera* cam = get_player_active_camera(player); set_selected_creature(player, thing); player->view_mode_restore = cam->view_mode; thing->alloc_flags |= TAlF_IsControlled; diff --git a/src/engine_camera.c b/src/engine_camera.c index 19ff86f70e..b4e7446ff5 100644 --- a/src/engine_camera.c +++ b/src/engine_camera.c @@ -763,7 +763,9 @@ void view_process_camera_inertia(struct Camera *cam) void update_player_camera(struct PlayerInfo *player) { struct Dungeon *dungeon = get_players_dungeon(player); - struct Camera *cam = player->acamera; + struct Camera *cam = get_player_active_camera(player); + if (cam == NULL) + return; view_process_camera_inertia(cam); switch (cam->view_mode) diff --git a/src/engine_redraw.c b/src/engine_redraw.c index a495ef3c0a..7efd383339 100644 --- a/src/engine_redraw.c +++ b/src/engine_redraw.c @@ -514,7 +514,7 @@ void set_engine_view(struct PlayerInfo *player, long val) switch ( val ) { case PVM_EmptyView: - player->acamera = &player->cameras[CamIV_Isometric]; + set_player_active_camera(player, CamIV_Isometric); // Allow view mode 0 only for non-local-human players if (!is_my_player(player)) break; @@ -525,7 +525,7 @@ void set_engine_view(struct PlayerInfo *player, long val) val = PVM_CreatureView; // fall through case PVM_CreatureView: - player->acamera = &player->cameras[CamIV_FirstPerson]; + set_player_active_camera(player, CamIV_FirstPerson); sync_local_camera(player); if (!is_my_player(player)) break; @@ -537,8 +537,10 @@ void set_engine_view(struct PlayerInfo *player, long val) break; case PVM_IsoWibbleView: case PVM_IsoStraightView: - player->acamera = &player->cameras[CamIV_Isometric]; - player->acamera->view_mode = val; + { + struct Camera *camera = &player->cameras[CamIV_Isometric]; + set_player_active_camera(player, CamIV_Isometric); + camera->view_mode = val; sync_local_camera(player); if (!is_my_player(player)) break; @@ -548,8 +550,9 @@ void set_engine_view(struct PlayerInfo *player, long val) S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(1280); break; + } case PVM_ParchmentView: - player->acamera = &player->cameras[CamIV_Parchment]; + set_player_active_camera(player, CamIV_Parchment); sync_local_camera(player); if (!is_my_player(player)) break; @@ -561,7 +564,7 @@ void set_engine_view(struct PlayerInfo *player, long val) // In fade states, keep the settings unchanged break; case PVM_FrontView: - player->acamera = &player->cameras[CamIV_FrontView]; + set_player_active_camera(player, CamIV_FrontView); sync_local_camera(player); if (!is_my_player(player)) break; @@ -578,7 +581,8 @@ void set_engine_view(struct PlayerInfo *player, long val) void draw_overlay_compass(long base_x, long base_y) { struct PlayerInfo* player = get_my_player(); - struct Camera* cam = get_local_camera(player->acamera); + struct Camera* camera = get_player_active_camera(player); + struct Camera* cam = get_local_camera(camera); unsigned short flg_mem = lbDisplay.DrawFlags; LbTextSetFont(winfont); lbDisplay.DrawFlags |= Lb_SPRITE_TRANSPAR4; @@ -678,7 +682,7 @@ void redraw_isometric_view(void) SYNCDBG(6,"Starting"); struct PlayerInfo* player = get_my_player(); - if (player->acamera == NULL) + if (get_player_active_camera(player) == NULL) return; TbGraphicsWindow ewnd; memset(&ewnd, 0, sizeof(TbGraphicsWindow)); diff --git a/src/engine_render.c b/src/engine_render.c index 5791bb7458..139aa22e9c 100644 --- a/src/engine_render.c +++ b/src/engine_render.c @@ -5054,10 +5054,12 @@ static void draw_engine_number(struct BucketKindFloatingGoldText *num) spr = get_button_sprite(GBS_fontchars_number_dig0); w = scale_ui_value(spr->SWidth) * scale_by_zoom; h = scale_ui_value(spr->SHeight) * scale_by_zoom; + struct Camera *active_cam = get_player_active_camera(player); if ( - player->acamera->view_mode == PVM_IsoWibbleView || - player->acamera->view_mode == PVM_FrontView || - player->acamera->view_mode == PVM_IsoStraightView + active_cam != NULL && + (active_cam->view_mode == PVM_IsoWibbleView || + active_cam->view_mode == PVM_FrontView || + active_cam->view_mode == PVM_IsoStraightView) ) { // Count digits to be displayed ndigits=0; @@ -5088,7 +5090,7 @@ static void draw_engine_room_flagpole(struct BucketKindRoomFlag *rflg) return; } struct PlayerInfo *player = get_my_player(); - const struct Camera *cam = get_local_camera(player->acamera); + const struct Camera *cam = get_local_camera(get_player_active_camera(player)); if ( cam->view_mode == PVM_IsoWibbleView || @@ -5247,7 +5249,7 @@ void fill_status_sprite_indexes(struct Thing *thing, struct CreatureControl *cct void draw_status_sprites(long scrpos_x, long scrpos_y, struct Thing *thing) { struct PlayerInfo *player = get_my_player(); - const struct Camera *cam = get_local_camera(player->acamera); + const struct Camera *cam = get_local_camera(get_player_active_camera(player)); if (cam == NULL) { return; @@ -5486,7 +5488,7 @@ static void draw_engine_room_flag_top(struct BucketKindRoomFlag *rflg) return; } struct PlayerInfo *player = get_my_player(); - const struct Camera *cam = get_local_camera(player->acamera); + const struct Camera *cam = get_local_camera(get_player_active_camera(player)); if ( cam->view_mode == PVM_IsoWibbleView || @@ -6710,7 +6712,7 @@ static void display_drawlist(void) // Draws isometric and 1st person view. Not f break; case QK_JontyISOSprite: // Spinning key player = get_my_player(); - cam = get_local_camera(player->acamera); + cam = get_local_camera(get_player_active_camera(player)); if (cam != NULL) { if (cam->view_mode == PVM_IsoWibbleView || cam->view_mode == PVM_IsoStraightView) { @@ -7959,12 +7961,13 @@ static void draw_jonty_mapwho(struct BucketKindJontySprite *jspr) { if ((player->thing_under_hand == thing->index) && ((game.play_gameturn % (4 * gui_blink_rate)) >= 2 * gui_blink_rate)) { - if (player->acamera->view_mode == PVM_IsoWibbleView || player->acamera->view_mode == PVM_IsoStraightView) + struct Camera *active_cam = get_player_active_camera(player); + if ((active_cam != NULL) && (active_cam->view_mode == PVM_IsoWibbleView || active_cam->view_mode == PVM_IsoStraightView)) { lbDisplay.DrawFlags |= Lb_TEXT_UNDERLNSHADOW; lbSpriteReMapPtr = white_pal; } - else if (player->acamera->view_mode == PVM_CreatureView) + else if ((active_cam != NULL) && (active_cam->view_mode == PVM_CreatureView)) { struct Thing *creatng = thing_get(player->influenced_thing_idx); if (thing_is_creature(creatng)) diff --git a/src/front_input.c b/src/front_input.c index 353d5fb881..7b5dad73b3 100644 --- a/src/front_input.c +++ b/src/front_input.c @@ -471,10 +471,11 @@ short get_bookmark_inputs(void) if (is_key_pressed(kcode, KMod_CONTROL)) { clear_key_pressed(kcode); - if (player->acamera != NULL) + struct Camera* camera = get_player_active_camera(player); + if (camera != NULL) { - bmark->x = player->acamera->mappos.x.stl.num; - bmark->y = player->acamera->mappos.y.stl.num; + bmark->x = camera->mappos.x.stl.num; + bmark->y = camera->mappos.y.stl.num; bmark->flags |= 0x01; show_onscreen_msg(game_num_fps, "Bookmark %d stored", i + 1); } @@ -721,12 +722,13 @@ TbBool get_level_lost_inputs(void) } if (player->view_type == PVT_MapScreen) { + struct Camera* camera = get_player_active_camera(player); long mouse_x = GetMouseX(); long mouse_y = GetMouseY(); // Position on the parchment map on which we're doing action int32_t map_x; int32_t map_y; - TbBool map_valid = point_to_overhead_map(get_local_camera(player->acamera), mouse_x / pixel_size, mouse_y / pixel_size, &map_x, &map_y); + TbBool map_valid = point_to_overhead_map(get_local_camera(camera), mouse_x / pixel_size, mouse_y / pixel_size, &map_x, &map_y); if (is_game_key_pressed(Gkey_SwitchToMap, &keycode, false)) { lbKeyOn[keycode] = 0; @@ -1977,12 +1979,13 @@ void get_packet_control_mouse_clicks(void) short get_map_action_inputs(void) { struct PlayerInfo* player = get_my_player(); + struct Camera* camera = get_player_active_camera(player); long mouse_x = GetMouseX(); long mouse_y = GetMouseY(); // Get map coordinates from mouse position on parchment screen int32_t map_x; int32_t map_y; - TbBool map_valid = point_to_overhead_map(get_local_camera(player->acamera), mouse_x / pixel_size, mouse_y / pixel_size, &map_x, &map_y); + TbBool map_valid = point_to_overhead_map(get_local_camera(camera), mouse_x / pixel_size, mouse_y / pixel_size, &map_x, &map_y); if (map_valid) { MapSubtlCoord stl_x = coord_subtile(map_x); @@ -2412,7 +2415,7 @@ void get_dungeon_control_nonaction_inputs(void) set_players_packet_position(pckt, pos.x.val, pos.y.val, context); } } else - if (screen_to_map(get_local_camera(player->acamera), my_mouse_x, my_mouse_y, &pos)) + if (screen_to_map(get_local_camera(get_player_active_camera(player)), my_mouse_x, my_mouse_y, &pos)) { set_players_packet_position(pckt, pos.x.val, pos.y.val, 0); pckt->additional_packet_values &= ~PCAdV_ContextMask; // reset cursor states to 0 (CSt_DefaultArrow) @@ -2464,7 +2467,7 @@ void get_map_nonaction_inputs(void) pos.y.val = 0; pos.z.val = 0; struct PlayerInfo* player = get_my_player(); - TbBool coords_valid = screen_to_map(get_local_camera(player->acamera), GetMouseX(), GetMouseY(), &pos); + TbBool coords_valid = screen_to_map(get_local_camera(get_player_active_camera(player)), GetMouseX(), GetMouseY(), &pos); set_players_packet_position(get_packet(my_player_number), pos.x.val, pos.y.val, 0); struct Packet* pckt = get_packet(my_player_number); if (coords_valid) { @@ -3357,7 +3360,7 @@ void process_cheat_mode_selection_inputs() if (is_key_pressed(KC_LALT, KMod_DONTCARE)) { struct Coord3d pos; - if (screen_to_map(get_local_camera(player->acamera), GetMouseX(), GetMouseY(), &pos)) + if (screen_to_map(get_local_camera(get_player_active_camera(player)), GetMouseX(), GetMouseY(), &pos)) { MapSlabCoord slb_x = subtile_slab(pos.x.stl.num); MapSlabCoord slb_y = subtile_slab(pos.y.stl.num); diff --git a/src/frontmenu_ingame_map.c b/src/frontmenu_ingame_map.c index 1a51d10e9b..cf519c996b 100644 --- a/src/frontmenu_ingame_map.c +++ b/src/frontmenu_ingame_map.c @@ -265,9 +265,10 @@ int draw_overlay_call_to_arms(struct PlayerInfo *player, long units_per_px, long int i; int n; SYNCDBG(18,"Starting"); - if (player->acamera == NULL) + struct Camera *active_cam = get_player_active_camera(player); + if (active_cam == NULL) return 0; - struct Camera *cam = get_local_camera(player->acamera); + struct Camera *cam = get_local_camera(active_cam); n = 0; const struct StructureList *slist = get_list_for_thing_class(TCls_Object); k = 0; @@ -324,9 +325,10 @@ int draw_overlay_traps(struct PlayerInfo *player, long units_per_px, long scaled int i; int n; SYNCDBG(18,"Starting"); - if (player->acamera == NULL) + struct Camera *active_cam = get_player_active_camera(player); + if (active_cam == NULL) return 0; - struct Camera *cam = get_local_camera(player->acamera); + struct Camera *cam = get_local_camera(active_cam); n = 0; k = 0; const struct StructureList *slist = get_list_for_thing_class(TCls_Trap); @@ -402,9 +404,10 @@ int draw_overlay_spells_and_boxes(struct PlayerInfo *player, long units_per_px, int i; int n; SYNCDBG(18,"Starting"); - if (player->acamera == NULL) + struct Camera *active_cam = get_player_active_camera(player); + if (active_cam == NULL) return 0; - struct Camera *cam = get_local_camera(player->acamera); + struct Camera *cam = get_local_camera(active_cam); n = 0; const struct StructureList *slist = get_list_for_thing_class(TCls_Object); k = 0; @@ -491,7 +494,7 @@ void panel_map_draw_creature_dot(long mapos_x, long mapos_y, RealScreenCoord bas int draw_overlay_possessed_thing(struct PlayerInfo* player, long mapos_x, long mapos_y, RealScreenCoord basepos, TbPixel col, long basic_zoom, TbBool isLowRes) { const struct Camera* cam; - cam = get_local_camera(player->acamera); + cam = get_local_camera(get_player_active_camera(player)); if (cam == NULL) return 0; if (cam->view_mode != PVM_CreatureView) @@ -531,9 +534,10 @@ int draw_overlay_creatures(struct PlayerInfo *player, long units_per_px, long zo int i; int n; SYNCDBG(18,"Starting"); - if (player->acamera == NULL) + struct Camera *active_cam = get_player_active_camera(player); + if (active_cam == NULL) return 0; - struct Camera *cam = get_local_camera(player->acamera); + struct Camera *cam = get_local_camera(active_cam); n = 0; k = 0; const struct StructureList *slist = get_list_for_thing_class(TCls_Creature); @@ -666,9 +670,10 @@ int draw_overlay_creatures(struct PlayerInfo *player, long units_per_px, long zo */ int draw_line_to_heart(struct PlayerInfo *player, long units_per_px, long zoom) { - if (player->acamera == NULL) + struct Camera *active_cam = get_player_active_camera(player); + if (active_cam == NULL) return 0; - struct Camera *cam = get_local_camera(player->acamera); + struct Camera *cam = get_local_camera(active_cam); struct Thing *thing = get_player_soul_container(player->id_number); if (!thing_exists(thing)) { @@ -849,7 +854,7 @@ static void do_map_rotate_stuff(long relpos_x, long relpos_y, int32_t *stl_x, in { const struct PlayerInfo *player = get_my_player(); const struct Camera *cam; - cam = get_local_camera(player->acamera); + cam = get_local_camera(get_player_active_camera(player)); int angle; angle = cam->rotation_angle_x & ANGLE_MASK_4; int shift_x; @@ -1273,7 +1278,7 @@ void panel_map_draw_slabs(long x, long y, long units_per_px, long zoom) auto_gen_tables(units_per_px); update_panel_colors(); struct PlayerInfo *player = get_my_player(); - struct Camera *cam = get_local_camera(player->acamera); + struct Camera *cam = get_local_camera(get_player_active_camera(player)); if ((cam == NULL) || (MapDiagonalLength < 1)) return; diff --git a/src/gui_tooltips.c b/src/gui_tooltips.c index eb3b705cce..3ee0ba7190 100644 --- a/src/gui_tooltips.c +++ b/src/gui_tooltips.c @@ -448,13 +448,14 @@ TbBool input_gameplay_tooltips(TbBool gameplay_on) struct PlayerInfo* player = get_my_player(); if ((gameplay_on) && (tool_tip_time == 0) && (!busy_doing_gui)) { - if (player->acamera == NULL) + struct Camera *camera = get_player_active_camera(player); + if (camera == NULL) { ERRORLOG("No active camera"); return false; } struct Coord3d mappos; - if (screen_to_map(get_local_camera(player->acamera), GetMouseX(), GetMouseY(), &mappos)) + if (screen_to_map(get_local_camera(camera), GetMouseX(), GetMouseY(), &mappos)) { if (subtile_revealed(mappos.x.stl.num,mappos.y.stl.num, player->id_number)) { diff --git a/src/light_data.c b/src/light_data.c index 61aa9c4912..598201227b 100644 --- a/src/light_data.c +++ b/src/light_data.c @@ -2275,11 +2275,12 @@ void update_light_render_area(void) } int delta_x = abs(game.something_light_x); int delta_y = abs(game.something_light_y); + struct Camera *camera = get_player_active_camera(player); // Prepare the area constraints - if (player->acamera != NULL) + if (camera != NULL) { - subtile_y = player->acamera->mappos.y.stl.num; - subtile_x = player->acamera->mappos.x.stl.num; + subtile_y = camera->mappos.y.stl.num; + subtile_x = camera->mappos.x.stl.num; } else { subtile_y = 0; diff --git a/src/local_camera.c b/src/local_camera.c index f5eeda73e8..abf7050702 100644 --- a/src/local_camera.c +++ b/src/local_camera.c @@ -309,8 +309,9 @@ void sync_local_camera(struct PlayerInfo *player) if (!is_my_player(player) || !local_camera_ready) { return; } - if (player->acamera == &player->cameras[CamIV_FirstPerson]) { - sync_first_person_camera(player->acamera, player); + struct Camera *camera = get_player_active_camera(player); + if (camera == &player->cameras[CamIV_FirstPerson]) { + sync_first_person_camera(camera, player); return; } for (int cam_idx = CamIV_Isometric; cam_idx <= CamIV_FrontView; cam_idx++) { diff --git a/src/main.cpp b/src/main.cpp index a1c81660d5..e871d27760 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -351,7 +351,10 @@ void process_keeper_spell_aura(struct Thing *thing) unsigned long lightning_is_close_to_player(struct PlayerInfo *player, struct Coord3d *pos) { - return get_chessboard_distance(&player->acamera->mappos, pos) < subtile_coord(45,0); + struct Camera *camera = get_player_active_camera(player); + if (camera == NULL) + return false; + return get_chessboard_distance(&camera->mappos, pos) < subtile_coord(45,0); } void affect_nearby_stuff_with_vortex(struct Thing *thing) @@ -808,23 +811,24 @@ TbBool any_player_close_enough_to_see(const struct Coord3d *pos) player = get_player(i); if ( (player_exists(player)) && ((player->allocflags & PlaF_CompCtrl) == 0)) { - if (player->acamera == NULL) + struct Camera *camera = get_player_active_camera(player); + if (camera == NULL) continue; - if (player->acamera->view_mode != PVM_FrontView) + if (camera->view_mode != PVM_FrontView) { - if (player->acamera->zoom >= CAMERA_ZOOM_MIN) + if (camera->zoom >= CAMERA_ZOOM_MIN) { - limit = SHRT_MAX - (2 * player->acamera->zoom); + limit = SHRT_MAX - (2 * camera->zoom); } } else { - if (player->acamera->zoom >= FRONTVIEW_CAMERA_ZOOM_MIN) + if (camera->zoom >= FRONTVIEW_CAMERA_ZOOM_MIN) { - limit = SHRT_MAX - (player->acamera->zoom / 3); + limit = SHRT_MAX - (camera->zoom / 3); } } - if (get_chessboard_distance(&player->acamera->mappos, pos) <= limit) + if (get_chessboard_distance(&camera->mappos, pos) <= limit) { return true; } @@ -1692,7 +1696,7 @@ void clear_players_for_save(void) set_flag_value(player->allocflags, PlaF_Allocated, ((saved_allocation_flags & PlaF_Allocated) != 0)); set_flag_value(player->allocflags, PlaF_CompCtrl, ((saved_allocation_flags & PlaF_CompCtrl) != 0)); memcpy(&player->cameras[CamIV_FirstPerson],&cammem,sizeof(struct Camera)); - player->acamera = &player->cameras[CamIV_FirstPerson]; + set_player_active_camera(player, CamIV_FirstPerson); } } @@ -1895,7 +1899,7 @@ void level_lost_go_first_person(PlayerNumber plyr_idx) return; } spectator_breed = get_players_spectator_model(plyr_idx); - player->dungeon_camera_zoom = get_camera_zoom(player->acamera); + player->dungeon_camera_zoom = get_camera_zoom(get_player_active_camera(player)); thing = create_and_control_creature_as_controller(player, spectator_breed, &dungeon->mappos); if (thing_is_invalid(thing)) { ERRORLOG("Unable to create spectator creature"); @@ -2706,7 +2710,7 @@ void update(void) struct Thing *thing = thing_get(player->controlled_thing_idx); update_first_person_object_ambience(thing); } - update_footsteps_nearest_camera(player->acamera); + update_footsteps_nearest_camera(get_player_active_camera(player)); PaletteFadePlayer(player); process_armageddon(); update_global_lighting(); diff --git a/src/net_checksums.c b/src/net_checksums.c index dfc2971af8..d01d37fab5 100644 --- a/src/net_checksums.c +++ b/src/net_checksums.c @@ -76,10 +76,11 @@ TbBigChecksum get_thing_checksum(const struct Thing* thing) { } static TbBigChecksum compute_player_checksum(struct PlayerInfo *player) { - if ((player->allocflags & PlaF_CompCtrl) != 0 || player->acamera == NULL) { + struct Camera* camera = get_player_active_camera(player); + if ((player->allocflags & PlaF_CompCtrl) != 0 || camera == NULL) { return 0; } - struct Coord3d* mappos = &(player->acamera->mappos); + struct Coord3d* mappos = &(camera->mappos); TbBigChecksum checksum = 0; CHECKSUM_ADD(checksum, player->instance_remain_turns); CHECKSUM_ADD(checksum, player->instance_num); @@ -212,14 +213,15 @@ void update_turn_checksums(void) { } for (int i = 0; i < PLAYERS_COUNT; i++) { struct PlayerInfo* player = get_player(i); - if (!player_exists(player) || ((player->allocflags & PlaF_CompCtrl) != 0) || player->acamera == NULL) { + struct Camera* camera = get_player_active_camera(player); + if (!player_exists(player) || ((player->allocflags & PlaF_CompCtrl) != 0) || camera == NULL) { continue; } struct LogPlayerDesyncInfo* player_snapshot = &snapshot_info->players[snapshot_info->player_count++]; player_snapshot->id = i; player_snapshot->instance_num = player->instance_num; player_snapshot->instance_remain_turns = player->instance_remain_turns; - player_snapshot->mappos = player->acamera->mappos; + player_snapshot->mappos = camera->mappos; player_snapshot->checksum = compute_player_checksum(player); } for (struct Room* room = start_rooms; room < end_rooms; room++) { diff --git a/src/packets.c b/src/packets.c index fec82dfca2..79097e72ab 100644 --- a/src/packets.c +++ b/src/packets.c @@ -517,7 +517,7 @@ void process_players_dungeon_control_packet_control(long plyr_idx) struct PlayerInfo* player = get_player(plyr_idx); struct Packet* pckt = get_packet_direct(player->packet_num); SYNCDBG(6,"Processing player %d action %d",(int)plyr_idx,(int)pckt->action); - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); if (cam == NULL) { ERRORLOG("No active camera"); return; @@ -1017,10 +1017,13 @@ TbBool process_players_global_packet_action(PlayerNumber plyr_idx) } return false; case PckA_SaveViewType: - if (player->acamera != NULL) - player->view_mode_restore = player->acamera->view_mode; + { + struct Camera* camera = get_player_active_camera(player); + if (camera != NULL) + player->view_mode_restore = camera->view_mode; set_player_mode(player, pckt->actn_par1); return false; + } case PckA_LoadViewType: set_player_mode(player, pckt->actn_par1); set_engine_view(player, player->view_mode_restore); diff --git a/src/player_data.c b/src/player_data.c index 693fbd2e8a..0666edda5a 100644 --- a/src/player_data.c +++ b/src/player_data.c @@ -90,6 +90,25 @@ void set_player_lens_palette(struct PlayerInfo *player, unsigned char *palette) local_player_lens_palette = palette; } +struct Camera *get_player_active_camera(const struct PlayerInfo *player) +{ + if (player == NULL) + return NULL; + unsigned char cam_idx = player->active_camera_idx; + if (cam_idx >= 4) + cam_idx = CamIV_Isometric; + return &((struct PlayerInfo *)player)->cameras[cam_idx]; +} + +void set_player_active_camera(struct PlayerInfo *player, unsigned char cam_idx) +{ + if (player == NULL) + return; + if (cam_idx >= 4) + cam_idx = CamIV_Isometric; + player->active_camera_idx = cam_idx; +} + struct PlayerInfo *get_player_f(PlayerNumber plyr_idx,const char *func_name) { if ((plyr_idx >= 0) && (plyr_idx < PLAYERS_COUNT)) diff --git a/src/player_data.h b/src/player_data.h index 583743c4d5..482f96d7ae 100644 --- a/src/player_data.h +++ b/src/player_data.h @@ -171,8 +171,7 @@ struct PlayerInfo { short thing_under_hand; TbBool possession_lock; unsigned char view_mode; - /** Pointer to the currently active camera. */ - struct Camera *acamera; + unsigned char active_camera_idx; struct Camera cameras[4]; MapCoord zoom_to_pos_x; MapCoord zoom_to_pos_y; @@ -308,6 +307,8 @@ unsigned char *get_player_main_palette(const struct PlayerInfo *player); void set_player_main_palette(struct PlayerInfo *player, unsigned char *palette); unsigned char *get_player_lens_palette(const struct PlayerInfo *player); void set_player_lens_palette(struct PlayerInfo *player, unsigned char *palette); +struct Camera *get_player_active_camera(const struct PlayerInfo *player); +void set_player_active_camera(struct PlayerInfo *player, unsigned char cam_idx); unsigned char rotate_mode_to_view_mode(unsigned char mode); diff --git a/src/player_instances.c b/src/player_instances.c index 9b764581fa..cd0389965a 100644 --- a/src/player_instances.c +++ b/src/player_instances.c @@ -232,7 +232,7 @@ long pinstfe_hand_whip(struct PlayerInfo *player, int32_t *n) if ( creature_model_bleeds(thing->model) ) create_effect(&pos, TngEff_HitBleedingUnit, thing->owner); thing_play_sample(thing, powerst->select_sound_idx, NORMAL_PITCH, 0, 3, 0, 3, FULL_LOUDNESS); - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); if (cam != NULL) { thing->veloc_base.x.val += distance_with_angle_to_coord_x(64, cam->rotation_angle_x); @@ -245,7 +245,11 @@ long pinstfe_hand_whip(struct PlayerInfo *player, int32_t *n) shotst = get_shot_model_stats(thing->model); if (shotst->model_flags & ShMF_Boulder) { - thing->move_angle_xy = player->acamera->rotation_angle_x; + struct Camera* camera = get_player_active_camera(player); + if (camera != NULL) + { + thing->move_angle_xy = camera->rotation_angle_x; + } if (thing->model != ShM_SolidBoulder) // TODO CONFIG shot model dependency, make config option instead. { thing->health -= game.conf.rules[thing->owner].game.boulder_reduce_health_slap; @@ -321,7 +325,7 @@ long pinstfs_passenger_control_creature(struct PlayerInfo *player, int32_t *n) turn_off_menu(GMnu_CREATURE_QUERY1); turn_off_menu(GMnu_CREATURE_QUERY2); } - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); player->allocflags |= PlaF_KeyboardInputDisabled; player->dungeon_camera_zoom = get_camera_zoom(cam); // Play possession sound @@ -348,7 +352,7 @@ long pinstfs_direct_control_creature(struct PlayerInfo *player, int32_t *n) long pinstfm_control_creature(struct PlayerInfo *player, int32_t *n) { - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); if (cam == NULL) return 0; struct Thing* thing = thing_get(player->influenced_thing_idx); @@ -427,7 +431,7 @@ long pinstfe_direct_control_creature(struct PlayerInfo *player, int32_t *n) } if (!thing_exists(thing)) { - set_camera_zoom(player->acamera, player->dungeon_camera_zoom); + set_camera_zoom(get_player_active_camera(player), player->dungeon_camera_zoom); if (is_my_player(player)) { PaletteSetPlayerPalette(player, engine_palette); } @@ -509,9 +513,10 @@ long pinstfm_leave_creature(struct PlayerInfo *player, int32_t *n) { if (player->view_mode != PVM_FrontView) { - view_zoom_camera_out(player->acamera, 30000, 0); - if (get_camera_zoom(player->acamera) < player->dungeon_camera_zoom) { - set_camera_zoom(player->acamera, player->dungeon_camera_zoom); + struct Camera* camera = get_player_active_camera(player); + view_zoom_camera_out(camera, 30000, 0); + if (get_camera_zoom(camera) < player->dungeon_camera_zoom) { + set_camera_zoom(camera, player->dungeon_camera_zoom); } set_local_camera_destination(player); } @@ -549,7 +554,7 @@ long pinstfs_passenger_leave_creature(struct PlayerInfo *player, int32_t *n) long pinstfe_leave_creature(struct PlayerInfo *player, int32_t *n) { - set_camera_zoom(player->acamera, player->dungeon_camera_zoom); + set_camera_zoom(get_player_active_camera(player), player->dungeon_camera_zoom); if (is_my_player(player)) { PaletteSetPlayerPalette(player, engine_palette); } @@ -561,7 +566,7 @@ long pinstfe_leave_creature(struct PlayerInfo *player, int32_t *n) long pinstfs_query_creature(struct PlayerInfo *player, int32_t *n) { struct Thing* thing = thing_get(player->influenced_thing_idx); - player->dungeon_camera_zoom = get_camera_zoom(player->acamera); + player->dungeon_camera_zoom = get_camera_zoom(get_player_active_camera(player)); set_selected_creature(player, thing); unsigned char state = ( (player->work_state == PSt_QueryAll) || (player->work_state == PSt_CreatrInfoAll) ) ? PSt_CreatrInfoAll : PSt_CreatrInfo; set_player_state(player, state, 0); @@ -633,7 +638,7 @@ long pinstfs_zoom_out_of_heart(struct PlayerInfo *player, int32_t *n) if (thing_exists(thing)) leave_creature_as_controller(player, thing); set_player_mode(player, PVT_DungeonTop); - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); if (cam == NULL) return 0; thing = get_player_soul_container(player->id_number); @@ -669,7 +674,7 @@ long pinstfm_zoom_out_of_heart(struct PlayerInfo *player, int32_t *n) { if (player->view_mode != PVM_FrontView) { - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); struct Thing* thing = get_player_soul_container(player->id_number); long deltax; long deltay; @@ -705,7 +710,7 @@ long pinstfe_zoom_out_of_heart(struct PlayerInfo *player, int32_t *n) if (is_my_player(player)) { LbPaletteStopOpenFade(); } - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); if ((player->view_mode != PVM_FrontView) && (cam != NULL)) { cam->zoom = player->isometric_view_zoom_level; @@ -745,7 +750,7 @@ long pinstfe_control_creature_fade(struct PlayerInfo *player, int32_t *n) long pinstfs_fade_to_map(struct PlayerInfo *player, int32_t *n) { - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); player->palette_fade_step_map = 0; player->allocflags |= PlaF_MouseInputDisabled; player->view_mode_restore = cam->view_mode; @@ -839,7 +844,7 @@ long pinstfs_zoom_to_position(struct PlayerInfo *player, int32_t *n) player->controlled_thing_creatrn = 0; player->allocflags |= PlaF_MouseInputDisabled; player->allocflags |= PlaF_KeyboardInputDisabled; - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); int dt_x = (player->zoom_to_pos_x - (int)cam->mappos.x.val) / 8; int dt_y = (player->zoom_to_pos_y - (int)cam->mappos.y.val) / 8; if (dt_x < 0) @@ -868,7 +873,7 @@ long pinstfs_zoom_to_position(struct PlayerInfo *player, int32_t *n) long pinstfm_zoom_to_position(struct PlayerInfo *player, int32_t *n) { MapCoord x, y; - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); cam->inertia_x = 0; cam->inertia_y = 0; if (abs(cam->mappos.x.val - player->zoom_to_pos_x) >= abs(player->zoom_to_movement_x)) @@ -981,7 +986,8 @@ void leave_creature_as_controller(struct PlayerInfo *player, struct Thing *thing thing->rendering_flags &= ~TRF_Invisible; player->allocflags &= ~PlaF_CreaturePassengerMode; set_engine_view(player, player->view_mode_restore); - long i = player->acamera->rotation_angle_x; + struct Camera* cam = get_player_active_camera(player); + long i = (cam != NULL) ? cam->rotation_angle_x : 0; struct CreatureModelConfig* crconf = creature_stats_get_from_thing(thing); struct CreatureControl* cctrl = creature_control_get_from_thing(thing); long k = thing->mappos.z.val + get_creature_eye_height(thing); @@ -1029,7 +1035,8 @@ void leave_creature_as_passenger(struct PlayerInfo *player, struct Thing *thing) thing->rendering_flags &= ~TRF_Invisible; player->allocflags &= ~PlaF_CreaturePassengerMode; set_engine_view(player, player->view_mode_restore); - long i = player->acamera->rotation_angle_x; + struct Camera* cam = get_player_active_camera(player); + long i = (cam != NULL) ? cam->rotation_angle_x : 0; long k = thing->mappos.z.val + get_creature_eye_height(thing); player->cameras[CamIV_Isometric].mappos.x.val = thing->mappos.x.val + distance_with_angle_to_coord_x(k,i); player->cameras[CamIV_Isometric].mappos.y.val = thing->mappos.y.val + distance_with_angle_to_coord_y(k,i); diff --git a/src/player_utils.c b/src/player_utils.c index 7acd1a9c37..048364359d 100644 --- a/src/player_utils.c +++ b/src/player_utils.c @@ -1129,7 +1129,7 @@ void process_player_states(void) if ( (player->work_state == PSt_CreatrInfo) || (player->work_state == PSt_CreatrInfoAll) ) { struct Thing* thing = thing_get(player->controlled_thing_idx); - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); if ((cam != NULL) && thing_exists(thing)) { cam->mappos.x.val = thing->mappos.x.val; cam->mappos.y.val = thing->mappos.y.val; diff --git a/src/power_process.c b/src/power_process.c index 8cc416b847..534aa63135 100644 --- a/src/power_process.c +++ b/src/power_process.c @@ -237,6 +237,7 @@ void process_disease(struct Thing *creatng) void lightning_modify_palette(struct Thing *thing) { struct PlayerInfo* myplyr = get_my_player(); + struct Camera* camera = get_player_active_camera(myplyr); if (thing->health == 0) { @@ -244,7 +245,7 @@ void lightning_modify_palette(struct Thing *thing) myplyr->additional_flags &= ~PlaAF_LightningPaletteIsActive; return; } - if (myplyr->acamera == NULL) + if (camera == NULL) { ERRORLOG("No active camera"); return; @@ -253,7 +254,7 @@ void lightning_modify_palette(struct Thing *thing) { if ((myplyr->additional_flags & PlaAF_LightningPaletteIsActive) != 0) { - if (get_chessboard_distance(&myplyr->acamera->mappos, &thing->mappos) < 11520) + if (get_chessboard_distance(&camera->mappos, &thing->mappos) < 11520) { PaletteSetPlayerPalette(myplyr, engine_palette); myplyr->additional_flags &= ~PlaAF_LightningPaletteIsActive; @@ -265,7 +266,7 @@ void lightning_modify_palette(struct Thing *thing) { if ((myplyr->additional_flags & PlaAF_LightningPaletteIsActive) == 0) { - if (get_chessboard_distance(&myplyr->acamera->mappos, &thing->mappos) < 11520) + if (get_chessboard_distance(&camera->mappos, &thing->mappos) < 11520) { PaletteSetPlayerPalette(myplyr, lightning_palette); myplyr->additional_flags |= PlaAF_LightningPaletteIsActive; @@ -372,7 +373,7 @@ void god_lightning_choose_next_creature(struct Thing *shotng) void draw_god_lightning(struct Thing *shotng) { struct PlayerInfo* player = get_player(shotng->owner); - const struct Camera* cam = get_local_camera(player->acamera); + const struct Camera* cam = get_local_camera(get_player_active_camera(player)); if (cam == NULL) { return; } diff --git a/src/sounds.c b/src/sounds.c index 2275f7ef5b..3be35f4edd 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -118,7 +118,7 @@ void play_sound_if_close_to_receiver(struct Coord3d *soundpos, SoundSmplTblID sm void play_thing_walking(struct Thing *thing) { struct PlayerInfo* myplyr = get_my_player(); - struct Camera* cam = get_local_camera(myplyr->acamera); + struct Camera* cam = get_local_camera(get_player_active_camera(myplyr)); struct CreatureModelConfig* crconf; { // Skip the thing if its distance to camera is too big MapSubtlDelta dist_x = coord_subtile(abs(cam->mappos.x.val - (MapCoordDelta)thing->mappos.x.val)); @@ -222,7 +222,7 @@ void find_nearest_rooms_for_ambient_sound(void) if ((SoundDisabled) || (GetCurrentSoundMasterVolume() <= 0)) return; struct PlayerInfo* player = get_my_player(); - struct Camera* cam = get_local_camera(player->acamera); + struct Camera* cam = get_local_camera(get_player_active_camera(player)); if (cam == NULL || LbIsFrozenOrPaused()) { if (cam == NULL) @@ -264,7 +264,7 @@ void find_nearest_rooms_for_ambient_sound(void) TbBool update_3d_sound_receiver(struct PlayerInfo* player) { SYNCDBG(7, "Starting"); - struct Camera* cam = get_local_camera(player->acamera); + struct Camera* cam = get_local_camera(get_player_active_camera(player)); if (cam == NULL) return false; S3DSetSoundReceiverPosition(cam->mappos.x.val, cam->mappos.y.val, cam->mappos.z.val); diff --git a/src/thing_creature.c b/src/thing_creature.c index 92d7ee2e5c..59eb6d1cbc 100644 --- a/src/thing_creature.c +++ b/src/thing_creature.c @@ -238,7 +238,7 @@ TbBool control_creature_as_controller(struct PlayerInfo *player, struct Thing *t { if (!control_creature_as_passenger(player, thing)) return false; - cam = player->acamera; + cam = get_player_active_camera(player); crconf = creature_stats_get(get_players_special_digger_model(player->id_number)); cam->mappos.z.val += get_creature_eye_height(thing); return true; @@ -256,7 +256,7 @@ TbBool control_creature_as_controller(struct PlayerInfo *player, struct Thing *t turn_off_roaming_menus(); } set_selected_creature(player, thing); - cam = player->acamera; + cam = get_player_active_camera(player); if (cam != NULL) player->view_mode_restore = cam->view_mode; thing->alloc_flags |= TAlF_IsControlled; @@ -311,7 +311,7 @@ TbBool control_creature_as_passenger(struct PlayerInfo *player, struct Thing *th turn_off_roaming_menus(); } set_selected_thing(player, thing); - struct Camera* cam = player->acamera; + struct Camera* cam = get_player_active_camera(player); if (cam != NULL) player->view_mode_restore = cam->view_mode; set_player_mode(player, PVT_CreaturePasngr); @@ -3226,7 +3226,7 @@ void prepare_to_controlled_creature_death(struct Thing *thing) player->influenced_thing_creation = 0; if (player->id_number == thing->owner) setup_eye_lens(0); - set_camera_zoom(player->acamera, player->dungeon_camera_zoom); + set_camera_zoom(get_player_active_camera(player), player->dungeon_camera_zoom); if (player->id_number == thing->owner) { turn_off_all_window_menus(); diff --git a/src/thing_traps.c b/src/thing_traps.c index 53e93210dc..379545990a 100644 --- a/src/thing_traps.c +++ b/src/thing_traps.c @@ -664,8 +664,12 @@ void activate_trap_by_slap(struct PlayerInfo *player, struct Thing* traptng) { case TrpAcT_HeadforTarget90: case TrpAcT_CreatureShot: - external_activate_trap_shot_at_angle(traptng, player->acamera->rotation_angle_x, trgtng); + { + struct Camera* camera = get_player_active_camera(player); + if (camera != NULL) + external_activate_trap_shot_at_angle(traptng, camera->rotation_angle_x, trgtng); break; + } default: ERRORLOG("Illegal trap activation type %d (idx=%d)", (int)trapst->activation_type, traptng->index); break; From 8a7b1536f6f252fcc6cbadda4346010d5793a867 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Tue, 3 Mar 2026 21:01:22 +0100 Subject: [PATCH 13/16] comp dungeon --- src/player_compchecks.c | 64 +++++++-------- src/player_compevents.c | 48 ++++++------ src/player_compprocs.c | 54 ++++++------- src/player_comptask.c | 168 ++++++++++++++++++++-------------------- src/player_computer.c | 58 +++++++------- src/player_computer.h | 4 +- src/thing_creature.c | 2 +- 7 files changed, 200 insertions(+), 198 deletions(-) diff --git a/src/player_compchecks.c b/src/player_compchecks.c index 6243e1d9df..9f8194fcd4 100644 --- a/src/player_compchecks.c +++ b/src/player_compchecks.c @@ -140,7 +140,7 @@ struct ExpandRooms expand_rooms[] = { long computer_checks_hates(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* compdngn = comp->dungeon; + struct Dungeon* compdngn = computer_dungeon(comp); // Reference values for checking hate int cdngn_creatrs = count_creatures_in_dungeon(compdngn); int cdngn_spdiggrs = count_diggers_in_dungeon(compdngn); @@ -249,7 +249,7 @@ int calculate_number_of_creatures_to_move(struct Dungeon *dungeon, int percent_t long computer_check_move_creatures_to_best_room(struct Computer2 *comp, struct ComputerCheck * check) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); SYNCDBG(8,"Starting for player %d",(int)dungeon->owner); int num_to_move = calculate_number_of_creatures_to_move(dungeon, check->primary_parameter); @@ -277,7 +277,7 @@ long computer_check_move_creatures_to_best_room(struct Computer2 *comp, struct C long computer_check_move_creatures_to_room(struct Computer2 *comp, struct ComputerCheck * check) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); SYNCDBG(8,"Checking player %d for move to %s", (int)dungeon->owner, room_code_name(check->secondary_parameter)); int num_to_move = calculate_number_of_creatures_to_move(dungeon, check->primary_parameter); if (num_to_move <= 0) { @@ -445,7 +445,7 @@ long player_list_creature_filter_best_for_sacrifice(const struct Thing *thing, M static struct Thing *find_creature_for_sacrifice(struct Computer2 *comp, ThingModel crmodel) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); struct CompoundTngFilterParam param; param.plyr_idx = dungeon->owner; @@ -475,7 +475,7 @@ static struct Thing *find_creature_for_sacrifice(struct Computer2 *comp, ThingMo long computer_check_sacrifice_for_cheap_diggers(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon) || !player_has_heart(dungeon->owner)) { SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)dungeon->owner); return CTaskRet_Unk4; @@ -524,7 +524,7 @@ long computer_check_no_imps(struct Computer2 *comp, struct ComputerCheck * check if (computer_check_sacrifice_for_cheap_diggers(comp, check) == CTaskRet_Unk1) { return CTaskRet_Unk1; } - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon) || !player_has_heart(dungeon->owner)) { SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)dungeon->owner); return CTaskRet_Unk4; @@ -573,7 +573,7 @@ long computer_check_no_imps(struct Computer2 *comp, struct ComputerCheck * check if ((game.computer_chat_flags & CChat_TasksScarce) != 0) { struct PowerConfigStats* powerst = get_power_model_stats(PwrK_MKDIGGER); struct CreatureModelConfig* crconf = &game.conf.crtr_conf.model[get_players_special_digger_model(dungeon->owner)]; - message_add_fmt(MsgType_Player, comp->dungeon->owner, "My %s count is only %d, casting %s!",get_string(crconf->namestr_idx),(int)controlled_diggers,get_string(powerst->name_stridx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "My %s count is only %d, casting %s!",get_string(crconf->namestr_idx),(int)controlled_diggers,get_string(powerst->name_stridx)); } if (try_game_action(comp, dungeon->owner, GA_UseMkDigger, 0, stl_x, stl_y, 1, 1) > Lb_OK) { return CTaskRet_Unk1; @@ -586,7 +586,7 @@ long computer_check_no_imps(struct Computer2 *comp, struct ComputerCheck * check struct Thing * find_imp_for_pickup(struct Computer2 *comp, MapSubtlCoord stl_x, MapSubtlCoord stl_y) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); int pick1_dist = INT_MAX; int pick2_dist = INT_MAX; struct Thing* pick2_tng = INVALID_THING; @@ -649,7 +649,7 @@ struct Thing * find_imp_for_pickup(struct Computer2 *comp, MapSubtlCoord stl_x, long computer_check_for_pretty(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); MapSubtlCoord stl_x; MapSubtlCoord stl_y; if (!computer_able_to_use_power(comp, PwrK_HAND, 1, 1)) { @@ -688,7 +688,7 @@ struct Room *get_opponent_room(struct Computer2 *comp, PlayerNumber plyr_idx) if (dungeon_invalid(dungeon) || (game.conf.slab_conf.room_types_count < 1)) { return INVALID_ROOM; } - int n = opponent_room_kinds[PLAYER_RANDOM(comp->dungeon->owner, sizeof(opponent_room_kinds) / sizeof(opponent_room_kinds[0]))]; + int n = opponent_room_kinds[PLAYER_RANDOM(comp->dungeon_plyr_idx, sizeof(opponent_room_kinds) / sizeof(opponent_room_kinds[0]))]; for (int i = 0; i < game.conf.slab_conf.room_types_count; i++) { struct Room* room = room_get(dungeon->room_list_start[n]); @@ -702,14 +702,14 @@ struct Room *get_opponent_room(struct Computer2 *comp, PlayerNumber plyr_idx) struct Room *get_hated_room_for_quick_attack(struct Computer2 *comp) { - SYNCDBG(8,"Starting for player %d",(int)comp->dungeon->owner); + SYNCDBG(8,"Starting for player %d",(int)comp->dungeon_plyr_idx); struct THate hates[PLAYERS_COUNT]; get_opponent(comp, hates); // note that 'i' is not player index, player index is inside THate struct for (long i = 0; i < PLAYERS_COUNT; i++) { struct THate* hate = &hates[i]; - if (players_are_enemies(comp->dungeon->owner, hate->plyr_idx)) + if (players_are_enemies(comp->dungeon_plyr_idx, hate->plyr_idx)) { if (hate->pos_near != NULL) { @@ -732,7 +732,7 @@ struct Room *get_hated_room_for_quick_attack(struct Computer2 *comp) long computer_check_for_quick_attack(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long attack_percentage = check->primary_parameter; long cta_duration = check->secondary_parameter; long min_creatures_to_attack = check->tertiary_parameter; @@ -773,7 +773,7 @@ long computer_check_for_quick_attack(struct Computer2 *comp, struct ComputerChec struct Thing *computer_check_creatures_in_room_for_accelerate(struct Computer2 *comp, struct Room *room) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long i = room->creatures_list; unsigned long k = 0; while (i != 0) @@ -813,7 +813,7 @@ struct Thing *computer_check_creatures_in_room_for_accelerate(struct Computer2 * struct Thing *computer_check_creatures_in_room_for_flight(struct Computer2 *comp, struct Room *room) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long i = room->creatures_list; unsigned long k = 0; while (i != 0) @@ -853,7 +853,7 @@ struct Thing *computer_check_creatures_in_room_for_flight(struct Computer2 *comp struct Thing *computer_check_creatures_in_room_for_vision(struct Computer2 *comp, struct Room *room) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long i = room->creatures_list; unsigned long k = 0; while (i != 0) @@ -898,7 +898,7 @@ struct Thing *computer_check_creatures_in_dungeon_rooms_of_kind_for_accelerate(s ERRORLOG("Invalid room kind %d",(int)rkind); return INVALID_THING; } - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon)) { ERRORLOG("Invalid computer players dungeon"); @@ -937,7 +937,7 @@ struct Thing *computer_check_creatures_in_dungeon_rooms_of_kind_for_flight(struc ERRORLOG("Invalid room kind %d",(int)rkind); return INVALID_THING; } - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon)) { ERRORLOG("Invalid computer players dungeon"); @@ -976,7 +976,7 @@ struct Thing *computer_check_creatures_in_dungeon_rooms_of_kind_for_vision(struc ERRORLOG("Invalid room kind %d",(int)rkind); return INVALID_THING; } - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon)) { ERRORLOG("Invalid computer players dungeon"); @@ -1020,7 +1020,7 @@ long computer_check_for_accelerate(struct Computer2 *comp, struct ComputerCheck } long n = check->primary_parameter % (sizeof(workers_in_rooms) / sizeof(workers_in_rooms[0])); if (n <= 0) - n = PLAYER_RANDOM(comp->dungeon->owner, sizeof(workers_in_rooms)/sizeof(workers_in_rooms[0])); + n = PLAYER_RANDOM(comp->dungeon_plyr_idx, sizeof(workers_in_rooms)/sizeof(workers_in_rooms[0])); for (long i = 0; i < sizeof(workers_in_rooms) / sizeof(workers_in_rooms[0]); i++) { struct Thing* thing = computer_check_creatures_in_dungeon_rooms_of_kind_for_accelerate(comp, workers_in_rooms[n]); @@ -1046,7 +1046,7 @@ long computer_check_for_flight(struct Computer2 *comp, struct ComputerCheck * ch } long n = check->primary_parameter % (sizeof(workers_in_rooms) / sizeof(workers_in_rooms[0])); if (n <= 0) - n = PLAYER_RANDOM(comp->dungeon->owner, sizeof(workers_in_rooms)/sizeof(workers_in_rooms[0])); + n = PLAYER_RANDOM(comp->dungeon_plyr_idx, sizeof(workers_in_rooms)/sizeof(workers_in_rooms[0])); for (long i = 0; i < sizeof(workers_in_rooms) / sizeof(workers_in_rooms[0]); i++) { struct Thing* thing = computer_check_creatures_in_dungeon_rooms_of_kind_for_flight(comp, workers_in_rooms[n]); @@ -1072,7 +1072,7 @@ long computer_check_for_vision(struct Computer2 *comp, struct ComputerCheck * ch } long n = check->primary_parameter % (sizeof(workers_in_rooms) / sizeof(workers_in_rooms[0])); if (n <= 0) - n = PLAYER_RANDOM(comp->dungeon->owner, sizeof(workers_in_rooms)/sizeof(workers_in_rooms[0])); + n = PLAYER_RANDOM(comp->dungeon_plyr_idx, sizeof(workers_in_rooms)/sizeof(workers_in_rooms[0])); for (long i = 0; i < sizeof(workers_in_rooms) / sizeof(workers_in_rooms[0]); i++) { struct Thing* thing = computer_check_creatures_in_dungeon_rooms_of_kind_for_vision(comp, workers_in_rooms[n]); @@ -1091,7 +1091,7 @@ long computer_check_slap_imps(struct Computer2 *comp, struct ComputerCheck * che SYNCDBG(8,"Starting"); long slap_percentage = check->primary_parameter; TbBool skip_imps_with_speed = check->secondary_parameter; - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (!is_power_available(dungeon->owner, PwrK_SLAP)) { return CTaskRet_Unk4; } @@ -1111,10 +1111,10 @@ long computer_check_enemy_entrances(struct Computer2 *comp, struct ComputerCheck long result = CTaskRet_Unk4; for (PlayerNumber plyr_idx = 0; plyr_idx < PLAYERS_COUNT; plyr_idx++) { - if (comp->dungeon->owner == plyr_idx) { + if (comp->dungeon_plyr_idx == plyr_idx) { continue; } - if (players_are_mutual_allies(comp->dungeon->owner, plyr_idx)) { + if (players_are_mutual_allies(comp->dungeon_plyr_idx, plyr_idx)) { continue; } struct Dungeon* dungeon = get_dungeon(plyr_idx); @@ -1223,7 +1223,7 @@ static TbBool find_place_to_put_door_around_room(const struct Room *room, struct long computer_check_for_place_door(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); for (ThingModel doorkind = game.conf.trapdoor_conf.door_types_count; doorkind > 1; doorkind--) { if (dungeon->mnfct_info.door_amount_stored[doorkind] <= 0) { @@ -1272,7 +1272,7 @@ long computer_check_for_place_door(struct Computer2 *comp, struct ComputerCheck long computer_check_neutral_places(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon) || !player_has_heart(dungeon->owner)) { SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)dungeon->owner); return CTaskRet_Unk4; @@ -1356,7 +1356,7 @@ int count_slabs_around_of_kind(MapSlabCoord slb_x, MapSlabCoord slb_y, SlabKind */ TbBool computer_check_for_expand_specific_room(struct Computer2 *comp, struct ComputerCheck * check, struct Room *room, MapSubtlCoord max_radius, long around_start) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (!is_room_available(dungeon->owner, room->kind)) { return false; } @@ -1411,7 +1411,7 @@ TbBool computer_check_for_expand_specific_room(struct Computer2 *comp, struct Co TbBool computer_check_for_expand_room_kind(struct Computer2 *comp, struct ComputerCheck * check, RoomKind rkind, long max_slabs, long around_start) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); { struct RoomConfigStats* roomst = get_room_kind_stats(rkind); // If we don't have money for the room - don't even try @@ -1454,7 +1454,7 @@ TbBool computer_check_for_expand_room_kind(struct Computer2 *comp, struct Comput long computer_check_for_expand_room(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon) || !player_has_heart(dungeon->owner)) { SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)dungeon->owner); return CTaskRet_Unk4; @@ -1486,8 +1486,8 @@ long computer_check_for_expand_room(struct Computer2 *comp, struct ComputerCheck long computer_check_prison_tendency(struct Computer2* comp, struct ComputerCheck* check) { SYNCDBG(8, "Starting"); - struct Dungeon* dungeon = comp->dungeon; - struct PlayerInfo* player = get_player(comp->dungeon->owner); + struct Dungeon* dungeon = computer_dungeon(comp); + struct PlayerInfo* player = get_player(comp->dungeon_plyr_idx); RoomRole rrole = get_room_role_for_job(Job_CAPTIVITY); int status = check->primary_parameter; diff --git a/src/player_compevents.c b/src/player_compevents.c index 2ab0c5cc24..862197d09f 100644 --- a/src/player_compevents.c +++ b/src/player_compevents.c @@ -167,12 +167,12 @@ long computer_event_battle(struct Computer2 *comp, struct ComputerEvent *cevent, { SYNCDBG(18,"Starting for %s",cevent->name); struct Coord3d pos; - if (!get_computer_drop_position_near_subtile(&pos, comp->dungeon, coord_subtile(event->mappos_x), coord_subtile(event->mappos_y))) { + if (!get_computer_drop_position_near_subtile(&pos, computer_dungeon(comp), coord_subtile(event->mappos_x), coord_subtile(event->mappos_y))) { SYNCDBG(8,"No drop position near (%d,%d) for %s",(int)coord_subtile(event->mappos_x),(int)coord_subtile(event->mappos_y),cevent->name); return CTaskRet_Unk0; } // Check if there are any enemies in the vicinity - no enemies, don't drop creatures - struct Thing* enmtng = get_creature_in_range_who_is_enemy_of_able_to_attack_and_not_specdigger(pos.x.val, pos.y.val, 21, comp->dungeon->owner); + struct Thing* enmtng = get_creature_in_range_who_is_enemy_of_able_to_attack_and_not_specdigger(pos.x.val, pos.y.val, 21, comp->dungeon_plyr_idx); if (thing_is_invalid(enmtng)) { SYNCDBG(8,"No enemies near %s",cevent->name); @@ -248,7 +248,7 @@ struct Thing *find_creature_in_fight_with_enemy(struct Computer2 *comp) { struct CreatureControl *cctrl; struct Thing *creatng; - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); // Search through special diggers unsigned long k = 0; int i = dungeon->digger_list_start; @@ -309,7 +309,7 @@ struct Thing *find_creature_in_fight_with_enemy(struct Computer2 *comp) long computer_event_battle_test(struct Computer2 *comp, struct ComputerEvent *cevent) { - if (comp->dungeon->fights_num <= 0) { + if (computer_dungeon(comp)->fights_num <= 0) { return CTaskRet_Unk4; } struct Thing* creatng = find_creature_in_fight_with_enemy(comp); @@ -365,12 +365,12 @@ long computer_event_battle_test(struct Computer2 *comp, struct ComputerEvent *ce struct Thing *computer_get_creature_in_fight(struct Computer2 *comp, PowerKind pwkind) { struct PowerConfigStats *powerst = get_power_model_stats(pwkind); - return find_players_highest_score_creature_in_fight_not_affected_by_spell(comp->dungeon->owner, powerst->spell_idx); + return find_players_highest_score_creature_in_fight_not_affected_by_spell(comp->dungeon_plyr_idx, powerst->spell_idx); } long computer_event_check_fighters(struct Computer2 *comp, struct ComputerEvent *cevent) { - if (comp->dungeon->fights_num <= 0) + if (computer_dungeon(comp)->fights_num <= 0) { return CTaskRet_Unk4; } @@ -413,7 +413,7 @@ long computer_event_check_fighters(struct Computer2 *comp, struct ComputerEvent PowerKind computer_choose_attack_spell(struct Computer2 *comp, struct ComputerEvent *cevent, struct Thing *creatng) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); struct PowerConfigStats *powerst; struct SpellConfig *spconf; int i = (cevent->tertiary_parameter + 1) % (sizeof(computer_attack_spells) / sizeof(computer_attack_spells[0])); @@ -454,7 +454,7 @@ PowerKind computer_choose_attack_spell(struct Computer2 *comp, struct ComputerEv long computer_event_attack_magic_foe(struct Computer2 *comp, struct ComputerEvent *cevent) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon->fights_num <= 0) { return CTaskRet_Unk4; } @@ -506,13 +506,13 @@ long computer_event_check_rooms_full(struct Computer2 *comp, struct ComputerEven continue; } struct RoomConfigStats* roomst = &game.conf.slab_conf.room_cfgstats[bldroom->rkind]; - int tiles = get_room_slabs_count(comp->dungeon->owner,bldroom->rkind); + int tiles = get_room_slabs_count(comp->dungeon_plyr_idx,bldroom->rkind); if ((tiles >= cevent->tertiary_parameter) && !(cevent->tertiary_parameter == 0)) // Room has reached the preconfigured maximum size { - SYNCDBG(8,"Player %d reached maximum size %d for %s",(int)comp->dungeon->owner,tiles,room_code_name(bldroom->rkind)); + SYNCDBG(8,"Player %d reached maximum size %d for %s",(int)comp->dungeon_plyr_idx,tiles,room_code_name(bldroom->rkind)); if (room_role_matches(bldroom->rkind, RoRoF_CratesManufctr)) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); int32_t used_capacity; int32_t total_capacity; int32_t storaged_capacity; @@ -522,7 +522,7 @@ long computer_event_check_rooms_full(struct Computer2 *comp, struct ComputerEven if (!is_task_in_progress(comp, CTT_SellTrapsAndDoors)) { create_task_sell_traps_and_doors(comp, storaged_capacity/3*2 ,100000,false); - SYNCDBG(8,"Player %d to sell crates to free up space in %s",(int)comp->dungeon->owner,room_code_name(bldroom->rkind)); + SYNCDBG(8,"Player %d to sell crates to free up space in %s",(int)comp->dungeon_plyr_idx,room_code_name(bldroom->rkind)); } } } @@ -532,7 +532,7 @@ long computer_event_check_rooms_full(struct Computer2 *comp, struct ComputerEven if (emergency_state && ((roomst->flags & RoCFlg_BuildTillBroke) == 0)) { continue; } - SYNCDBG(8,"Player %d needs %s",(int)comp->dungeon->owner,room_code_name(bldroom->rkind)); + SYNCDBG(8,"Player %d needs %s",(int)comp->dungeon_plyr_idx,room_code_name(bldroom->rkind)); // Find the corresponding build process and mark it as needed for (long i = 0; i <= COMPUTER_PROCESSES_COUNT; i++) { @@ -541,7 +541,7 @@ long computer_event_check_rooms_full(struct Computer2 *comp, struct ComputerEven break; if (cproc->parent == bldroom->process_idx) { - SYNCDBG(8,"Player %d will allow process \"%s\"",(int)comp->dungeon->owner,cproc->name); + SYNCDBG(8,"Player %d will allow process \"%s\"",(int)comp->dungeon_plyr_idx,cproc->name); ret = CTaskRet_Unk1; reactivate_build_process(comp, bldroom->rkind); } @@ -560,14 +560,14 @@ long computer_event_attack_door(struct Computer2* comp, struct ComputerEvent* ce SYNCDBG(8, "Target %s is not a door", thing_model_name(thing)); return CTaskRet_Unk0; } - if (!players_are_enemies(comp->dungeon->owner, thing->owner)) + if (!players_are_enemies(comp->dungeon_plyr_idx, thing->owner)) { SYNCDBG(8, "Door owner is no longer an enemy"); return CTaskRet_Unk0; } struct Coord3d freepos; - if (!get_computer_drop_position_next_to_subtile(&freepos, comp->dungeon, coord_subtile(event->mappos_x), coord_subtile(event->mappos_y))) { + if (!get_computer_drop_position_next_to_subtile(&freepos, computer_dungeon(comp), coord_subtile(event->mappos_x), coord_subtile(event->mappos_y))) { SYNCDBG(18, "No drop position near (%d,%d) for %s", (int)coord_subtile(event->mappos_x), (int)coord_subtile(event->mappos_y), cevent->name); return CTaskRet_Unk0; } @@ -633,7 +633,7 @@ long computer_event_attack_door(struct Computer2* comp, struct ComputerEvent* ce long computer_event_handle_prisoner(struct Computer2* comp, struct ComputerEvent* cevent, struct Event* event) { SYNCDBG(18, "Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); struct Thing* creatng = thing_get(event->target); struct CreatureControl* cctrl = creature_control_get_from_thing(creatng); struct CreatureModelConfig* crconf = creature_stats_get_from_thing(creatng); @@ -678,7 +678,7 @@ long computer_event_handle_prisoner(struct Computer2* comp, struct ComputerEvent { if (computer_able_to_use_power(comp, PwrK_HEALCRTR, power_level, amount)) { - magic_use_available_power_on_thing(comp->dungeon->owner, PwrK_HEALCRTR, power_level, 0, 0, creatng, PwMod_Default); + magic_use_available_power_on_thing(comp->dungeon_plyr_idx, PwrK_HEALCRTR, power_level, 0, 0, creatng, PwMod_Default); return CTaskRet_Unk1; } return CTaskRet_Unk4; @@ -691,7 +691,7 @@ long computer_event_handle_prisoner(struct Computer2* comp, struct ComputerEvent long computer_event_rebuild_room(struct Computer2* comp, struct ComputerEvent* cevent, struct Event* event) { SYNCDBG(18, "Starting"); - if (count_slabs_of_room_type(comp->dungeon->owner, event->target) == 0) + if (count_slabs_of_room_type(comp->dungeon_plyr_idx, event->target) == 0) { for (int i = 0; i < COMPUTER_PROCESSES_COUNT + 1; i++) { @@ -700,7 +700,7 @@ long computer_event_rebuild_room(struct Computer2* comp, struct ComputerEvent* c break; if ((cproc->func_check == cpfl_computer_check_any_room) && (cproc->process_configuration_value_4 == event->target)) { - SYNCDBG(8,"Resetting process for player %d to build room %s", (int)comp->dungeon->owner, room_code_name(event->target)); + SYNCDBG(8,"Resetting process for player %d to build room %s", (int)comp->dungeon_plyr_idx, room_code_name(event->target)); clear_flag(cproc->flags, (ComProc_Unkn0008|ComProc_Unkn0001)); cproc->last_run_turn = 0; } @@ -711,7 +711,7 @@ long computer_event_rebuild_room(struct Computer2* comp, struct ComputerEvent* c long computer_event_save_tortured(struct Computer2* comp, struct ComputerEvent* cevent) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); int health_permil = (cevent->primary_parameter * 10); // Do not check for PwrK_HAND here; this would prevent the computer from taking other actions without it! // Do we have a prison to put the unit back into? @@ -731,7 +731,7 @@ long computer_event_save_tortured(struct Computer2* comp, struct ComputerEvent* struct Dungeon* victdungeon; for (int j = 0; j < DUNGEONS_COUNT; j++) { - if (j == comp->dungeon->owner) + if (j == comp->dungeon_plyr_idx) { continue; } @@ -803,7 +803,7 @@ long computer_event_save_tortured(struct Computer2* comp, struct ComputerEvent* long computer_event_check_imps_in_danger(struct Computer2 *comp, struct ComputerEvent *cevent) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon->fights_num <= 0) { return CTaskRet_Unk4; } @@ -878,7 +878,7 @@ long computer_event_check_imps_in_danger(struct Computer2 *comp, struct Computer long computer_event_check_payday(struct Computer2 *comp, struct ComputerEvent *cevent,struct Event *event) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon->total_money_owned >= dungeon->creatures_total_pay) { return CTaskRet_Unk4; } diff --git a/src/player_compprocs.c b/src/player_compprocs.c index 421ed1b07e..bc21b54a85 100644 --- a/src/player_compprocs.c +++ b/src/player_compprocs.c @@ -124,7 +124,7 @@ long computer_setup_any_room(struct Computer2 *comp, struct ComputerProcess *cpr struct ComputerTask* ctask = computer_setup_build_room(comp, cproc->process_configuration_value_4, cproc->process_configuration_value_2, cproc->process_configuration_value_3, cproc->process_configuration_value_5); if (!computer_task_invalid(ctask)) { - SYNCDBG(8,"Computer %d created task for \"%s\"",(int)comp->dungeon->owner,cproc->name); + SYNCDBG(8,"Computer %d created task for \"%s\"",(int)comp->dungeon_plyr_idx,cproc->name); set_flag(cproc->flags, ComProc_Unkn0020); long i = (long)((char*)cproc - (char*)&comp->processes[0]) / sizeof(struct ComputerProcess); if ((i < 0) || (i > COMPUTER_PROCESSES_COUNT)) @@ -158,7 +158,7 @@ long computer_setup_any_room_continue(struct Computer2 *comp, struct ComputerPro struct ComputerTask* ctask = computer_setup_build_room(comp, cproc->process_configuration_value_4, cproc->process_configuration_value_2, cproc->process_configuration_value_3, cproc->process_configuration_value_5); if (!computer_task_invalid(ctask)) { - SYNCDBG(8,"Computer %d created task for \"%s\"",(int)comp->dungeon->owner,cproc->name); + SYNCDBG(8,"Computer %d created task for \"%s\"",(int)comp->dungeon_plyr_idx,cproc->name); set_flag(cproc->flags, ComProc_Unkn0020); long i = (long)((char*)cproc - (char*)&comp->processes[0]) / sizeof(struct ComputerProcess); if ((i < 0) || (i > COMPUTER_PROCESSES_COUNT)) @@ -285,7 +285,7 @@ struct ComputerTask *get_room_build_task_nearest_to(const struct Computer2 *comp */ long computer_check_build_all_rooms(struct Computer2 *comp, struct ComputerProcess *cproc) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (count_no_room_build_tasks(comp) >= comp->max_room_build_tasks) { return CProcRet_Wait; } @@ -305,7 +305,7 @@ long computer_check_build_all_rooms(struct Computer2 *comp, struct ComputerProce long computer_get_room_role_total_capacity(struct Computer2 *comp, RoomRole rrole) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); int32_t used_capacity_kind; int32_t total_capacity_kind; long total_capacity = 0; @@ -326,7 +326,7 @@ long computer_get_room_role_total_capacity(struct Computer2 *comp, RoomRole rrol long computer_get_room_kind_free_capacity(struct Computer2 *comp, RoomKind room_kind) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (room_role_matches(room_kind, RoRoF_FoodStorage)) { return 9999; @@ -336,7 +336,7 @@ long computer_get_room_kind_free_capacity(struct Computer2 *comp, RoomKind room_ if (!dungeon_has_room(dungeon, room_kind)) { return 9999; } - return calculate_free_lair_space(comp->dungeon); + return calculate_free_lair_space(computer_dungeon(comp)); } int32_t used_capacity; int32_t total_capacity; @@ -349,7 +349,7 @@ long computer_get_room_kind_free_capacity(struct Computer2 *comp, RoomKind room_ long computer_check_any_room(struct Computer2 *comp, struct ComputerProcess *cproc) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); ItemAvailability is_avail = computer_check_room_available(comp, cproc->process_configuration_value_4); if (is_avail != IAvail_Now) { @@ -394,7 +394,7 @@ long computer_check_any_room(struct Computer2 *comp, struct ComputerProcess *cpr static PlayerNumber get_player_with_more_entrances_than_computer(const struct Computer2 *comp, int *max_entr_count) { - const struct Dungeon* dungeon = comp->dungeon; + const struct Dungeon* dungeon = computer_dungeon(comp); PlayerNumber max_plyr_idx = -1; *max_entr_count = dungeon->room_discrete_count[RoK_ENTRANCE]; for (PlayerNumber plyr_idx = 0; plyr_idx < PLAYERS_COUNT; plyr_idx++) @@ -418,7 +418,7 @@ static PlayerNumber get_player_with_more_entrances_than_computer(const struct Co */ TbBool there_is_virgin_entrance_for_computer(const struct Computer2 *comp) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long i = game.entrance_room_id; unsigned long k = 0; while (i != 0) @@ -450,7 +450,7 @@ TbBool there_is_virgin_entrance_for_computer(const struct Computer2 *comp) long computer_check_dig_to_entrance(struct Computer2 *comp, struct ComputerProcess *cproc) { SYNCDBG(18,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); int neutral_entrances = count_entrances(comp, game.neutral_player_num); if (is_task_in_progress(comp, CTT_DigToEntrance)) { return CProcRet_Wait; @@ -483,7 +483,7 @@ long computer_check_dig_to_entrance(struct Computer2 *comp, struct ComputerProce long computer_finds_nearest_entrance2(struct Computer2 *comp, struct Coord3d *startpos, struct Room **retroom, short from_plyr_idx) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (from_plyr_idx < 0) from_plyr_idx = game.neutral_player_num; struct Room* near_entroom = NULL; @@ -619,7 +619,7 @@ long move_imp_to_dig_here(struct Computer2 *comp, struct Coord3d *pos, long max_ long amount_did = 0; if (!is_task_in_progress_using_hand(comp)) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); unsigned long k = 0; int i = dungeon->digger_list_start; while (i != 0) @@ -660,7 +660,7 @@ long move_imp_to_mine_here(struct Computer2 *comp, struct Coord3d *pos, long max long amount_did = 0; if (!is_task_in_progress_using_hand(comp)) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); unsigned long k = 0; int i = dungeon->digger_list_start; while (i != 0) @@ -718,7 +718,7 @@ TbBool right_time_to_choose_target_entrance(struct ComputerProcess *cproc, long */ TbBool simulate_dig_to(struct Computer2 *comp, struct Coord3d *startpos, const struct Coord3d *endpos, uint32_t *dig_distance, DigFlags digflags) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); struct ComputerDig cdig; ToolDigResult dig_result; // Setup the digging on dummy ComputerDig, to compute distance and move start position near to wall @@ -751,7 +751,7 @@ TbBool simulate_dig_to(struct Computer2 *comp, struct Coord3d *startpos, const s long computer_setup_dig_to_entrance(struct Computer2 *comp, struct ComputerProcess *cproc) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); // Let's find a player with highest number of entrance rooms PlayerNumber targplyr_idx = -1; long targplyr_entrances = 0; @@ -842,7 +842,7 @@ long computer_setup_dig_to_entrance(struct Computer2 *comp, struct ComputerProce long computer_setup_dig_to_gold(struct Computer2 *comp, struct ComputerProcess *cproc) { SYNCDBG(18,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); struct GoldLookup* gldlook = NULL; struct Coord3d startpos; long digres = computer_finds_nearest_room_to_gold(comp, &startpos, &gldlook); @@ -912,7 +912,7 @@ long computer_setup_dig_to_gold(struct Computer2 *comp, struct ComputerProcess * long computer_check_dig_to_gold(struct Computer2 *comp, struct ComputerProcess *cproc) { // If we have treasure room - if (!dungeon_has_room_of_role(comp->dungeon, RoRoF_GoldStorage)) + if (!dungeon_has_room_of_role(computer_dungeon(comp), RoRoF_GoldStorage)) { SYNCDBG(8,"Computer player model %d won't dig for gold - no treasure room.",(int)comp->model); return CProcRet_Wait; @@ -935,7 +935,7 @@ long computer_check_dig_to_gold(struct Computer2 *comp, struct ComputerProcess * long computer_check_sight_of_evil(struct Computer2 *comp, struct ComputerProcess *cproc) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (cproc->process_configuration_value_4 >= game.play_gameturn) { return CProcRet_Wait; } @@ -955,14 +955,14 @@ long computer_check_sight_of_evil(struct Computer2 *comp, struct ComputerProcess TbBool hate_filter_any_enemy_no_matter_how_strong(const struct Computer2 *comp, const struct ComputerProcess *cproc, const struct THate *hate) { - if (!players_are_enemies(comp->dungeon->owner, hate->plyr_idx)) + if (!players_are_enemies(comp->dungeon_plyr_idx, hate->plyr_idx)) return false; return true; } TbBool hate_filter_enemy_with_not_many_creatures(const struct Computer2 *comp, const struct ComputerProcess *cproc, const struct THate *hate) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (!players_are_enemies(dungeon->owner, hate->plyr_idx)) return false; struct Dungeon* enmdngn = get_players_num_dungeon(hate->plyr_idx); @@ -971,7 +971,7 @@ TbBool hate_filter_enemy_with_not_many_creatures(const struct Computer2 *comp, c long computer_check_attack_with_filter(struct Computer2 *comp, struct ComputerProcess *cproc, Comp_HateTest_Func hate_filter) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); SYNCDBG(8,"Starting for player %d",(int)dungeon->owner); int max_crtrs = dungeon->max_creatures_attracted; if (max_crtrs <= 0) { @@ -1031,7 +1031,7 @@ static long computer_look_for_opponent(struct Computer2 *comp, MapSubtlCoord stl int current_idx; struct Coord3d *pos; - struct Dungeon *dungeon = comp->dungeon; + struct Dungeon *dungeon = computer_dungeon(comp); PlayerBitFlags potential_opponents = to_flag(dungeon->owner); MapSubtlDelta radius = range / 2; @@ -1102,7 +1102,7 @@ static long computer_look_for_opponent(struct Computer2 *comp, MapSubtlCoord stl long computer_process_sight_of_evil(struct Computer2 *comp, struct ComputerProcess *cproc) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (comp->tasks_did <= 0) { return CProcRet_Wait; } @@ -1171,7 +1171,7 @@ long computer_completed_task(struct Computer2 *comp, struct ComputerProcess *cpr long computer_completed_attack1(struct Computer2 *comp, struct ComputerProcess *cproc) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); int creatrs_num = cproc->process_configuration_value_2 * dungeon->num_active_creatrs / 100; comp->task_state = CTaskSt_Select; struct ComputerTask* ctask = get_computer_task(cproc->process_parameter_5); @@ -1283,8 +1283,8 @@ struct ComputerProcess * find_best_process(struct Computer2 *comp) struct ComputerProcess* best_cproc = INVALID_COMPUTER_PROCESS; long best_prior = INT32_MIN; // Computer players without heart can't start any process - if (dungeon_invalid(comp->dungeon) || !player_has_heart(comp->dungeon->owner)) { - SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)comp->dungeon->owner); + if (dungeon_invalid(computer_dungeon(comp)) || !player_has_heart(comp->dungeon_plyr_idx)) { + SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)comp->dungeon_plyr_idx); return best_cproc; } @@ -1355,7 +1355,7 @@ long set_next_process(struct Computer2 *comp) struct ComputerProcess* cproc = find_best_process(comp); if (cproc != INVALID_COMPUTER_PROCESS) { - SYNCDBG(8,"Checking \"%s\" for player %d",cproc->name,(int)comp->dungeon->owner); + SYNCDBG(8,"Checking \"%s\" for player %d",cproc->name,(int)comp->dungeon_plyr_idx); chkres = computer_process_func_list[cproc->func_check](comp, cproc); if (chkres == CProcRet_Continue) { diff --git a/src/player_comptask.c b/src/player_comptask.c index 129819b683..bbfd733371 100644 --- a/src/player_comptask.c +++ b/src/player_comptask.c @@ -609,7 +609,7 @@ void computer_pick_thing_by_hand(struct Computer2 *comp, struct Thing *thing) external_set_thing_state(thing, CrSt_InPowerHand); remove_all_traces_of_combat(thing); } - thing->holding_player = comp->dungeon->owner; + thing->holding_player = comp->dungeon_plyr_idx; place_thing_in_limbo(thing); } @@ -652,7 +652,7 @@ short computer_dump_held_things_on_map(struct Computer2 *comp, struct Thing *dro return 0; } } - if (!can_place_thing_here(droptng, pos->x.stl.num, pos->y.stl.num, comp->dungeon->owner)) { + if (!can_place_thing_here(droptng, pos->x.stl.num, pos->y.stl.num, comp->dungeon_plyr_idx)) { return 0; } struct Coord3d locpos; @@ -679,14 +679,14 @@ short computer_dump_held_things_on_map(struct Computer2 *comp, struct Thing *dro locpos.z.val += i; if (thing_is_object(droptng) && object_is_gold_pile(droptng)) { - drop_gold_coins(pos, droptng->valuable.gold_stored, comp->dungeon->owner); - if (is_my_player_number(comp->dungeon->owner)) { + drop_gold_coins(pos, droptng->valuable.gold_stored, comp->dungeon_plyr_idx); + if (is_my_player_number(comp->dungeon_plyr_idx)) { play_non_3d_sample(88); } delete_thing_structure(droptng, 0); } else { - drop_held_thing_on_ground(comp->dungeon, droptng, &locpos); + drop_held_thing_on_ground(computer_dungeon(comp), droptng, &locpos); } comp->held_thing_idx = 0; comp->tasks_did--; @@ -695,8 +695,8 @@ short computer_dump_held_things_on_map(struct Computer2 *comp, struct Thing *dro long computer_place_thing_in_power_hand(struct Computer2 *comp, struct Thing *thing, struct Coord3d *pos) { - SYNCDBG(9,"Player %d picks %s index %d",(int)comp->dungeon->owner,thing_model_name(thing),(int)thing->index); - if (!can_thing_be_picked_up_by_player(thing, comp->dungeon->owner)) { + SYNCDBG(9,"Player %d picks %s index %d",(int)comp->dungeon_plyr_idx,thing_model_name(thing),(int)thing->index); + if (!can_thing_be_picked_up_by_player(thing, comp->dungeon_plyr_idx)) { ERRORLOG("Computer tries to pick up %s index %d which is not pickable", thing_model_name(thing),(int)thing->index); return 0; } @@ -708,7 +708,7 @@ long computer_place_thing_in_power_hand(struct Computer2 *comp, struct Thing *th SYNCDBG(7,"Computer tries to pick up %s index %d which is to be dropped on solid block", thing_model_name(thing),(int)thing->index); return 0; } - if (!can_place_thing_here(thing, pos->x.stl.num, pos->y.stl.num, comp->dungeon->owner)) { + if (!can_place_thing_here(thing, pos->x.stl.num, pos->y.stl.num, comp->dungeon_plyr_idx)) { SYNCDBG(7,"Computer tries to pick up %s index %d which cannot be dropped at given place", thing_model_name(thing),(int)thing->index); return 0; } @@ -739,7 +739,7 @@ TbBool computer_force_dump_held_things_on_map(struct Computer2 *comp, const stru locpos.x.val = subtile_coord_center(pos->x.stl.num); locpos.y.val = subtile_coord_center(pos->y.stl.num); locpos.z.val = get_thing_height_at(thing, &locpos); - drop_held_thing_on_ground(comp->dungeon, thing, &locpos); + drop_held_thing_on_ground(computer_dungeon(comp), thing, &locpos); comp->held_thing_idx = 0; return true; } @@ -754,7 +754,7 @@ TbBool computer_force_dump_specific_held_thing(struct Computer2 *comp, struct Th locpos.x.val = subtile_coord_center(pos->x.stl.num); locpos.y.val = subtile_coord_center(pos->y.stl.num); locpos.z.val = get_thing_height_at(thing, &locpos); - drop_held_thing_on_ground(comp->dungeon, thing, &locpos); + drop_held_thing_on_ground(computer_dungeon(comp), thing, &locpos); comp->held_thing_idx = 0; return true; } @@ -766,7 +766,7 @@ TbBool creature_could_be_placed_in_better_room(const struct Computer2 *comp, con long k; TbBool better_job_allowed; SYNCDBG(19,"Starting for %s index %d owner %d",thing_model_name(thing),(int)thing->index,(int)thing->owner); - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); if (thing_is_creature(thing) && creature_is_leaving_and_cannot_be_stopped(thing)) { return false; @@ -812,7 +812,7 @@ CreatureJob get_job_to_place_creature_in_room(const struct Computer2 *comp, cons int32_t total_spare_cap; long k; - const struct Dungeon *dungeon = comp->dungeon; + const struct Dungeon *dungeon = computer_dungeon(comp); chosen_job = Job_NULL; chosen_priority = INT32_MIN; @@ -867,7 +867,7 @@ CreatureJob find_creature_to_be_placed_in_room_for_job(struct Computer2 *comp, s struct Dungeon *dungeon; struct Thing *thing; struct Room *room; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon)) { ERRORLOG("Invalid dungeon in computer player"); return Job_NULL; @@ -931,7 +931,7 @@ long task_dig_room_passage(struct Computer2 *comp, struct ComputerTask *ctask) { SmallAroundIndex round_directn = small_around_index_towards_destination(ctask->starting_position.x.stl.num,ctask->starting_position.y.stl.num, ctask->new_room_pos.x.stl.num,ctask->new_room_pos.y.stl.num); - pos_move_in_direction_to_last_allowing_drop(&pos, round_directn, comp->dungeon->owner, ctask->create_room.width+ctask->create_room.height); + pos_move_in_direction_to_last_allowing_drop(&pos, round_directn, comp->dungeon_plyr_idx, ctask->create_room.width+ctask->create_room.height); } move_imp_to_dig_here(comp, &pos, 1); pos.x.val = ctask->new_room_pos.x.val; @@ -965,7 +965,7 @@ long task_dig_room_passage(struct Computer2 *comp, struct ComputerTask *ctask) long task_dig_room(struct Computer2 *comp, struct ComputerTask *ctask) { SYNCDBG(9,"Starting"); - struct Dungeon *dungeon = comp->dungeon; + struct Dungeon *dungeon = computer_dungeon(comp); { int digger_tasks = dungeon->digger_stack_length; if ((digger_tasks > 0) && (comp->dig_stack_size * dungeon->total_area / 100 <= digger_tasks)) { @@ -1097,7 +1097,7 @@ long task_check_room_dug(struct Computer2 *comp, struct ComputerTask *ctask) int32_t waiting_slabs; int32_t wrong_slabs; waiting_slabs = 0; wrong_slabs = 0; - count_slabs_where_room_cannot_be_built(comp->dungeon->owner, ctask->new_room_pos.x.stl.num, ctask->new_room_pos.y.stl.num, + count_slabs_where_room_cannot_be_built(comp->dungeon_plyr_idx, ctask->new_room_pos.x.stl.num, ctask->new_room_pos.y.stl.num, ctask->create_room.kind, ctask->create_room.area, &waiting_slabs, &wrong_slabs); if (wrong_slabs > 0) { WARNLOG("Task %s couldn't be completed as %d wrong slabs are in destination area, reset",computer_task_code_name(ctask->ttype),(int)wrong_slabs); @@ -1113,7 +1113,7 @@ long task_check_room_dug(struct Computer2 *comp, struct ComputerTask *ctask) if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { struct RoomConfigStats *roomst; roomst = &game.conf.slab_conf.room_cfgstats[ctask->rkind]; - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Now I can place the %s.",get_string(roomst->name_stridx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Now I can place the %s.",get_string(roomst->name_stridx)); } ctask->ttype = CTT_PlaceRoom; setup_computer_dig_room(&ctask->dig, &ctask->new_room_pos, ctask->create_room.area); @@ -1142,7 +1142,7 @@ void shut_down_task_process(struct Computer2 *comp, struct ComputerTask *ctask) long task_place_room(struct Computer2 *comp, struct ComputerTask *ctask) { SYNCDBG(9,"Starting"); - struct Dungeon *dungeon = comp->dungeon; + struct Dungeon *dungeon = computer_dungeon(comp); RoomKind rkind = ctask->create_room.kind; struct RoomConfigStats *roomst = &game.conf.slab_conf.room_cfgstats[rkind]; // If we don't have money for the room - don't even try @@ -1206,7 +1206,7 @@ long task_dig_to_entrance(struct Computer2 *comp, struct ComputerTask *ctask) { SYNCDBG(9,"Starting"); struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); struct Room *room; // check the surrounding subtiles to see if they are the requested room @@ -1265,7 +1265,7 @@ long task_dig_to_entrance(struct Computer2 *comp, struct ComputerTask *ctask) ItemAvailability computer_check_room_available(const struct Computer2 * comp, RoomKind rkind) { struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); if ((rkind < 1) || (rkind >= game.conf.slab_conf.room_types_count)) { return IAvail_Never; } @@ -1486,7 +1486,7 @@ struct ComputerTask * able_to_build_room(struct Computer2 *comp, struct Coord3d struct Coord3d corpos; struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); long area_total; long area_buildable; int i; @@ -1516,14 +1516,14 @@ struct ComputerTask * able_to_build_room(struct Computer2 *comp, struct Coord3d dstpos.y.stl.num = stl_y; if ( perfect ) { - area_buildable = search_spiral(&dstpos, comp->dungeon->owner, area_total, check_for_perfect_buildable); + area_buildable = search_spiral(&dstpos, comp->dungeon_plyr_idx, area_total, check_for_perfect_buildable); if (area_buildable >= area_total) { area_buildable = width_slabs * height_slabs; break; } } else { - area_buildable = search_spiral(&dstpos, comp->dungeon->owner, area_total, check_for_buildable); + area_buildable = search_spiral(&dstpos, comp->dungeon_plyr_idx, area_total, check_for_buildable); if (area_buildable >= area_total - area_total / 4) { break; } @@ -1542,7 +1542,7 @@ struct ComputerTask * able_to_build_room(struct Computer2 *comp, struct Coord3d if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { struct RoomConfigStats *roomst; roomst = &game.conf.slab_conf.room_cfgstats[rkind]; - message_add_fmt(MsgType_Player, comp->dungeon->owner, "It is time to build %s.",get_string(roomst->name_stridx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "It is time to build %s.",get_string(roomst->name_stridx)); } ctask->ttype = CTT_DigRoomPassage; ctask->rkind = rkind; @@ -1597,7 +1597,7 @@ ToolDigResult tool_dig_to_pos2_skip_slabs_which_dont_need_digging_f(const struct MapSubtlCoord *nextstl_x, MapSubtlCoord *nextstl_y, const char *func_name) { struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); MapSlabCoord nextslb_x; MapSlabCoord nextslb_y; SmallAroundIndex around_index; @@ -1671,7 +1671,7 @@ ToolDigResult tool_dig_to_pos2_do_action_on_slab_which_needs_it_f(struct Compute MapSubtlCoord *nextstl_x, MapSubtlCoord *nextstl_y, const char *func_name) { struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); MapSlabCoord nextslb_x; MapSlabCoord nextslb_y; SmallAroundIndex around_index; @@ -1768,7 +1768,7 @@ ToolDigResult tool_dig_to_pos2_f(struct Computer2 * comp, struct ComputerDig * c ToolDigResult dig_result; SubtlCodedCoords stl_num; SYNCDBG(14,"%s: Starting",func_name); - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); // Limit amount of calls cdig->calls_count++; if (cdig->calls_count >= COMPUTER_TOOL_DIG_LIMIT) { @@ -2069,8 +2069,8 @@ TbBool find_next_gold(struct Computer2 *comp, struct ComputerTask *ctask) memcpy(&ctask->dig.pos_dest, &ctask->dig.pos_next, sizeof(struct Coord3d)); // Try to find gold tiles around current position - if (search_spiral(&ctask->dig.pos_dest, comp->dungeon->owner, 25, check_for_gold) == 25) { - SYNCDBG(5,"Player %d did not found next gold",(int)comp->dungeon->owner); + if (search_spiral(&ctask->dig.pos_dest, comp->dungeon_plyr_idx, 25, check_for_gold) == 25) { + SYNCDBG(5,"Player %d did not found next gold",(int)comp->dungeon_plyr_idx); return false; } @@ -2106,7 +2106,7 @@ long task_dig_to_gold(struct Computer2 *comp, struct ComputerTask *ctask) { long i; SYNCDBG(2,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); i = dungeon->total_area * comp->dig_stack_size / 100; if ((dungeon->digger_stack_length > 0) && (dungeon->digger_stack_length >= i)) @@ -2258,7 +2258,7 @@ long task_dig_to_attack(struct Computer2 *comp, struct ComputerTask *ctask) if (ctask->dig.pos_next.x.val > 0) { struct SlabMap *slb = get_slabmap_for_subtile(ctask->dig.pos_next.x.stl.num, ctask->dig.pos_next.y.stl.num); - if (slabmap_owner(slb) != comp->dungeon->owner) + if (slabmap_owner(slb) != comp->dungeon_plyr_idx) { return CTaskRet_Unk4; } @@ -2320,7 +2320,7 @@ long count_creatures_at_call_to_arms(struct Computer2 *comp) int num_creatures = 0; int k = 0; - for (i = thing_get(comp->dungeon->creatr_list_start); + for (i = thing_get(computer_dungeon(comp)->creatr_list_start); !thing_is_invalid(i); i = thing_get(creature_control_get_from_thing(i)->players_next_creature_idx)) { @@ -2344,7 +2344,7 @@ static struct Thing *find_creature_for_call_to_arms(struct Computer2 *comp, TbBo thing = INVALID_THING; highest_score = INT_MAX; - for (struct Thing *i = thing_get(comp->dungeon->creatr_list_start); + for (struct Thing *i = thing_get(computer_dungeon(comp)->creatr_list_start); !thing_is_invalid(i); i = thing_get(creature_control_get_from_thing(i)->players_next_creature_idx)) { @@ -2386,7 +2386,7 @@ static struct Thing *find_creature_for_call_to_arms(struct Computer2 *comp, TbBo long count_creatures_in_call_to_arms(struct Computer2 *comp) { struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); return count_player_list_creatures_of_model_matching_bool_filter(dungeon->owner, CREATURE_ANY, creature_is_called_to_arms); } @@ -2394,7 +2394,7 @@ long task_magic_call_to_arms(struct Computer2 *comp, struct ComputerTask *ctask) { SYNCDBG(9,"Starting"); struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); switch (ctask->task_state) { case 0: @@ -2484,7 +2484,7 @@ struct Thing *find_creature_for_pickup(struct Computer2 *comp, struct Coord3d *p //TODO CREATURE_JOBS This function needs major rework, to base conditions on job, not on room we're dropping into //TODO CREATURE_JOBS Rewrite all uses of this function before remaking it struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); SYNCDBG(8,"Starting"); MapSubtlCoord stl_x; MapSubtlCoord stl_y; @@ -2605,7 +2605,7 @@ long count_creatures_for_pickup(struct Computer2 *comp, struct Coord3d *pos, str int count; count = 0; k = 0; - i = comp->dungeon->creatr_list_start; + i = computer_dungeon(comp)->creatr_list_start; while (i != 0) { thing = thing_get(i); @@ -2665,7 +2665,7 @@ long task_pickup_for_attack(struct Computer2 *comp, struct ComputerTask *ctask) remove_task(comp, ctask); return CTaskRet_Unk0; } - if (!xy_walkable(ctask->pickup_for_attack.target_pos.x.stl.num, ctask->pickup_for_attack.target_pos.y.stl.num, comp->dungeon->owner)) + if (!xy_walkable(ctask->pickup_for_attack.target_pos.x.stl.num, ctask->pickup_for_attack.target_pos.y.stl.num, comp->dungeon_plyr_idx)) { return CTaskRet_Unk4; } @@ -2676,7 +2676,7 @@ long task_pickup_for_attack(struct Computer2 *comp, struct ComputerTask *ctask) if (computer_dump_held_things_on_map(comp, thing, &ctask->pickup_for_attack.target_pos, ctask->pickup_for_attack.target_state)) { return CTaskRet_Unk2; } - computer_force_dump_held_things_on_map(comp, &comp->dungeon->essential_pos); + computer_force_dump_held_things_on_map(comp, &computer_dungeon(comp)->essential_pos); return CTaskRet_Unk4; } if (ctask->pickup_for_attack.repeat_num <= 0) @@ -2689,7 +2689,7 @@ long task_pickup_for_attack(struct Computer2 *comp, struct ComputerTask *ctask) if (!thing_is_invalid(thing)) { if (computer_place_thing_in_power_hand(comp, thing, &ctask->pickup_for_attack.target_pos)) { - SYNCDBG(9,"Player %d picked %s index %d to attack position (%d,%d)",(int)comp->dungeon->owner,thing_model_name(thing),(int)thing->index, + SYNCDBG(9,"Player %d picked %s index %d to attack position (%d,%d)",(int)comp->dungeon_plyr_idx,thing_model_name(thing),(int)thing->index, (int)ctask->pickup_for_attack.target_pos.x.stl.num, (int)ctask->pickup_for_attack.target_pos.y.stl.num); return CTaskRet_Unk2; } @@ -2705,7 +2705,7 @@ long task_move_creature_to_room(struct Computer2 *comp, struct ComputerTask *cta struct Coord3d pos; long i; struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); room = room_get(ctask->move_to_room.room_idx1); thing = thing_get(comp->held_thing_idx); if (thing_exists(thing)) // We have no unit in hand @@ -2784,7 +2784,7 @@ long task_move_creature_to_pos(struct Computer2 *comp, struct ComputerTask *ctas { struct Dungeon *dungeon; SYNCDBG(19,"Starting"); - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); struct Thing *thing; thing = thing_get(comp->held_thing_idx); if (thing_exists(thing)) @@ -2803,7 +2803,7 @@ long task_move_creature_to_pos(struct Computer2 *comp, struct ComputerTask *ctas { WARNLOG("Player %d computer hand holds %s instead of creature",(int)dungeon->owner, thing_model_name(thing)); } - computer_force_dump_held_things_on_map(comp, &comp->dungeon->essential_pos); + computer_force_dump_held_things_on_map(comp, &computer_dungeon(comp)->essential_pos); remove_task(comp, ctask); return CTaskRet_Unk0; } @@ -2814,7 +2814,7 @@ long task_move_creature_to_pos(struct Computer2 *comp, struct ComputerTask *ctas if (can_thing_be_picked_up_by_player(thing, dungeon->owner)) { if (computer_place_thing_in_power_hand(comp, thing, &ctask->move_to_pos.target_pos)) { - SYNCDBG(9,"Player %d picked %s index %d to move to (%d,%d)",(int)comp->dungeon->owner,thing_model_name(thing),(int)thing->index, + SYNCDBG(9,"Player %d picked %s index %d to move to (%d,%d)",(int)comp->dungeon_plyr_idx,thing_model_name(thing),(int)thing->index, (int)ctask->move_to_pos.target_pos.x.stl.num, (int)ctask->move_to_pos.target_pos.y.stl.num); return CTaskRet_Unk2; } @@ -2828,7 +2828,7 @@ struct Thing *find_creature_for_defend_pickup(struct Computer2 *comp) struct Dungeon *dungeon; unsigned long k; long i; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); long best_factor; struct Thing *best_creatng; best_creatng = INVALID_THING; @@ -2892,7 +2892,7 @@ long task_move_creatures_to_defend(struct Computer2 *comp, struct ComputerTask * { SYNCDBG(19,"Starting"); struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); struct Thing *thing; thing = thing_get(comp->held_thing_idx); // If the heart is just being destroyed - dump held thing and finish task @@ -2955,7 +2955,7 @@ long task_move_creatures_to_defend(struct Computer2 *comp, struct ComputerTask * long task_move_gold_to_treasury(struct Computer2 *comp, struct ComputerTask *ctask) { struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon)) { ERRORLOG("Invalid dungeon in computer player."); return CTaskRet_Unk0; @@ -2986,15 +2986,15 @@ long task_move_gold_to_treasury(struct Computer2 *comp, struct ComputerTask *cta { WARNLOG("Could not move player %d gold by dropping %s into %s",(int)dungeon->owner,thing_model_name(thing),room_code_name(room->kind)); } - computer_force_dump_held_things_on_map(comp, &comp->dungeon->essential_pos); + computer_force_dump_held_things_on_map(comp, &computer_dungeon(comp)->essential_pos); remove_task(comp, ctask); return CTaskRet_Unk0; } - thing = find_gold_laying_in_dungeon(comp->dungeon); + thing = find_gold_laying_in_dungeon(computer_dungeon(comp)); if (!thing_is_invalid(thing)) { struct Room *room; - room = find_room_of_role_with_spare_capacity(comp->dungeon->owner, RoRoF_GoldStorage, 1); + room = find_room_of_role_with_spare_capacity(comp->dungeon_plyr_idx, RoRoF_GoldStorage, 1); if (!room_is_invalid(room)) { ctask->move_gold.room_idx = room->index; @@ -3004,21 +3004,21 @@ long task_move_gold_to_treasury(struct Computer2 *comp, struct ComputerTask *cta pos.z.val = subtile_coord(1,0); if (computer_place_thing_in_power_hand(comp, thing, &pos)) { ctask->move_gold.items_amount--; - SYNCDBG(9,"Player %d picked %s index %d to place in %s index %d",(int)comp->dungeon->owner, + SYNCDBG(9,"Player %d picked %s index %d to place in %s index %d",(int)comp->dungeon_plyr_idx, thing_model_name(thing),(int)thing->index,room_code_name(room->kind),(int)room->index); return CTaskRet_Unk2; } else { - SYNCDBG(9,"Player %d cannot place %s index %d into power hand",(int)comp->dungeon->owner, + SYNCDBG(9,"Player %d cannot place %s index %d into power hand",(int)comp->dungeon_plyr_idx, thing_model_name(thing),(int)thing->index); } } else { - SYNCDBG(9,"Player %d has no room to place the gold into",(int)comp->dungeon->owner); + SYNCDBG(9,"Player %d has no room to place the gold into",(int)comp->dungeon_plyr_idx); remove_task(comp, ctask); } } else { - SYNCDBG(9,"Player %d has no more gold laying around",(int)comp->dungeon->owner); + SYNCDBG(9,"Player %d has no more gold laying around",(int)comp->dungeon_plyr_idx); remove_task(comp, ctask); } return CTaskRet_Unk0; @@ -3028,7 +3028,7 @@ long task_slap_imps(struct Computer2 *comp, struct ComputerTask *ctask) { struct Dungeon *dungeon; SYNCDBG(9,"Starting"); - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); ctask->attack_magic.repeat_num--; if (ctask->attack_magic.repeat_num >= 0) { @@ -3121,7 +3121,7 @@ long task_magic_speed_up(struct Computer2 *comp, struct ComputerTask *ctask) struct Thing *creatng; int k = 0; SYNCDBG(9,"Starting"); - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); creatng = thing_get(ctask->attack_magic.target_thing_idx); if (!thing_exists(creatng)) { @@ -3193,7 +3193,7 @@ long task_wait_for_bridge(struct Computer2 *comp, struct ComputerTask *ctask) { SYNCDBG(9, "Starting"); PlayerNumber plyr_idx; - plyr_idx = comp->dungeon->owner; + plyr_idx = comp->dungeon_plyr_idx; if (game.play_gameturn - ctask->created_turn > COMPUTER_DIG_ROOM_TIMEOUT) { //If the task has been active too long, restart the process to try a different approach. @@ -3245,7 +3245,7 @@ long task_attack_magic(struct Computer2 *comp, struct ComputerTask *ctask) struct Thing *thing; long i; SYNCDBG(9,"Starting"); - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); thing = thing_get(ctask->attack_magic.target_thing_idx); if (!thing_exists(thing)) { return CTaskRet_Unk1; @@ -3273,7 +3273,7 @@ long task_attack_magic(struct Computer2 *comp, struct ComputerTask *ctask) long task_sell_traps_and_doors(struct Computer2 *comp, struct ComputerTask *ctask) { - struct Dungeon *dungeon = comp->dungeon; + struct Dungeon *dungeon = computer_dungeon(comp); const struct TrapDoorSelling *tdsell; struct DoorConfigStats *doorst; struct TrapConfigStats *trapst; @@ -3526,35 +3526,35 @@ TbBool create_task_move_creature_to_pos(struct Computer2 *comp, const struct Thi switch (dst_state) { case CrSt_ImpImprovesDungeon: - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s should go claiming.",get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s should go claiming.",get_string(crconf->namestr_idx)); break; case CrSt_ImpDigsDirt: - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s should go digging.",get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s should go digging.",get_string(crconf->namestr_idx)); break; case CrSt_ImpMinesGold: - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s should go mining.",get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s should go mining.",get_string(crconf->namestr_idx)); break; case CrSt_CreatureDoingNothing: case CrSt_ImpDoingNothing: - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s should stop doing that.",get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s should stop doing that.",get_string(crconf->namestr_idx)); break; case CrSt_CreatureSacrifice: - if (thing->model == game.conf.rules[comp->dungeon->owner].sacrifices.cheaper_diggers_sacrifice_model) { + if (thing->model == game.conf.rules[comp->dungeon_plyr_idx].sacrifices.cheaper_diggers_sacrifice_model) { struct PowerConfigStats *powerst; powerst = get_power_model_stats(PwrK_MKDIGGER); - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Sacrificing %s to reduce %s price.",get_string(crconf->namestr_idx),get_string(powerst->name_stridx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Sacrificing %s to reduce %s price.",get_string(crconf->namestr_idx),get_string(powerst->name_stridx)); break; } - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s will be sacrificed.",get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s will be sacrificed.",get_string(crconf->namestr_idx)); break; case CrSt_Torturing: - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s should be tortured.", get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s should be tortured.", get_string(crconf->namestr_idx)); break; case CrSt_CreatureDoorCombat: - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s should attack a door.", get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s should attack a door.", get_string(crconf->namestr_idx)); break; default: - message_add_fmt(MsgType_Player, comp->dungeon->owner, "This %s should go there.",get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "This %s should go there.",get_string(crconf->namestr_idx)); break; } } @@ -3577,7 +3577,7 @@ TbBool create_task_move_creatures_to_defend(struct Computer2 *comp, struct Coord return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Minions, defend this place!"); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Minions, defend this place!"); } ctask->ttype = CTT_MoveCreaturesToDefend; ctask->move_to_defend.target_pos.x.val = pos->x.val; @@ -3605,10 +3605,10 @@ TbBool create_task_move_creatures_to_room(struct Computer2 *comp, int room_idx, if (room_exists(room)) { struct RoomConfigStats *roomst; roomst = &game.conf.slab_conf.room_cfgstats[room->kind]; - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Time to put some creatures into %s.",get_string(roomst->name_stridx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Time to put some creatures into %s.",get_string(roomst->name_stridx)); } else { if (flag_is_set(game.computer_chat_flags, CChat_TasksFrequent)) - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Time to put some creatures into rooms."); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Time to put some creatures into rooms."); } } ctask->ttype = CTT_MoveCreatureToRoom; @@ -3628,7 +3628,7 @@ TbBool create_task_pickup_for_attack(struct Computer2 *comp, struct Coord3d *pos return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Minions, attack now!"); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Minions, attack now!"); } ctask->ttype = CTT_PickupForAttack; ctask->pickup_for_attack.target_pos.x.val = pos->x.val; @@ -3649,7 +3649,7 @@ TbBool create_task_magic_battle_call_to_arms(struct Computer2 *comp, struct Coor return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Minions, call to arms! Join the battle!"); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Minions, call to arms! Join the battle!"); } ctask->ttype = CTT_MagicCallToArms; ctask->task_state = CTaskSt_None; @@ -3674,7 +3674,7 @@ TbBool create_task_magic_support_call_to_arms(struct Computer2 *comp, struct Coo return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Minions, call to arms! Attack!"); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Minions, call to arms! Attack!"); } ctask->ttype = CTT_MagicCallToArms; ctask->task_state = CTaskSt_None; @@ -3700,7 +3700,7 @@ TbBool create_task_magic_support_call_to_arms(struct Computer2 *comp, struct Coo TbBool create_task_sell_traps_and_doors(struct Computer2 *comp, long num_to_sell, GoldAmount gold_up_to, TbBool allow_deployed) { struct Dungeon *dungeon; - dungeon = comp->dungeon; + dungeon = computer_dungeon(comp); struct ComputerTask *ctask; SYNCDBG(7,"Starting for player %d to sell %d traps up to %d gold",(int)dungeon->owner,(int)num_to_sell,(int)gold_up_to); ctask = get_free_task(comp, 1); @@ -3739,7 +3739,7 @@ TbBool create_task_move_gold_to_treasury(struct Computer2 *comp, long num_to_mov return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksFrequent)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Gold should not lay around outside treasury."); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Gold should not lay around outside treasury."); } ctask->ttype = CTT_MoveGoldToTreasury; ctask->created_turn = game.play_gameturn; @@ -3761,7 +3761,7 @@ TbBool create_task_dig_to_attack(struct Computer2 *comp, const struct Coord3d st return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Player %d looks like he need a kick.",(int)victim_plyr_idx); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Player %d looks like he need a kick.",(int)victim_plyr_idx); } ctask->ttype = CTT_DigToAttack; ctask->dig_somewhere.startpos.x.val = startpos.x.val; @@ -3788,7 +3788,7 @@ TbBool create_task_dig_to_neutral(struct Computer2 *comp, const struct Coord3d s return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Localized neutral place, hopefully with loot."); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Localized neutral place, hopefully with loot."); } ctask->ttype = CTT_DigToNeutral; ctask->dig_somewhere.startpos.x.val = startpos.x.val; @@ -3812,7 +3812,7 @@ TbBool create_task_dig_to_gold(struct Computer2 *comp, const struct Coord3d star return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Time to dig more gold."); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Time to dig more gold."); } ctask->ttype = CTT_DigToGold; set_flag(ctask->flags, ComTsk_AddTrapLocation); @@ -3841,7 +3841,7 @@ TbBool create_task_dig_to_entrance(struct Computer2 *comp, const struct Coord3d if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { struct RoomConfigStats *roomst; roomst = &game.conf.slab_conf.room_cfgstats[RoK_ENTRANCE]; - message_add_fmt(MsgType_Player, comp->dungeon->owner, "I will take that %s.",get_string(roomst->name_stridx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "I will take that %s.",get_string(roomst->name_stridx)); } ctask->ttype = CTT_DigToEntrance; set_flag(ctask->flags, (ComTsk_AddTrapLocation|ComTsk_Urgent)); @@ -3867,7 +3867,7 @@ TbBool create_task_slap_imps(struct Computer2 *comp, long creatrs_num, TbBool sk return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksFrequent)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Work harder, minions!"); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Work harder, minions!"); } ctask->ttype = CTT_SlapDiggers; ctask->attack_magic.repeat_num = creatrs_num; @@ -3887,7 +3887,7 @@ TbBool create_task_magic_speed_up(struct Computer2 *comp, const struct Thing *cr return false; } if (flag_is_set(game.computer_chat_flags, CChat_TasksScarce)) { - message_add_fmt(MsgType_Player, comp->dungeon->owner, "I should speed up my fighters."); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "I should speed up my fighters."); } ctask->ttype = CTT_MagicSpeedUp; ctask->attack_magic.target_thing_idx = creatng->index; @@ -3908,7 +3908,7 @@ TbBool create_task_attack_magic(struct Computer2 *comp, const struct Thing *crea struct PowerConfigStats *powerst; powerst = get_power_model_stats(pwkind); struct CreatureModelConfig* crconf = &game.conf.crtr_conf.model[creatng->model]; - message_add_fmt(MsgType_Player, comp->dungeon->owner, "Casting %s on %s!",get_string(powerst->name_stridx),get_string(crconf->namestr_idx)); + message_add_fmt(MsgType_Player, comp->dungeon_plyr_idx, "Casting %s on %s!",get_string(powerst->name_stridx),get_string(crconf->namestr_idx)); } ctask->ttype = CTT_AttackMagic; ctask->attack_magic.target_thing_idx = creatng->index; diff --git a/src/player_computer.c b/src/player_computer.c index c0d1a5c913..5746ac381f 100644 --- a/src/player_computer.c +++ b/src/player_computer.c @@ -78,7 +78,7 @@ TbBool computer_player_invalid(const struct Computer2 *comp) TbBool computer_player_in_emergency_state(const struct Computer2 *comp) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (get_computer_money_less_cost(comp) < -1000) return true; if (dungeon->num_active_diggers < 3) @@ -99,7 +99,7 @@ GoldAmount get_dungeon_money_less_cost(const struct Dungeon *dungeon) GoldAmount get_computer_money_less_cost(const struct Computer2 *comp) { - return get_dungeon_money_less_cost(comp->dungeon); + return get_dungeon_money_less_cost(computer_dungeon(comp)); } long set_autopilot_type(PlayerNumber plyr_idx, long aptype) @@ -156,7 +156,7 @@ struct ComputerTask * able_to_build_room_at_task(struct Computer2 *comp, RoomKin */ struct ComputerTask * able_to_build_room_from_room(struct Computer2 *comp, RoomKind rkind, RoomKind look_kind, long width_slabs, long height_slabs, long max_slabs_dist, long perfect) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long i = dungeon->room_list_start[look_kind]; unsigned long k = 0; while (i != 0) @@ -190,7 +190,7 @@ struct ComputerTask * able_to_build_room_from_room(struct Computer2 *comp, RoomK struct ComputerTask *computer_setup_build_room(struct Computer2 *comp, RoomKind rkind, long width_slabs, long height_slabs, long look_randstart) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long i; if (room_role_matches(rkind,RoRoF_LairStorage)) { @@ -345,7 +345,7 @@ long computer_finds_nearest_task_to_gold(const struct Computer2 *comp, const str long computer_finds_nearest_room_to_gold(struct Computer2 *comp, struct Coord3d *pos, struct GoldLookup **gldlookref) { SYNCDBG(5,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); struct GoldLookup* gldlooksel = NULL; *gldlookref = gldlooksel; struct Coord3d locpos; @@ -413,7 +413,7 @@ long computer_finds_nearest_room_to_gold(struct Computer2 *comp, struct Coord3d unsigned long count_creatures_availiable_for_fight(struct Computer2 *comp, struct Coord3d *pos) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); unsigned long count = 0; unsigned long k = 0; int i = dungeon->creatr_list_start; @@ -473,7 +473,7 @@ TbBool is_there_an_attack_task(const struct Computer2 *comp) void get_opponent(struct Computer2 *comp, struct THate hates[]) { SYNCDBG(7,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); long i; // Initialize hate struct for (i=0; i < PLAYERS_COUNT; i++) @@ -542,7 +542,7 @@ void get_opponent(struct Computer2 *comp, struct THate hates[]) TbBool computer_finds_nearest_room_to_pos(struct Computer2 *comp, struct Room **retroom, struct Coord3d *nearpos){ long nearest_distance = INT32_MAX; - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); *retroom = NULL; for (RoomKind i = 0; i < game.conf.slab_conf.room_types_count; i++) @@ -574,7 +574,7 @@ TbBool computer_finds_nearest_room_to_pos(struct Computer2 *comp, struct Room ** long setup_computer_attack(struct Computer2 *comp, struct ComputerProcess *cproc, struct Coord3d *pos, long victim_plyr_idx) { struct Room *room; - SYNCDBG(8,"Starting player %d attack on %d",(int)comp->dungeon->owner,(int)victim_plyr_idx); + SYNCDBG(8,"Starting player %d attack on %d",(int)comp->dungeon_plyr_idx,(int)victim_plyr_idx); if (!computer_finds_nearest_room_to_pos(comp, &room, pos)) { SYNCDBG(7,"Cannot find owned room near (%d,%d), giving up",(int)pos->x.stl.num,(int)pos->y.stl.num); return 0; @@ -598,7 +598,7 @@ long setup_computer_attack(struct Computer2 *comp, struct ComputerProcess *cproc long count_entrances(const struct Computer2 *comp, PlayerNumber plyr_idx) { - const struct Dungeon* dungeon = comp->dungeon; + const struct Dungeon* dungeon = computer_dungeon(comp); long count = 0; long i = game.entrance_room_id; unsigned long k = 0; @@ -732,7 +732,7 @@ int computer_find_more_trap_place_locations_around_room(struct Computer2 *comp, int computer_find_more_trap_place_locations(struct Computer2 *comp) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); int num_added = 0; RoomKind rkind = AI_RANDOM(game.conf.slab_conf.room_types_count); for (int m = 0; m < game.conf.slab_conf.room_types_count; m++, rkind = (rkind + 1) % game.conf.slab_conf.room_types_count) @@ -767,7 +767,7 @@ int computer_find_more_trap_place_locations(struct Computer2 *comp) TbBool computer_get_trap_place_location_and_update_locations(struct Computer2 *comp, ThingModel trapmodel, struct Coord3d *retloc) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); for (long i = 0; i < COMPUTER_TRAP_LOC_COUNT; i++) { struct Coord3d* location = &comp->trap_locations[i]; @@ -809,7 +809,7 @@ TbBool computer_get_trap_place_location_and_update_locations(struct Computer2 *c long computer_check_for_place_trap(struct Computer2 *comp, struct ComputerCheck * check) { SYNCDBG(8,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon) || !player_has_heart(dungeon->owner)) { SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)dungeon->owner); return CTaskRet_Unk4; @@ -890,7 +890,7 @@ long computer_pick_training_or_scavenging_creatures_and_place_on_room(struct Com */ long computer_pick_expensive_job_creatures_and_place_on_lair(struct Computer2 *comp, long tasks_limit) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); struct Room* room = room_get(dungeon->room_list_start[RoK_LAIR]); long new_tasks = 0; // If we don't have lair, then don't even bother @@ -922,7 +922,7 @@ long computer_check_for_money(struct Computer2 *comp, struct ComputerCheck * che { SYNCDBG(18,"Starting"); long ret = CTaskRet_Unk4; - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (dungeon_invalid(dungeon) || !player_has_heart(dungeon->owner)) { SYNCDBG(7,"Computer players %d dungeon in invalid or has no heart",(int)dungeon->owner); return CTaskRet_Unk4; @@ -1041,7 +1041,7 @@ long computer_check_for_money(struct Computer2 *comp, struct ComputerCheck * che long count_creatures_for_defend_pickup(struct Computer2 *comp) { struct Thing *i; - struct Dungeon *dungeon = comp->dungeon; + struct Dungeon *dungeon = computer_dungeon(comp); int count = 0; int k = 0; @@ -1105,7 +1105,7 @@ TbBool computer_find_non_solid_block(const struct Computer2 *comp, struct Coord3 { MapSubtlCoord sstl_x = arstl_x + start_at_around[k].delta_x; MapSubtlCoord sstl_y = arstl_y + start_at_around[k].delta_y; - if (can_drop_thing_here(sstl_x, sstl_y, comp->dungeon->owner, 0)) + if (can_drop_thing_here(sstl_x, sstl_y, comp->dungeon_plyr_idx, 0)) { pos->x.val = subtile_coord_center(sstl_x); pos->y.val = subtile_coord_center(sstl_y); @@ -1132,7 +1132,7 @@ TbBool computer_find_safe_non_solid_block(const struct Computer2* comp, struct C { MapSubtlCoord sstl_x = arstl_x + start_at_around[k].delta_x; MapSubtlCoord sstl_y = arstl_y + start_at_around[k].delta_y; - if (can_drop_thing_here(sstl_x, sstl_y, comp->dungeon->owner, 0) && !is_dangerous_drop_subtile(sstl_x, sstl_y)) + if (can_drop_thing_here(sstl_x, sstl_y, comp->dungeon_plyr_idx, 0) && !is_dangerous_drop_subtile(sstl_x, sstl_y)) { pos->x.val = subtile_coord_center(sstl_x); pos->y.val = subtile_coord_center(sstl_y); @@ -1154,7 +1154,7 @@ TbBool computer_find_safe_non_solid_block(const struct Computer2* comp, struct C */ TbBool computer_able_to_use_power(struct Computer2 *comp, PowerKind pwkind, KeepPwrLevel power_level, long amount) { - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (!is_power_available(dungeon->owner, pwkind)) { return false; } @@ -1170,9 +1170,9 @@ TbBool computer_able_to_use_power(struct Computer2 *comp, PowerKind pwkind, Keep long check_call_to_arms(struct Computer2 *comp) { - SYNCDBG(8,"Starting for player %d",(int)comp->dungeon->owner); + SYNCDBG(8,"Starting for player %d",(int)comp->dungeon_plyr_idx); long ret = 1; - if (comp->dungeon->cta_start_turn != 0) + if (computer_dungeon(comp)->cta_start_turn != 0) { long i = comp->task_idx; unsigned long k = 0; @@ -1235,11 +1235,11 @@ TbBool setup_a_computer_player(PlayerNumber plyr_idx, long comp_model) memset(comp, 0, sizeof(struct Computer2)); struct ComputerType* cpt = get_computer_type_template(comp_model); - comp->dungeon = get_players_num_dungeon(plyr_idx); + comp->dungeon_plyr_idx = plyr_idx; comp->model = comp_model; - if (dungeon_invalid(comp->dungeon)) { + if (dungeon_invalid(computer_dungeon(comp))) { WARNLOG("Tried to setup player %d which has no dungeon",(int)plyr_idx); - comp->dungeon = INVALID_DUNGEON; + comp->dungeon_plyr_idx = PLAYERS_COUNT; comp->model = 0; return false; } @@ -1347,7 +1347,7 @@ TbBool script_support_setup_player_as_computer_keeper(PlayerNumber plyr_idx, lon void computer_check_events(struct Computer2 *comp) { SYNCDBG(17,"Starting"); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); for (long i = 0; i < COMPUTER_EVENTS_COUNT; i++) { struct ComputerEvent* cevent = &comp->events[i]; @@ -1483,7 +1483,7 @@ void process_computer_player2(PlayerNumber plyr_idx) ERRORLOG("Player %d has no computer capability",(int)plyr_idx); return; } - if (dungeon_invalid(comp->dungeon)) { + if (dungeon_invalid(computer_dungeon(comp))) { ERRORLOG("Computer player %d has invalid dungeon",(int)plyr_idx); return; } @@ -1634,16 +1634,16 @@ void restore_computer_player_after_load(void) } if (!player_exists(player)) { memset(comp, 0, sizeof(struct Computer2)); - comp->dungeon = INVALID_DUNGEON; + comp->dungeon_plyr_idx = PLAYERS_COUNT; continue; } if (player->is_active != 1) { memset(comp, 0, sizeof(struct Computer2)); - comp->dungeon = get_players_dungeon(player); + comp->dungeon_plyr_idx = PLAYERS_COUNT; continue; } - comp->dungeon = get_players_dungeon(player); + comp->dungeon_plyr_idx = player->id_number; } } diff --git a/src/player_computer.h b/src/player_computer.h index 5613186143..34dfff1774 100644 --- a/src/player_computer.h +++ b/src/player_computer.h @@ -253,6 +253,7 @@ struct ComputerEvent; struct Event; struct Thing; struct Room; +struct Dungeon; struct ComputerTask; struct GoldLookup; struct THate; @@ -425,7 +426,7 @@ struct Computer2 { // sizeof = 5322 uint32_t click_rate; int32_t dig_stack_size; // seems to be signed long uint32_t sim_before_dig; - struct Dungeon *dungeon; + PlayerNumber dungeon_plyr_idx; uint32_t model; uint32_t turn_begin; uint32_t max_room_build_tasks; @@ -480,6 +481,7 @@ extern Comp_Check_Func computer_check_func_list[]; /******************************************************************************/ struct Computer2 *get_computer_player_f(long plyr_idx,const char *func_name); #define get_computer_player(plyr_idx) get_computer_player_f(plyr_idx,__func__) +#define computer_dungeon(comp) get_players_num_dungeon((comp)->dungeon_plyr_idx) TbBool computer_player_invalid(const struct Computer2 *comp); long set_autopilot_type(PlayerNumber plridx, long aptype); /******************************************************************************/ diff --git a/src/thing_creature.c b/src/thing_creature.c index 59eb6d1cbc..5012ce9776 100644 --- a/src/thing_creature.c +++ b/src/thing_creature.c @@ -5619,7 +5619,7 @@ long player_list_creature_filter_needs_to_be_placed_in_room_for_job(const struct { SYNCDBG(19,"Starting for %s index %d owner %d",thing_model_name(thing),(int)thing->index,(int)thing->owner); struct Computer2* comp = (struct Computer2*)(param->primary_pointer); - struct Dungeon* dungeon = comp->dungeon; + struct Dungeon* dungeon = computer_dungeon(comp); if (!can_thing_be_picked_up_by_player(thing, dungeon->owner)) { return -1; } From 708b6d66fe374364c617bf69990f7085d0f28a04 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Tue, 3 Mar 2026 21:52:36 +0100 Subject: [PATCH 14/16] process_turn_time --- src/bflib_datetm.cpp | 2 +- src/frontmenu_ingame_map.c | 2 +- src/main.cpp | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/bflib_datetm.cpp b/src/bflib_datetm.cpp index 06c46f405d..05c324d07a 100644 --- a/src/bflib_datetm.cpp +++ b/src/bflib_datetm.cpp @@ -58,7 +58,7 @@ int debug_display_frametime = 0; void initial_time_point() { initialized_time_point = TimeNow; - game.process_turn_time = 1.0; // Begin initial turn as soon as possible (like original game) + process_turn_time = 1.0; // Begin initial turn as soon as possible (like original game) } long double get_time_tick_ns() diff --git a/src/frontmenu_ingame_map.c b/src/frontmenu_ingame_map.c index cf519c996b..5667a05b56 100644 --- a/src/frontmenu_ingame_map.c +++ b/src/frontmenu_ingame_map.c @@ -160,7 +160,7 @@ void draw_call_to_arms_circle(unsigned char owner, long x1, long y1, long x2, lo long long cscale; float circle_time; if ((game.operation_flags & GOF_Paused) == 0) { - circle_time = ((game.play_gameturn + owner) & 7) + game.process_turn_time; + circle_time = ((game.play_gameturn + owner) & 7) + process_turn_time; } else { circle_time = ((game.play_gameturn + owner) & 7); } diff --git a/src/main.cpp b/src/main.cpp index e871d27760..c60fe28eb3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -200,7 +200,7 @@ unsigned char zoom_to_heart_palette[768]; unsigned char EngineSpriteDrawUsingAlpha; unsigned char temp_pal[768]; unsigned char *lightning_palette; - +long double process_turn_time; #ifdef __cplusplus extern "C" { @@ -3403,10 +3403,10 @@ void gameplay_loop_logic() } if (is_feature_on(Ft_DeltaTime) == true) { - if (game.process_turn_time < 1.0) { + if (process_turn_time < 1.0) { return; } - game.process_turn_time -= 1.0; + process_turn_time -= 1.0; } frametime_start_measurement(Frametime_Logic); @@ -3477,7 +3477,7 @@ void gameplay_loop_draw() extern "C" void network_yield_draw_gameplay() { game.delta_time = get_delta_time(); - game.process_turn_time += game.delta_time; + process_turn_time += game.delta_time; gameplay_loop_draw(); } @@ -3508,11 +3508,11 @@ void gameplay_loop_timestep() frametime_start_measurement(Frametime_Sleep); if (is_feature_on(Ft_DeltaTime) == true) { game.delta_time = get_delta_time(); - game.process_turn_time += game.delta_time; + process_turn_time += game.delta_time; } else { // Set to 1 so that these variables don't affect anything. (if something is multiplied by 1 it doesn't change) game.delta_time = 1; - game.process_turn_time = 1; + process_turn_time = 1; // Make delay if the machine is too fast if ( (!game.packet_load_enable) || (game.turns_fastforward == 0) ) { keeper_wait_for_next_turn(); From b191ac893c1cb73ea269506461c2ba8922e2baf3 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Tue, 3 Mar 2026 21:52:47 +0100 Subject: [PATCH 15/16] more int32_t --- src/ariadne.h | 6 +- src/config_compp.h | 52 ++++++++-------- src/config_creature.h | 8 +-- src/config_magic.h | 4 +- src/config_slabsets.h | 2 +- src/config_trapdoor.h | 34 +++++----- src/creature_groups.h | 4 +- src/creature_instances.h | 18 +++--- src/dungeon_stats.h | 130 +++++++++++++++++++-------------------- src/engine_camera.h | 8 +-- src/game_legacy.h | 3 +- src/power_hand.h | 2 +- 12 files changed, 137 insertions(+), 134 deletions(-) diff --git a/src/ariadne.h b/src/ariadne.h index b3da8de5dc..72f4ee20ff 100644 --- a/src/ariadne.h +++ b/src/ariadne.h @@ -171,7 +171,7 @@ struct Ariadne { // sizeof = 102 struct Coord3d manoeuvre_requested_position; unsigned char manoeuvre_state; short wallhug_angle; - long straight_dist_to_next_waypoint; + int32_t straight_dist_to_next_waypoint; }; struct PathWayPoint { // sizeof = 8 @@ -219,8 +219,8 @@ struct Navigation { unsigned char wallhug_retry_counter; unsigned char wallhug_state; unsigned char push_counter; - long dist_to_final_pos; - long distance_to_next_pos; + int32_t dist_to_final_pos; + int32_t distance_to_next_pos; int32_t angle; SubtlCodedCoords first_colliding_block; SubtlCodedCoords second_colliding_block; diff --git a/src/config_compp.h b/src/config_compp.h index ac2fef9c8b..0c02010e86 100644 --- a/src/config_compp.h +++ b/src/config_compp.h @@ -45,12 +45,12 @@ extern "C" { struct ComputerProcess { char name[COMMAND_WORD_LEN]; char mnemonic[COMMAND_WORD_LEN]; - long priority; + int32_t priority; // Signed process config values - long process_configuration_value_2; - long process_configuration_value_3; - long process_configuration_value_4; /**< room kind or amount of creatures or gameturn or count of slabs */ - long process_configuration_value_5; + int32_t process_configuration_value_2; + int32_t process_configuration_value_3; + int32_t process_configuration_value_4; /**< room kind or amount of creatures or gameturn or count of slabs */ + int32_t process_configuration_value_5; FuncIdx func_check; FuncIdx func_setup; FuncIdx func_task; @@ -58,25 +58,25 @@ struct ComputerProcess { FuncIdx func_pause; unsigned char parent; // Unsigned process parameters storage (stores gameturns) - unsigned long process_parameter_1; - unsigned long process_parameter_2; - unsigned long process_parameter_3; - unsigned long last_run_turn; + uint32_t process_parameter_1; + uint32_t process_parameter_2; + uint32_t process_parameter_3; + uint32_t last_run_turn; // Signed process parameters storage - long process_parameter_5; - unsigned long flags; /**< Values from ComProc_* enumeration. */ + int32_t process_parameter_5; + uint32_t flags; /**< Values from ComProc_* enumeration. */ }; struct ComputerCheck { char name[COMMAND_WORD_LEN]; char mnemonic[COMMAND_WORD_LEN]; - unsigned long flags; /**< Values from ComChk_* enumeration. */ - long turns_interval; + uint32_t flags; /**< Values from ComChk_* enumeration. */ + int32_t turns_interval; FuncIdx func; - long primary_parameter; - long secondary_parameter; - long tertiary_parameter; - long last_run_turn; + int32_t primary_parameter; + int32_t secondary_parameter; + int32_t tertiary_parameter; + int32_t last_run_turn; }; struct ComputerEvent { @@ -98,12 +98,12 @@ struct ComputerType { char name[COMMAND_WORD_LEN]; short tooltip_stridx; short sprite_idx; - long dig_stack_size; - long processes_time; - long click_rate; - long max_room_build_tasks; - long turn_begin; - long sim_before_dig; + int32_t dig_stack_size; + int32_t processes_time; + int32_t click_rate; + int32_t max_room_build_tasks; + int32_t turn_begin; + int32_t sim_before_dig; GameTurnDelta drop_delay; unsigned char processes[COMPUTER_PROCESSES_COUNT]; unsigned char checks[COMPUTER_CHECKS_COUNT]; @@ -119,9 +119,9 @@ struct ComputerPlayerConfig { struct ComputerEvent event_types[COMPUTER_EVENTS_TYPES_COUNT]; int32_t computers_count; struct ComputerType computer_types[COMPUTER_MODELS_COUNT]; - long skirmish_first; - long skirmish_last; - long player_assist_default; + int32_t skirmish_first; + int32_t skirmish_last; + int32_t player_assist_default; unsigned char computer_assist_types[COMPUTER_ASSIST_TYPES_COUNT]; }; diff --git a/src/config_creature.h b/src/config_creature.h index 71280c4f3a..e2d34e508c 100644 --- a/src/config_creature.h +++ b/src/config_creature.h @@ -242,7 +242,7 @@ struct CreatureJobConfig { CrtrStateId initial_crstate; /** The state creature should back to after job is interrupted. */ CrtrStateId continue_crstate; - unsigned long job_flags; + uint32_t job_flags; }; struct CreatureAngerJobConfig { @@ -251,8 +251,8 @@ struct CreatureAngerJobConfig { struct CreatureModelConfig { char name[COMMAND_WORD_LEN]; - long namestr_idx; - unsigned long model_flags; + int32_t namestr_idx; + uint32_t model_flags; unsigned short job_primary; unsigned short job_secondary; unsigned short jobs_not_do; @@ -280,7 +280,7 @@ struct CreatureModelConfig { short scavenger_cost; short scavenge_require; unsigned char scavenge_value; - unsigned long to_level[CREATURE_MAX_LEVEL]; + uint32_t to_level[CREATURE_MAX_LEVEL]; unsigned char base_speed; ThingModel grow_up; CrtrExpLevel grow_up_level; diff --git a/src/config_magic.h b/src/config_magic.h index cd599c149d..ed9ad2bbea 100644 --- a/src/config_magic.h +++ b/src/config_magic.h @@ -319,10 +319,11 @@ typedef unsigned char (*Expand_Check_Func)(void); /** * Configuration parameters for powers. */ +#pragma pack(1) struct PowerConfigStats { char code_name[COMMAND_WORD_LEN]; - ThingModel artifact_model; uint64_t can_cast_flags; + ThingModel artifact_model; uint32_t config_flags; unsigned char overcharge_check_idx; uint32_t work_state; @@ -347,6 +348,7 @@ struct PowerConfigStats { GameTurnDelta duration; int32_t strength[MAGIC_OVERCHARGE_LEVELS+1]; }; +#pragma pack() /** * Configuration parameters for specials. diff --git a/src/config_slabsets.h b/src/config_slabsets.h index 698dd4f292..81f144118c 100644 --- a/src/config_slabsets.h +++ b/src/config_slabsets.h @@ -33,7 +33,7 @@ extern const struct ConfigFileData keeper_slabset_file_data; extern const struct ConfigFileData keeper_columns_file_data; struct ColumnConfig { - long columns_count; + int32_t columns_count; struct Column cols[COLUMNS_COUNT]; }; diff --git a/src/config_trapdoor.h b/src/config_trapdoor.h index 50a8a65ebd..0dedabc630 100644 --- a/src/config_trapdoor.h +++ b/src/config_trapdoor.h @@ -37,12 +37,12 @@ struct DoorConfigStats { char code_name[COMMAND_WORD_LEN]; TextStringId name_stridx; TextStringId tooltip_stridx; - long bigsym_sprite_idx; - long medsym_sprite_idx; - long pointer_sprite_idx; - long panel_tab_idx; + int32_t bigsym_sprite_idx; + int32_t medsym_sprite_idx; + int32_t pointer_sprite_idx; + int32_t panel_tab_idx; unsigned char manufct_level; - unsigned long manufct_required; + uint32_t manufct_required; HitPoints health; unsigned short slbkind[2]; unsigned short open_speed; @@ -65,12 +65,12 @@ struct TrapConfigStats { char code_name[COMMAND_WORD_LEN]; TextStringId name_stridx; TextStringId tooltip_stridx; - long bigsym_sprite_idx; - long medsym_sprite_idx; - long pointer_sprite_idx; - long panel_tab_idx; + int32_t bigsym_sprite_idx; + int32_t medsym_sprite_idx; + int32_t pointer_sprite_idx; + int32_t panel_tab_idx; unsigned char manufct_level; - unsigned long manufct_required; + uint32_t manufct_required; int shots; GameTurnDelta shots_delay; unsigned short initial_delay; // Trap is placed on reload phase, value in game turns. @@ -93,13 +93,13 @@ struct TrapConfigStats { EffectOrEffElModel destroyed_effect; short size_xy; short size_z; - unsigned long sprite_anim_idx; - unsigned long attack_sprite_anim_idx; - unsigned long recharge_sprite_anim_idx; - unsigned long sprite_size_max; - unsigned long anim_speed; - unsigned long attack_anim_speed; - unsigned long recharge_anim_speed; + uint32_t sprite_anim_idx; + uint32_t attack_sprite_anim_idx; + uint32_t recharge_sprite_anim_idx; + uint32_t sprite_size_max; + uint32_t anim_speed; + uint32_t attack_anim_speed; + uint32_t recharge_anim_speed; unsigned char unanimated; unsigned char unshaded; unsigned char random_start_frame; diff --git a/src/creature_groups.h b/src/creature_groups.h index 7d57b98a2d..78d3183bd7 100644 --- a/src/creature_groups.h +++ b/src/creature_groups.h @@ -71,7 +71,7 @@ struct PartyMember { unsigned char flags; ThingModel crtr_kind; unsigned char objectv; - long countdown; + int32_t countdown; CrtrExpLevel exp_level; unsigned short carried_gold; unsigned short is_active; @@ -81,7 +81,7 @@ struct PartyMember { struct Party { char prtname[100]; struct PartyMember members[GROUP_MEMBERS_COUNT]; - unsigned long members_num; + uint32_t members_num; }; #pragma pack() diff --git a/src/creature_instances.h b/src/creature_instances.h index dad0b60499..558371c3af 100644 --- a/src/creature_instances.h +++ b/src/creature_instances.h @@ -98,12 +98,12 @@ typedef TbBool (*Creature_Target_Search_Func)(struct Thing *, CrInstance, ThingI struct InstanceInfo { TbBool instant; - long time; - long fp_time; - long action_time; - long fp_action_time; - long reset_time; - long fp_reset_time; + int32_t time; + int32_t fp_time; + int32_t action_time; + int32_t fp_action_time; + int32_t reset_time; + int32_t fp_reset_time; unsigned char graphics_idx; char postal_priority; short instance_property_flags; @@ -111,9 +111,9 @@ struct InstanceInfo { unsigned char primary_target; unsigned char func_idx; int32_t func_params[2]; - long range_min; - long range_max; - long symbol_spridx; + int32_t range_min; + int32_t range_max; + int32_t symbol_spridx; short tooltip_stridx; TbBool no_animation_loop; // Refer to creature_instances_validate_func_list diff --git a/src/dungeon_stats.h b/src/dungeon_stats.h index c3f0ebdd15..ce14c7810e 100644 --- a/src/dungeon_stats.h +++ b/src/dungeon_stats.h @@ -30,71 +30,71 @@ extern "C" { #pragma pack(1) struct LevelStats { - unsigned long things_researched; - unsigned long creatures_attracted; - unsigned long gold_mined; - unsigned long manufactured_doors; - unsigned long manufactured_traps; - unsigned long manufactured_items; - unsigned long start_time; - unsigned long end_time; - unsigned long creatures_trained; - unsigned long creatures_tortured; - unsigned long creatures_sacrificed; - unsigned long creatures_converted; - unsigned long creatures_summoned; - unsigned long num_slaps; - unsigned long num_caveins; - unsigned long bridges_built; - unsigned long rock_dug_out; - unsigned long salary_cost; - unsigned long flies_killed_by_spiders; - unsigned long territory_destroyed; - unsigned long territory_lost; - unsigned long rooms_constructed; - unsigned long traps_used; - unsigned long traps_armed; - unsigned long doors_used; - unsigned long keepers_destroyed; - unsigned long area_claimed; - unsigned long backs_stabbed; - unsigned long chickens_hatched; - unsigned long chickens_eaten; - unsigned long chickens_wasted; - unsigned long promises_broken; - unsigned long ghosts_raised; - unsigned long skeletons_raised; - unsigned long friendly_kills; - unsigned long lies_told; - unsigned long creatures_annoyed; - unsigned long graveyard_bodys; - unsigned long vamps_created; - unsigned long num_creatures; - unsigned long imps_deployed; - unsigned long battles_won; - unsigned long battles_lost; - unsigned long money; - unsigned long dngn_breached_count; - unsigned long doors_destroyed; - unsigned long rooms_destroyed; - unsigned long dungeon_area; - unsigned long ideas_researched; - unsigned long creatures_scavenged; - unsigned long creatures_from_sacrifice; - unsigned long spells_stolen; - unsigned long gold_pots_stolen; - unsigned long average_room_efficiency; - unsigned long player_rating; - unsigned long player_style; - unsigned long doors_unused; - unsigned long traps_unused; - unsigned long num_rooms; - unsigned long gameplay_time; - unsigned long num_entrances; - unsigned long hopes_dashed; - unsigned long allow_save_score; - unsigned long player_score; - unsigned long keeper_destroyed[PLAYERS_COUNT]; + uint32_t things_researched; + uint32_t creatures_attracted; + uint32_t gold_mined; + uint32_t manufactured_doors; + uint32_t manufactured_traps; + uint32_t manufactured_items; + uint32_t start_time; + uint32_t end_time; + uint32_t creatures_trained; + uint32_t creatures_tortured; + uint32_t creatures_sacrificed; + uint32_t creatures_converted; + uint32_t creatures_summoned; + uint32_t num_slaps; + uint32_t num_caveins; + uint32_t bridges_built; + uint32_t rock_dug_out; + uint32_t salary_cost; + uint32_t flies_killed_by_spiders; + uint32_t territory_destroyed; + uint32_t territory_lost; + uint32_t rooms_constructed; + uint32_t traps_used; + uint32_t traps_armed; + uint32_t doors_used; + uint32_t keepers_destroyed; + uint32_t area_claimed; + uint32_t backs_stabbed; + uint32_t chickens_hatched; + uint32_t chickens_eaten; + uint32_t chickens_wasted; + uint32_t promises_broken; + uint32_t ghosts_raised; + uint32_t skeletons_raised; + uint32_t friendly_kills; + uint32_t lies_told; + uint32_t creatures_annoyed; + uint32_t graveyard_bodys; + uint32_t vamps_created; + uint32_t num_creatures; + uint32_t imps_deployed; + uint32_t battles_won; + uint32_t battles_lost; + uint32_t money; + uint32_t dngn_breached_count; + uint32_t doors_destroyed; + uint32_t rooms_destroyed; + uint32_t dungeon_area; + uint32_t ideas_researched; + uint32_t creatures_scavenged; + uint32_t creatures_from_sacrifice; + uint32_t spells_stolen; + uint32_t gold_pots_stolen; + uint32_t average_room_efficiency; + uint32_t player_rating; + uint32_t player_style; + uint32_t doors_unused; + uint32_t traps_unused; + uint32_t num_rooms; + uint32_t gameplay_time; + uint32_t num_entrances; + uint32_t hopes_dashed; + uint32_t allow_save_score; + uint32_t player_score; + uint32_t keeper_destroyed[PLAYERS_COUNT]; }; #pragma pack() diff --git a/src/engine_camera.h b/src/engine_camera.h index 360359da74..a8b62ee2ca 100644 --- a/src/engine_camera.h +++ b/src/engine_camera.h @@ -59,8 +59,8 @@ enum CameraIndexValues { }; struct MinMax { // sizeof = 8 - long min; - long max; + int32_t min; + int32_t max; }; struct ComponentVector { @@ -79,9 +79,9 @@ struct Camera { int zoom; int inertia_rotation; TbBool in_active_movement_rotation; - long inertia_x; + int32_t inertia_x; TbBool in_active_movement_x; - long inertia_y; + int32_t inertia_y; TbBool in_active_movement_y; }; diff --git a/src/game_legacy.h b/src/game_legacy.h index cef0d994af..cf18c268b9 100644 --- a/src/game_legacy.h +++ b/src/game_legacy.h @@ -355,7 +355,6 @@ struct Game { unsigned char slab_ext_data[MAX_TILES_X*MAX_TILES_Y]; unsigned char slab_ext_data_initial[MAX_TILES_X*MAX_TILES_Y]; float delta_time; - long double process_turn_time; float flash_button_time; MapSubtlCoord map_subtiles_x; MapSubtlCoord map_subtiles_y; @@ -383,6 +382,8 @@ extern int32_t game_num_fps_draw_current; extern int32_t game_num_fps_draw_main; extern int32_t game_num_fps_draw_secondary; +extern long double process_turn_time; + /******************************************************************************/ #ifdef __cplusplus } diff --git a/src/power_hand.h b/src/power_hand.h index eccda2ca49..22e3b50d02 100644 --- a/src/power_hand.h +++ b/src/power_hand.h @@ -116,7 +116,7 @@ struct HandRule { char type; char enabled; char allow; // allow: 1, deny: 0 - long param; + int32_t param; }; TbBool eval_hand_rule_for_thing(struct HandRule *rule, const struct Thing *thing_to_pick); From cef9c5201d7f3bd932dd00260b02db62b4d10125 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Wed, 4 Mar 2026 18:43:23 +0100 Subject: [PATCH 16/16] PRIu32 --- src/console_cmd.c | 2 +- src/player_utils.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/console_cmd.c b/src/console_cmd.c index bfd1541d24..0022d2a625 100644 --- a/src/console_cmd.c +++ b/src/console_cmd.c @@ -142,7 +142,7 @@ static long cmd_comp_procs_update(struct GuiBox *gbox, struct GuiBoxOption *gopt if (cproc != NULL) { char *label = (char*)goptn[i].label; - sprintf(label, "%02lx", cproc->flags); + sprintf(label, "%02" PRIx32, cproc->flags); label[2] = ' '; } } diff --git a/src/player_utils.c b/src/player_utils.c index 048364359d..7bea5faee1 100644 --- a/src/player_utils.c +++ b/src/player_utils.c @@ -19,6 +19,8 @@ #include "pre_inc.h" #include "player_utils.h" +#include + #include "globals.h" #include "bflib_basics.h" #include "bflib_math.h" @@ -113,7 +115,7 @@ void set_player_as_won_level(struct PlayerInfo *player) show_real_time_taken(); } struct GameTime GameT = get_game_time(dungeon->lvstats.hopes_dashed, game_num_fps); - SYNCMSG("Won level %u. Total turns taken: %lu (%02u:%02u:%02u at %d fps). Real time elapsed: %02u:%02u:%02u:%03u.", + SYNCMSG("Won level %u. Total turns taken: %" PRIu32 " (%02u:%02u:%02u at %d fps). Real time elapsed: %02u:%02u:%02u:%03u.", game.loaded_level_number, dungeon->lvstats.hopes_dashed, GameT.Hours, GameT.Minutes, GameT.Seconds, game_num_fps, Timer.Hours, Timer.Minutes, Timer.Seconds, Timer.MSeconds);