DEH_END_MAPPING static void *DEH_SoundStart(deh_context_t *context, char *line) { int sound_number = 0; if (sscanf(line, "Sound %i", &sound_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } if (sound_number < 0 || sound_number >= NUMSFX) { DEH_Warning(context, "Invalid sound number: %i", sound_number); return NULL; } if (sound_number >= DEH_VANILLA_NUMSFX) { DEH_Warning(context, "Attempt to modify SFX %i. This will cause " "problems in Vanilla dehacked.", sound_number); } return &S_sfx[sound_number]; }
DEH_END_MAPPING static void *DEH_FrameStart(deh_context_t *context, char *line) { int frame_number = 0; state_t *state; if (sscanf(line, "Frame %i", &frame_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } if (frame_number < 0 || frame_number >= NUMSTATES) { DEH_Warning(context, "Invalid frame number: %i", frame_number); return NULL; } if (frame_number >= DEH_VANILLA_NUMSTATES) { DEH_Warning(context, "Attempt to modify frame %i: this will cause " "problems in Vanilla dehacked.", frame_number); } state = &states[frame_number]; return state; }
static deh_mapping_entry_t *GetMappingEntryByName(deh_context_t *context, deh_mapping_t *mapping, char *name) { int i; for (i=0; mapping->entries[i].name != NULL; ++i) { deh_mapping_entry_t *entry = &mapping->entries[i]; if (!strcasecmp(entry->name, name)) { if (entry->location == NULL) { DEH_Warning(context, "Field '%s' is unsupported", name); return NULL; } return entry; } } // Not found. DEH_Warning(context, "Field named '%s' not found", name); return NULL; }
DEH_END_MAPPING static void *DEH_ThingStart(deh_context_t *context, char *line) { int orig_thing_number = 0, thing_number = 0; mobjinfo_t *mobj; if (sscanf(line, "Thing %i", &orig_thing_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } // Translate to the correct thing number based on the exe version this // patch was made for. Subtract one because HHE thing numbers are // indexed from 1. thing_number = DEH_MapHereticThingType(orig_thing_number - 1); if (thing_number < 0 || thing_number >= DEH_HERETIC_NUMMOBJTYPES) { DEH_Warning(context, "Invalid thing number: %i", orig_thing_number); return NULL; } mobj = &mobjinfo[thing_number]; return mobj; }
DEH_END_MAPPING static void *DEH_WeaponStart(deh_context_t *context, char *line) { int weapon_number = 0; if (sscanf(line, "Weapon %i", &weapon_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } if (weapon_number < 0 || weapon_number >= NUMWEAPONS * 2) { DEH_Warning(context, "Invalid weapon number: %i", weapon_number); return NULL; } // Because of the tome of power, we have two levels of weapons: if (weapon_number < NUMWEAPONS) { return &wpnlev1info[weapon_number]; } else { return &wpnlev2info[weapon_number - NUMWEAPONS]; } }
DEH_END_MAPPING static void *DEH_ThingStart(deh_context_t *context, char *line) { int thing_number = 0; mobjinfo_t *mobj; if (sscanf(line, "Thing %i", &thing_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } // dehacked files are indexed from 1 --thing_number; if (thing_number < 0 || thing_number >= NUMMOBJTYPES) { DEH_Warning(context, "Invalid thing number: %i", thing_number); return NULL; } mobj = &mobjinfo[thing_number]; return mobj; }
static void *DEH_FrameStart(deh_context_t *context, char *line) { int frame_number = 0; int mapped_frame_number; state_t *state; if (sscanf(line, "Frame %i", &frame_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } // Map the HHE frame number (which assumes a Heretic 1.0 state table) // to the internal frame number (which is is the Heretic 1.3 state table): mapped_frame_number = DEH_MapHereticFrameNumber(frame_number); if (mapped_frame_number < 0 || mapped_frame_number >= DEH_HERETIC_NUMSTATES) { DEH_Warning(context, "Invalid frame number: %i", frame_number); return NULL; } state = &states[mapped_frame_number]; return state; }
static void DEH_SoundParseLine(deh_context_t *context, char *line, void *tag) { sfxinfo_t *sfx; char *variable_name, *value; int ivalue; if (tag == NULL) return; sfx = (sfxinfo_t *) tag; // Parse the assignment if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } // all values are integers ivalue = atoi(value); // Set the field value DEH_SetMapping(context, &sound_mapping, sfx, variable_name, ivalue); }
static void DEH_ThingParseLine(deh_context_t *context, char *line, void *tag) { mobjinfo_t *mobj; char *variable_name, *value; int ivalue; if (tag == NULL) return; mobj = (mobjinfo_t *) tag; // Parse the assignment if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } // printf("Set %s to %s for mobj\n", variable_name, value); // all values are integers ivalue = atoi(value); // Set the field value DEH_SetMapping(context, &thing_mapping, mobj, variable_name, ivalue); }
static void DEH_WeaponParseLine(deh_context_t *context, char *line, void *tag) { char *variable_name, *value; weaponinfo_t *weapon; int ivalue; if (tag == NULL) return; weapon = (weaponinfo_t *) tag; if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } ivalue = atoi(value); // If this is a frame field, we need to map from Heretic 1.0 frame // numbers to Heretic 1.3 frame numbers. if (M_StrCaseStr(variable_name, "frame") != NULL) { ivalue = DEH_MapHereticFrameNumber(ivalue); } DEH_SetMapping(context, &weapon_mapping, weapon, variable_name, ivalue); }
static void DEH_PointerParseLine(deh_context_t *context, char *line, void *tag) { state_t *state; char *variable_name, *value; int ivalue; if (tag == NULL) return; state = (state_t *) tag; // Parse the assignment if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } // printf("Set %s to %s for state\n", variable_name, value); // all values are integers ivalue = atoi(value); // set the appropriate field if (!strcasecmp(variable_name, "Codep frame")) { if (ivalue < 0 || ivalue >= NUMSTATES) { DEH_Warning(context, "Invalid state '%i'", ivalue); } else { state->action = codeptrs[ivalue]; } } else { DEH_Warning(context, "Unknown variable name '%s'", variable_name); } }
DEH_END_MAPPING static void *DEH_WeaponStart(deh_context_t *context, char *line) { int weapon_number = 0; if (sscanf(line, "Weapon %i", &weapon_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } if (weapon_number < 0 || weapon_number >= NUMWEAPONS) { DEH_Warning(context, "Invalid weapon number: %i", weapon_number); return NULL; } return &weaponinfo[weapon_number]; }
static void *DEH_PointerStart(deh_context_t *context, char *line) { int frame_number = 0; // FIXME: can the third argument here be something other than "Frame" // or are we ok? if (sscanf(line, "Pointer %*i (%*s %i)", &frame_number) != 1) { DEH_Warning(context, "Parse error on section start"); return NULL; } if (frame_number < 0 || frame_number >= NUMSTATES) { DEH_Warning(context, "Invalid frame number: %i", frame_number); return NULL; } return &states[frame_number]; }
static void DEH_FrameParseLine(deh_context_t *context, char *line, void *tag) { state_t *state; char *variable_name, *value; int ivalue; if (tag == NULL) return; state = (state_t *) tag; // Parse the assignment if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } // all values are integers ivalue = atoi(value); // Action pointer field is a special case: if (!strcasecmp(variable_name, "Action pointer")) { void *func; if (!GetActionPointerForOffset(ivalue, &func)) { SuggestOtherVersions(ivalue); DEH_Error(context, "Unknown action pointer: %i", ivalue); return; } state->action = func; } else { // "Next frame" numbers need to undergo mapping. if (!strcasecmp(variable_name, "Next frame")) { ivalue = DEH_MapHereticFrameNumber(ivalue); } DEH_SetMapping(context, &state_mapping, state, variable_name, ivalue); } }
static void DEH_ThingParseLine(deh_context_t *context, char *line, void *tag) { mobjinfo_t *mobj; char *variable_name, *value; int ivalue; if (tag == NULL) return; mobj = (mobjinfo_t *) tag; // Parse the assignment if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } // all values are integers ivalue = atoi(value); // If the value to be set is a frame, the frame number must // undergo transformation from a Heretic 1.0 index to a // Heretic 1.3 index. if (M_StrCaseStr(variable_name, "frame") != NULL) { ivalue = DEH_MapHereticFrameNumber(ivalue); } // Set the field value DEH_SetMapping(context, &thing_mapping, mobj, variable_name, ivalue); }
static void DEH_WeaponParseLine(deh_context_t *context, char *line, void *tag) { char *variable_name, *value; weaponinfo_t *weapon; int ivalue; if (tag == NULL) return; weapon = (weaponinfo_t *) tag; if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } ivalue = atoi(value); DEH_SetMapping(context, &weapon_mapping, weapon, variable_name, ivalue); }
static void DEH_FrameParseLine(deh_context_t *context, char *line, void *tag) { state_t *state; char *variable_name, *value; int ivalue; if (tag == NULL) return; state = (state_t *) tag; // Parse the assignment if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } // all values are integers ivalue = atoi(value); if (state == &states[NUMSTATES - 1]) { DEH_FrameOverflow(context, variable_name, ivalue); } else { // set the appropriate field DEH_SetMapping(context, &state_mapping, state, variable_name, ivalue); } }
static void DEH_CheatParseLine(deh_context_t *context, char *line, void *tag) { deh_cheat_t *cheat; char *variable_name; char *value; unsigned char *unsvalue; unsigned int i; if (!DEH_ParseAssignment(line, &variable_name, &value)) { // Failed to parse DEH_Warning(context, "Failed to parse assignment"); return; } unsvalue = (unsigned char *) value; cheat = FindCheatByName(variable_name); if (cheat == NULL) { DEH_Warning(context, "Unknown cheat '%s'", variable_name); return; } // write the value into the cheat sequence i = 0; while (unsvalue[i] != 0 && unsvalue[i] != 0xff) { // If the cheat length exceeds the Vanilla limit, stop. This // does not apply if we have the limit turned off. if (!deh_allow_long_cheats && i >= cheat->seq->sequence_len) { DEH_Warning(context, "Cheat sequence longer than supported by " "Vanilla dehacked"); break; } if (deh_apply_cheats) { cheat->seq->sequence[i] = unsvalue[i]; } ++i; // Absolute limit - don't exceed if (i >= MAX_CHEAT_LEN - cheat->seq->parameter_chars) { DEH_Error(context, "Cheat sequence too long!"); return; } } if (deh_apply_cheats) { cheat->seq->sequence[i] = '\0'; } }
static void *DEH_TextStart(deh_context_t *context, char *line) { char *repl_text; char *orig_text; int orig_offset, repl_len; int i; if (sscanf(line, "Text %i %i", &orig_offset, &repl_len) != 2) { DEH_Warning(context, "Parse error on section start"); return NULL; } repl_text = malloc(repl_len + 1); // read in the "to" text for (i=0; i<repl_len; ++i) { int c; c = DEH_GetChar(context); repl_text[i] = c; } repl_text[repl_len] = '\0'; // We don't support all strings, but at least recognise them: if (StringIsUnsupported(orig_offset)) { DEH_Warning(context, "Unsupported string replacement: %i", orig_offset); } // Find the string to replace: else if (!GetStringByOffset(orig_offset, &orig_text)) { SuggestOtherVersions(orig_offset); DEH_Error(context, "Unknown string offset: %i", orig_offset); } // Only allow string replacements that are possible in Vanilla Doom. // Chocolate Doom is unforgiving! else if (!deh_allow_long_strings && repl_len > MaxStringLength(strlen(orig_text))) { DEH_Error(context, "Replacement string is longer than the maximum " "possible in heretic.exe"); } else { // Success. DEH_AddStringReplacement(orig_text, repl_text); } // We must always free the replacement text. free(repl_text); return NULL; }