void reset_player_mode(struct PlayerInfo *player, unsigned short nmode) { player->view_type = nmode; switch (nmode) { case PVT_DungeonTop: player->work_state = player->continue_work_state; if (player->view_mode_restore == PVM_FrontView) set_engine_view(player, PVM_FrontView); else set_engine_view(player, PVM_IsometricView); if (is_my_player(player)) game.numfield_D &= ~numfield_D_01; break; case PVT_CreatureContrl: case PVT_CreaturePasngr: player->work_state = player->continue_work_state; set_engine_view(player, PVM_CreatureView); if (is_my_player(player)) game.numfield_D |= numfield_D_01; break; case PVT_MapScreen: player->work_state = player->continue_work_state; set_engine_view(player, PVM_ParchmentView); if (is_my_player(player)) game.numfield_D &= ~numfield_D_01; break; default: break; } }
void set_engine_view(struct PlayerInfo *player, long val) { switch ( val ) { case PVM_EmptyView: player->acamera = &player->cameras[CamIV_Isometric]; // Allow view mode 0 only for non-local-human players if (!is_my_player(player)) break; // If it's local human player, then setting this mode is an error // no break default: ERRORLOG("Invalid view mode %d",(int)val); val = PVM_CreatureView; // no break case PVM_CreatureView: player->acamera = &player->cameras[CamIV_FirstPerson]; if (!is_my_player(player)) break; lens_mode = 2; set_sprite_view_3d(); S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(0); LbMouseSetPosition((MyScreenWidth/pixel_size) >> 1,(MyScreenHeight/pixel_size) >> 1); break; case PVM_IsometricView: player->acamera = &player->cameras[CamIV_Isometric]; if (!is_my_player(player)) break; lens_mode = 0; set_sprite_view_isometric(); S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(1280); break; case PVM_ParchmentView: player->acamera = &player->cameras[CamIV_Parchment]; if (!is_my_player(player)) break; S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(1280); break; case PVM_ParchFadeIn: case PVM_ParchFadeOut: // In fade states, keep the settings unchanged break; case PVM_FrontView: player->acamera = &player->cameras[CamIV_FrontView]; if (!is_my_player(player)) break; lens_mode = 0; set_sprite_view_isometric(); S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(1280); break; } player->view_mode = val; }
void set_engine_view(struct PlayerInfo *player, long val) { //_DK_set_engine_view(player, val); switch ( val ) { case 0: player->acamera = &player->cameras[0]; // Allow view mode 0 only for non-local-human players if (!is_my_player(player)) break; // If it's local human player, then setting this mode is an error default: ERRORLOG("Invalid view mode %d",(int)val); val = 1; case 1: player->acamera = &player->cameras[1]; if (!is_my_player(player)) break; lens_mode = 2; set_sprite_view_3d(); S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(0); LbMouseSetPosition((MyScreenWidth/pixel_size) >> 1,(MyScreenHeight/pixel_size) >> 1); break; case 2: player->acamera = &player->cameras[0]; if (!is_my_player(player)) break; lens_mode = 0; set_sprite_view_isometric(); S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(1280); break; case 3: player->acamera = &player->cameras[2]; if (!is_my_player(player)) break; S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(1280); break; case 5: player->acamera = &player->cameras[3]; if (!is_my_player(player)) break; lens_mode = 0; set_sprite_view_isometric(); S3DSetLineOfSightFunction(dummy_sound_line_of_sight); S3DSetDeadzoneRadius(1280); break; } player->view_mode = val; }
void set_player_mode(struct PlayerInfo *player, long nview) { long i; if (player->view_type == nview) return; player->view_type = nview; player->allocflags &= ~PlaF_Unknown8; if (is_my_player(player)) { game.numfield_D &= ~numfield_D_08; game.numfield_D |= numfield_D_01; if (is_my_player(player)) stop_all_things_playing_samples(); } switch (player->view_type) { case PVT_DungeonTop: i = PVM_IsometricView; if (player->view_mode_restore == PVM_FrontView) { set_engine_view(player, PVM_IsometricView); i = PVM_FrontView; } set_engine_view(player, i); if (is_my_player(player)) toggle_status_menu((game.status_flags & Status_ShowStatusMenu)); if ((game.status_flags & Status_ShowGui) != 0) setup_engine_window(status_panel_width, 0, MyScreenWidth, MyScreenHeight); else setup_engine_window(0, 0, MyScreenWidth, MyScreenHeight); break; case PVT_CreatureContrl: case PVT_CreaturePasngr: set_engine_view(player, PVM_CreatureView); if (is_my_player(player)) game.numfield_D &= ~numfield_D_01; setup_engine_window(0, 0, MyScreenWidth, MyScreenHeight); break; case PVT_MapScreen: player->continue_work_state = player->work_state; set_engine_view(player, PVM_ParchmentView); break; case PVT_MapFadeIn: set_player_instance(player, PI_MapFadeTo, 0); break; case PVT_MapFadeOut: set_player_instance(player, PI_MapFadeFrom, 0); break; } }
struct Thing *create_and_control_creature_as_controller(struct PlayerInfo *player, long breed, struct Coord3d *pos) { struct CreatureStats *crstat; struct CreatureControl *cctrl; struct Dungeon *dungeon; struct Thing *thing; struct Camera *cam; struct InitLight ilght; SYNCDBG(6,"Request for model %ld at (%d,%d,%d)",breed,(int)pos->x.val,(int)pos->y.val,(int)pos->z.val); //return _DK_create_and_control_creature_as_controller(player, a2, pos); thing = create_creature(pos, breed, player->id_number); if (thing_is_invalid(thing)) return INVALID_THING; dungeon = get_dungeon(thing->owner); dungeon->num_active_creatrs--; dungeon->owned_creatures_of_model[thing->model]--; if (is_my_player(player)) { toggle_status_menu(0); turn_off_roaming_menus(); } cam = player->acamera; player->controlled_thing_idx = thing->index; player->field_31 = thing->creation_turn; player->field_4B5 = cam->field_6; thing->alloc_flags |= TAlF_IsControlled; thing->field_4F |= 0x01; cctrl = creature_control_get_from_thing(thing); cctrl->flgfield_2 |= 0x02; cctrl->max_speed = calculate_correct_creature_maxspeed(thing); set_player_mode(player, PVT_CreatureContrl); set_start_state(thing); // Preparing light object LbMemorySet(&ilght, 0, sizeof(struct InitLight)); ilght.mappos.x.val = thing->mappos.x.val; ilght.mappos.y.val = thing->mappos.y.val; ilght.mappos.z.val = thing->mappos.z.val; ilght.field_2 = 36; ilght.field_3 = 1; ilght.is_dynamic = 1; ilght.field_0 = 2560; thing->light_id = light_create_light(&ilght); if (thing->light_id != 0) { light_set_light_never_cache(thing->light_id); } else { ERRORLOG("Cannot allocate light to new hero"); } if (is_my_player_number(thing->owner)) { if (thing->class_id == TCls_Creature) { crstat = creature_stats_get_from_thing(thing); setup_eye_lens(crstat->eye_effect); } } return thing; }
void start_resurrect_creature(struct PlayerInfo *player, struct Thing *thing) { struct Dungeon *dungeon; dungeon = get_dungeon(player->id_number); if (dungeon->dead_creatures_count != 0) { if (is_my_player(player)) { dungeon_special_selected = thing->index; resurrect_creature_scroll_offset = 0; turn_off_menu(GMnu_DUNGEON_SPECIAL); turn_on_menu(GMnu_RESURRECT_CREATURE); } } }
void start_transfer_creature(struct PlayerInfo *player, struct Thing *thing) { struct Dungeon *dungeon; dungeon = get_dungeon(player->id_number); if (dungeon->num_active_creatrs != 0) { if (is_my_player(player)) { dungeon_special_selected = thing->index; transfer_creature_scroll_offset = 0; turn_off_menu(GMnu_DUNGEON_SPECIAL); turn_on_menu(GMnu_TRANSFER_CREATURE); } } }
void set_player_state(struct PlayerInfo *player, short nwrk_state, long chosen_kind) { struct Thing *thing; struct Coord3d pos; // Selecting the same state again - update only 2nd parameter if (player->work_state == nwrk_state) { switch ( player->work_state ) { case PSt_BuildRoom: player->chosen_room_kind = chosen_kind; break; case PSt_PlaceTrap: player->chosen_trap_kind = chosen_kind; break; case PSt_PlaceDoor: player->chosen_door_kind = chosen_kind; break; } return; } player->continue_work_state = player->work_state; player->work_state = nwrk_state; if (is_my_player(player)) game.field_14E92E = 0; if ((player->work_state != PSt_CreatrQuery) && (player->work_state != PSt_CreatrInfo) && (player->work_state != PSt_Possession) && (player->work_state != PSt_CtrlPassngr) && (player->work_state != PSt_FreePossession) && (player->work_state != PSt_FreeCtrlPassngr)) { clear_selected_thing(player); } switch (player->work_state) { case PSt_CtrlDungeon: player->field_4A4 = 1; break; case PSt_BuildRoom: player->chosen_room_kind = chosen_kind; break; case PSt_HoldInHand: create_power_hand(player->id_number); break; case PSt_Slap: pos.x.val = 0; pos.y.val = 0; pos.z.val = 0; thing = create_object(&pos, 37, player->id_number, -1); if (thing_is_invalid(thing)) { player->hand_thing_idx = 0; break; } player->hand_thing_idx = thing->index; set_power_hand_graphic(player->id_number, 785, 256); place_thing_in_limbo(thing); break; case PSt_PlaceTrap: player->chosen_trap_kind = chosen_kind; break; case PSt_PlaceDoor: player->chosen_door_kind = chosen_kind; break; default: break; } }
void activate_dungeon_special(struct Thing *cratetng, struct PlayerInfo *player) { SYNCDBG(6,"Starting"); short used; struct Coord3d pos; int spkindidx; // Gathering data which we'll need if the special is used and disposed. memcpy(&pos,&cratetng->mappos,sizeof(struct Coord3d)); spkindidx = cratetng->model - 86; used = 0; if (thing_exists(cratetng) && is_dungeon_special(cratetng)) { switch (cratetng->model) { case 86: reveal_whole_map(player); remove_events_thing_is_attached_to(cratetng); used = 1; delete_thing_structure(cratetng, 0); break; case 87: start_resurrect_creature(player, cratetng); break; case 88: start_transfer_creature(player, cratetng); break; case 89: if (steal_hero(player, &cratetng->mappos)) { remove_events_thing_is_attached_to(cratetng); used = 1; delete_thing_structure(cratetng, 0); } break; case 90: multiply_creatures(player); remove_events_thing_is_attached_to(cratetng); used = 1; delete_thing_structure(cratetng, 0); break; case 91: increase_level(player); remove_events_thing_is_attached_to(cratetng); used = 1; delete_thing_structure(cratetng, 0); break; case 92: make_safe(player); remove_events_thing_is_attached_to(cratetng); used = 1; delete_thing_structure(cratetng, 0); break; case 93: activate_bonus_level(player); remove_events_thing_is_attached_to(cratetng); used = 1; delete_thing_structure(cratetng, 0); break; default: ERRORLOG("Invalid dungeon special (Model %d)", (int)cratetng->model); break; } if ( used ) { if (is_my_player(player)) output_message(special_desc[spkindidx].speech_msg, 0, true); create_special_used_effect(&pos, player->id_number); } } }