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; }
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); } } } }
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; }
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); }
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; }
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); }
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 } }
void ReleaseCharacterView(int chat) { if (!is_valid_character(chat)) quit("!ReleaseCahracterView: invalid character supplied"); Character_UnlockView(&game.chars[chat]); }
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); }
// 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; }
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; }