예제 #1
0
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;
  }
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
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;
  }
}
예제 #5
0
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;
}
예제 #6
0
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);
        }
    }
}
예제 #7
0
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);
    }
  }
}
예제 #8
0
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;
  }
}
예제 #9
0
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);
      }
  }
}