Beispiel #1
0
static void validate_character_presets(const struct nh_roles_info *ri,
				       int *initrole, int *initrace,
				       int *initgend, int *initalign)
{
    struct nh_listitem list[1];
    char listbuffer[256];
    
    list[0].caption = listbuffer;
    
    /* throw out obviously invalid values */
    if (*initrole < ROLE_RANDOM || *initrole >= ri->num_roles)
	*initrole = ROLE_NONE;
    if (*initrace < ROLE_RANDOM || *initrace >= ri->num_races)
	*initrace = ROLE_NONE;
    if (*initgend < ROLE_RANDOM || *initgend >= ri->num_genders)
	*initgend = ROLE_NONE;
    if (*initalign < ROLE_RANDOM || *initalign >= ri->num_aligns)
	*initalign = ROLE_NONE;
    
    /* catch mutually incompatible character options (male valkyrie) */
    if (!is_valid_character(ri, *initrole, *initrace, *initgend, *initalign)) {
	/* always keep the role */
	if (is_valid_character(ri, *initrole, *initrace, *initgend, ROLE_NONE)) {
	    curses_msgwin("Incompatible alignment!");
	    *initalign = ROLE_NONE;
	} else if (is_valid_character(ri, *initrole, *initrace, ROLE_NONE, *initalign)) {
	    curses_msgwin("Incompatible gender!");
	    *initgend = ROLE_NONE;
	} else if (is_valid_character(ri, *initrole, ROLE_NONE, *initgend, *initalign)) {
	    curses_msgwin("Incompatible race!");
	    *initrace = ROLE_NONE;
	} else {
	    curses_msgwin("Incompatible character presets!");
	    *initrace = ROLE_NONE;
	    *initgend = ROLE_NONE;
	    *initalign = ROLE_NONE;
	}
    }
    
    /* if there is only one possible option for any attribute, choose it here */
    if ((*initrole == ROLE_NONE || *initrole == ROLE_RANDOM) &&
	get_valid_roles(ri, *initrace, *initgend, *initalign, list, 1) == 1)
	*initrole = list[0].id;
    
    if ((*initrace == ROLE_NONE || *initrace == ROLE_RANDOM) &&
	get_valid_races(ri, *initrole, *initgend, *initalign, list, 1) == 1)
	*initrace = list[0].id;
    
    if ((*initgend == ROLE_NONE || *initgend == ROLE_RANDOM) &&
	get_valid_genders(ri, *initrole, *initrace, *initalign, list, 1) == 1)
	*initgend = list[0].id;
    
    if ((*initalign == ROLE_NONE || *initalign == ROLE_RANDOM) &&
	get_valid_aligns(ri, *initrole, *initrace, *initgend, list, 1) == 1)
	*initalign = list[0].id;
}
Beispiel #2
0
static void
obtain_audio_encoding_from_headers (scloud_prc_t * ap_prc,
                                    const char * ap_header, const size_t a_size)
{
  assert (ap_prc);
  assert (ap_header);
  {
    const char * p_end = ap_header + a_size;
    const char * p_value = (const char *) memchr (ap_header, ':', a_size);
    char name[64];

    if (p_value && (size_t) (p_value - ap_header) < sizeof (name))
      {
        memcpy (name, ap_header, p_value - ap_header);
        name[p_value - ap_header] = 0;

        /* skip the colon */
        ++p_value;

        /* strip the value */
        while (p_value < p_end && !is_valid_character (*p_value))
          {
            ++p_value;
          }

        while (p_end > p_value && !is_valid_character (p_end[-1]))
          {
            --p_end;
          }

        {
          char * p_info = tiz_mem_calloc (1, (p_end - p_value) + 1);
          memcpy (p_info, p_value, p_end - p_value);
          p_info[(p_end - p_value)] = '\0';
          TIZ_TRACE (handleOf (ap_prc), "header name  : [%s]", name);
          TIZ_TRACE (handleOf (ap_prc), "header value : [%s]", p_info);

          if (strncasecmp (name, "Content-Type", 12) == 0)
            {
              obtain_coding_type (ap_prc, p_info);
              /* Now set the new coding type value on the output port */
              (void) set_audio_coding_on_port (ap_prc);
            }
          else if (strncasecmp (name, "Content-Length", 14) == 0)
            {
              obtain_content_length (ap_prc, p_info);
            }
          tiz_mem_free (p_info);
        }
      }
  }
}
Beispiel #3
0
static int get_valid_roles(const struct nh_roles_info *ri, int racenum,
			   int gendnum, int alignnum, struct nh_listitem *list, int listlen)
{
    int i;
    int count = 0;
    char rolenamebuf[256];
    
    for (i = 0; i < ri->num_roles; i++) {
	if (!is_valid_character(ri, i, racenum, gendnum, alignnum))
	    continue;
	
	if (list && count < listlen) {
	    if (gendnum != ROLE_NONE && gendnum != ROLE_RANDOM) {
		if (gendnum == 1  && ri->rolenames_f[i])
		    strcpy(rolenamebuf, ri->rolenames_f[i]);
		else
		    strcpy(rolenamebuf, ri->rolenames_m[i]);
	    } else {
		if (ri->rolenames_f[i]) {
		    strcpy(rolenamebuf, ri->rolenames_m[i]);
		    strcat(rolenamebuf, "/");
		    strcat(rolenamebuf, ri->rolenames_f[i]);
		} else
		    strcpy(rolenamebuf, ri->rolenames_m[i]);
	    }
	    strcpy(list[count].caption, rolenamebuf);
	    list[count].id = i;
	}
	count++;
    }
    return count;
}
Beispiel #4
0
void NewRoomNPC(int charid, int nrnum, int newx, int newy) {
    if (!is_valid_character(charid))
        quit("!NewRoomNPC: invalid character");
    if (charid == game.playercharacter)
        quit("!NewRoomNPC: use NewRoomEx with the player character");

    Character_ChangeRoom(&game.chars[charid], nrnum, newx, newy);
}
Beispiel #5
0
static int get_valid_genders(const struct nh_roles_info *ri, int rolenum,
			   int racenum, int alignnum, struct nh_listitem *list, int listlen)
{
    int i;
    int count = 0;
    
    for (i = 0; i < ri->num_genders; i++) {
	if (!is_valid_character(ri, rolenum, racenum, i, alignnum))
	    continue;
	
	if (list && count < listlen) {
	    strcpy(list[count].caption, ri->gendnames[i]);
	    list[count].id = i;
	}
	count++;
    }
    return count;
}
Beispiel #6
0
void AnimateCharacterEx(int chh, int loopn, int sppd, int rept, int direction, int blocking) {
    if ((direction < 0) || (direction > 1))
        quit("!AnimateCharacterEx: invalid direction");
    if (!is_valid_character(chh))
        quit("AnimateCharacter: invalid character");

    if (direction)
        direction = BACKWARDS;
    else
        direction = FORWARDS;

    if (blocking)
        blocking = BLOCKING;
    else
        blocking = IN_BACKGROUND;

    Character_Animate(&game.chars[chh], loopn, sppd, rept, blocking, direction);

}
Beispiel #7
0
void RunCharacterInteraction (int cc, int mood) {
    if (!is_valid_character(cc))
        quit("!RunCharacterInteraction: invalid character");

    int passon=-1,cdata=-1;
    if (mood==MODE_LOOK) passon=0;
    else if (mood==MODE_HAND) passon=1;
    else if (mood==MODE_TALK) passon=2;
    else if (mood==MODE_USE) { passon=3;
    cdata=playerchar->activeinv;
    play.usedinv=cdata;
    }
    else if (mood==MODE_PICKUP) passon = 5;
    else if (mood==MODE_CUSTOM1) passon = 6;
    else if (mood==MODE_CUSTOM2) passon = 7;

    evblockbasename="character%d"; evblocknum=cc;
    if (game.charScripts != NULL) 
    {
        if (passon>=0)
            run_interaction_script(game.charScripts[cc], passon, 4, (passon == 3));
        run_interaction_script(game.charScripts[cc], 4);  // any click on char
    }
}
Beispiel #8
0
void ReleaseCharacterView(int chat) {
    if (!is_valid_character(chat))
        quit("!ReleaseCahracterView: invalid character supplied");

    Character_UnlockView(&game.chars[chat]);
}
Beispiel #9
0
void scAnimateCharacter (int chh, int loopn, int sppd, int rept) {
    if (!is_valid_character(chh))
        quit("AnimateCharacter: invalid character");

    animate_character(&game.chars[chh], loopn, sppd, rept);
}
Beispiel #10
0
// the 'cmdsrun' parameter counts how many commands are run.
// if a 'Inv Item Was Used' check does not pass, it doesn't count
// so cmdsrun remains 0 if no inventory items matched
int run_interaction_commandlist (InteractionCommandList *nicl, int *timesrun, int*cmdsrun) {
    size_t i;

    if (nicl == NULL)
        return -1;

    for (i = 0; i < nicl->Cmds.size(); i++) {
        cmdsrun[0] ++;
        int room_was = play.room_changes;

        switch (nicl->Cmds[i].Type) {
      case 0:  // Do nothing
          break;
      case 1:  // Run script
          { 
              TempEip tempip(4001);
              RuntimeScriptValue rval_null;
              update_mp3();
                  if ((strstr(evblockbasename,"character")!=0) || (strstr(evblockbasename,"inventory")!=0)) {
                      // Character or Inventory (global script)
                      const char *torun = make_ts_func_name(evblockbasename,evblocknum,nicl->Cmds[i].Data[0].Value);
                      // we are already inside the mouseclick event of the script, can't nest calls
                      QueueScriptFunction(kScInstGame, torun);
                  }
                  else {
                      // Other (room script)
                      const char *torun = make_ts_func_name(evblockbasename,evblocknum,nicl->Cmds[i].Data[0].Value);
                      QueueScriptFunction(kScInstRoom, torun);
                  }
                  update_mp3();
                      break;
          }
      case 2:  // Add score (first time)
          if (timesrun[0] > 0)
              break;
          timesrun[0] ++;
      case 3:  // Add score
          GiveScore (IPARAM1);
          break;
      case 4:  // Display Message
          /*        if (comprdata<0)
          display_message_aschar=evb->data[ss];*/
          DisplayMessage(IPARAM1);
          break;
      case 5:  // Play Music
          PlayMusicResetQueue(IPARAM1);
          break;
      case 6:  // Stop Music
          stopmusic ();
          break;
      case 7:  // Play Sound
          play_sound (IPARAM1);
          break;
      case 8:  // Play Flic
          play_flc_file(IPARAM1, IPARAM2);
          break;
      case 9:  // Run Dialog
          { int room_was = play.room_changes;
          RunDialog(IPARAM1);
          // if they changed room within the dialog script,
          // the interaction command list is no longer valid
          if (room_was != play.room_changes)
              return -1;
          }
          break;
      case 10: // Enable Dialog Option
          SetDialogOption (IPARAM1, IPARAM2, 1);
          break;
      case 11: // Disable Dialog Option
          SetDialogOption (IPARAM1, IPARAM2, 0);
          break;
      case 12: // Go To Screen
          Character_ChangeRoomAutoPosition(playerchar, IPARAM1, IPARAM2);
          return -1;
      case 13: // Add Inventory
          add_inventory (IPARAM1);
          break;
      case 14: // Move Object
          MoveObject (IPARAM1, IPARAM2, IPARAM3, IPARAM4);
          // if they want to wait until finished, do so
          if (IPARAM5)
              GameLoopUntilEvent(UNTIL_MOVEEND,(long)&objs[IPARAM1].moving);
          break;
      case 15: // Object Off
          ObjectOff (IPARAM1);
          break;
      case 16: // Object On
          ObjectOn (IPARAM1);
          break;
      case 17: // Set Object View
          SetObjectView (IPARAM1, IPARAM2);
          break;
      case 18: // Animate Object
          AnimateObject (IPARAM1, IPARAM2, IPARAM3, IPARAM4);
          break;
      case 19: // Move Character
          if (IPARAM4)
              MoveCharacterBlocking (IPARAM1, IPARAM2, IPARAM3, 0);
          else
              MoveCharacter (IPARAM1, IPARAM2, IPARAM3);
          break;
      case 20: // If Inventory Item was used
          if (play.usedinv == IPARAM1) {
              if (game.options[OPT_NOLOSEINV] == 0)
                  lose_inventory (play.usedinv);
              if (run_interaction_commandlist (nicl->Cmds[i].Children.get(), timesrun, cmdsrun))
                  return -1;
          }
          else
              cmdsrun[0] --;
          break;
      case 21: // if player has inventory item
          if (playerchar->inv[IPARAM1] > 0)
              if (run_interaction_commandlist (nicl->Cmds[i].Children.get(), timesrun, cmdsrun))
                  return -1;
          break;
      case 22: // if a character is moving
          if (game.chars[IPARAM1].walking)
              if (run_interaction_commandlist (nicl->Cmds[i].Children.get(), timesrun, cmdsrun))
                  return -1;
          break;
      case 23: // if two variables are equal
          if (IPARAM1 == IPARAM2)
              if (run_interaction_commandlist (nicl->Cmds[i].Children.get(), timesrun, cmdsrun))
                  return -1;
          break;
      case 24: // Stop character walking
          StopMoving (IPARAM1);
          break;
      case 25: // Go to screen at specific co-ordinates
          NewRoomEx (IPARAM1, IPARAM2, IPARAM3);
          return -1;
      case 26: // Move NPC to different room
          if (!is_valid_character(IPARAM1))
              quit("!Move NPC to different room: invalid character specified");
          game.chars[IPARAM1].room = IPARAM2;
          break;
      case 27: // Set character view
          SetCharacterView (IPARAM1, IPARAM2);
          break;
      case 28: // Release character view
          ReleaseCharacterView (IPARAM1);
          break;
      case 29: // Follow character
          FollowCharacter (IPARAM1, IPARAM2);
          break;
      case 30: // Stop following
          FollowCharacter (IPARAM1, -1);
          break;
      case 31: // Disable hotspot
          DisableHotspot (IPARAM1);
          break;
      case 32: // Enable hotspot
          EnableHotspot (IPARAM1);
          break;
      case 33: // Set variable value
          get_interaction_variable(nicl->Cmds[i].Data[0].Value)->Value = IPARAM2;
          break;
      case 34: // Run animation
          scAnimateCharacter(IPARAM1, IPARAM2, IPARAM3, 0);
          GameLoopUntilEvent(UNTIL_SHORTIS0,(long)&game.chars[IPARAM1].animating);
          break;
      case 35: // Quick animation
          SetCharacterView (IPARAM1, IPARAM2);
          scAnimateCharacter(IPARAM1, IPARAM3, IPARAM4, 0);
          GameLoopUntilEvent(UNTIL_SHORTIS0,(long)&game.chars[IPARAM1].animating);
          ReleaseCharacterView (IPARAM1);
          break;
      case 36: // Set idle animation
          SetCharacterIdle (IPARAM1, IPARAM2, IPARAM3);
          break;
      case 37: // Disable idle animation
          SetCharacterIdle (IPARAM1, -1, -1);
          break;
      case 38: // Lose inventory item
          lose_inventory (IPARAM1);
          break;
      case 39: // Show GUI
          InterfaceOn (IPARAM1);
          break;
      case 40: // Hide GUI
          InterfaceOff (IPARAM1);
          break;
      case 41: // Stop running more commands
          return -1;
      case 42: // Face location
          FaceLocation (IPARAM1, IPARAM2, IPARAM3);
          break;
      case 43: // Pause command processor
          scrWait (IPARAM1);
          break;
      case 44: // Change character view
          ChangeCharacterView (IPARAM1, IPARAM2);
          break;
      case 45: // If player character is
          if (GetPlayerCharacter() == IPARAM1)
              if (run_interaction_commandlist (nicl->Cmds[i].Children.get(), timesrun, cmdsrun))
                  return -1;
          break;
      case 46: // if cursor mode is
          if (GetCursorMode() == IPARAM1)
              if (run_interaction_commandlist (nicl->Cmds[i].Children.get(), timesrun, cmdsrun))
                  return -1;
          break;
      case 47: // if player has been to room
          if (HasBeenToRoom(IPARAM1))
              if (run_interaction_commandlist (nicl->Cmds[i].Children.get(), timesrun, cmdsrun))
                  return -1;
          break;
      default:
          quit("unknown new interaction command");
          break;
        }

        // if the room changed within the action, nicl is no longer valid
        if (room_was != play.room_changes)
            return -1;
    }
    return 0;

}
Beispiel #11
0
static nh_bool tutorial_player_selection(int *out_role, int *out_race,
					 int *out_gend, int *out_align)
{
    const struct nh_roles_info *ri;
    struct nh_menuitem items[4];	/* 3 options + quit */
    int pick_list[2];
    int result;

    ri = nh_get_roles();
    if (!ri)
	return FALSE;

    set_menuitem(&items[0], 1, MI_NORMAL,
		 "lawful female dwarf Valkyrie (uses melee and thrown weapons)",
		 'v', 0);
    set_menuitem(&items[1], 2, MI_NORMAL,
		 "chaotic male elf Wizard      (relies mostly on spells)",
		 'w', 0);
    set_menuitem(&items[2], 3, MI_NORMAL,
		 "neutral female human Ranger  (good with ranged combat)",
		 'R', 0);
    set_menuitem(&items[3], 4, MI_NORMAL,
		 "quit",
		 'q', 0);

    result = curses_display_menu(items, 4, "Choose a character", PICK_ONE, pick_list);
    if (result == -1 || pick_list[0] == -1)
	return FALSE;

    switch (pick_list[0]) {
    case 1:
	if (!find_role(ri, "Valkyrie", out_role) ||
	    !find_race(ri, "dwarf", out_race) ||
	    !find_gend(ri, "female", out_gend) ||
	    !find_align(ri, "lawful", out_align))
	    return FALSE;
	break;
    case 2:
	if (!find_role(ri, "Wizard", out_role) ||
	    !find_race(ri, "elf", out_race) ||
	    !find_gend(ri, "male", out_gend) ||
	    !find_align(ri, "chaotic", out_align))
	    return FALSE;
	break;
    case 3:
	if (!find_role(ri, "Ranger", out_role) ||
	    !find_race(ri, "human", out_race) ||
	    !find_gend(ri, "female", out_gend) ||
	    !find_align(ri, "neutral", out_align))
	    return FALSE;
	break;
    case 4:
    default:
	return FALSE;
	break;
    }

    if (!is_valid_character(ri, *out_role, *out_race, *out_gend, *out_align))
	return FALSE;

    return TRUE;
}