void FMapInfoParser::ParseDamageDefinition() { sc.MustGetString(); FName damageType = sc.String; DamageTypeDefinition dtd; ParseOpenBrace(); while (sc.MustGetAnyToken(), sc.TokenType != '}') { if (sc.Compare("FACTOR")) { sc.MustGetStringName("="); sc.MustGetFloat(); dtd.DefaultFactor = sc.Float; if (dtd.DefaultFactor == 0) dtd.ReplaceFactor = true; } else if (sc.Compare("OBITUARY")) { sc.MustGetStringName("="); sc.MustGetString(); dtd.Obituary = sc.String; } else if (sc.Compare("REPLACEFACTOR")) { dtd.ReplaceFactor = true; } else if (sc.Compare("NOARMOR")) { dtd.NoArmor = true; } else { sc.ScriptError("Unexpected data (%s) in damagetype definition.", sc.String); } } dtd.Apply(damageType); }
void FMapInfoParser::ParseSkill () { FSkillInfo skill; bool thisisdefault = false; bool acsreturnisset = false; skill.AmmoFactor = FRACUNIT; skill.DoubleAmmoFactor = 2*FRACUNIT; skill.DropAmmoFactor = -1; skill.DamageFactor = FRACUNIT; skill.FastMonsters = false; skill.SlowMonsters = false; skill.DisableCheats = false; skill.EasyBossBrain = false; skill.EasyKey = false; skill.AutoUseHealth = false; skill.RespawnCounter = 0; skill.RespawnLimit = 0; skill.Aggressiveness = FRACUNIT; skill.SpawnFilter = 0; skill.ACSReturn = 0; skill.MustConfirm = false; skill.Shortcut = 0; skill.TextColor = ""; skill.Replace.Clear(); skill.Replaced.Clear(); skill.MonsterHealth = FRACUNIT; skill.FriendlyHealth = FRACUNIT; skill.NoPain = false; skill.ArmorFactor = FRACUNIT; skill.Infighting = 0; skill.HealthFactor = FRACUNIT; sc.MustGetString(); skill.Name = sc.String; ParseOpenBrace(); while (sc.GetString ()) { if (sc.Compare ("ammofactor")) { ParseAssign(); sc.MustGetFloat (); skill.AmmoFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("doubleammofactor")) { ParseAssign(); sc.MustGetFloat (); skill.DoubleAmmoFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("dropammofactor")) { ParseAssign(); sc.MustGetFloat (); skill.DropAmmoFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("damagefactor")) { ParseAssign(); sc.MustGetFloat (); skill.DamageFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("fastmonsters")) { skill.FastMonsters = true; } else if (sc.Compare ("slowmonsters")) { skill.SlowMonsters = true; } else if (sc.Compare ("disablecheats")) { skill.DisableCheats = true; } else if (sc.Compare ("easybossbrain")) { skill.EasyBossBrain = true; } else if (sc.Compare ("easykey")) { skill.EasyKey = true; } else if (sc.Compare("autousehealth")) { skill.AutoUseHealth = true; } else if (sc.Compare("respawntime")) { ParseAssign(); sc.MustGetFloat (); skill.RespawnCounter = int(sc.Float*TICRATE); } else if (sc.Compare("respawnlimit")) { ParseAssign(); sc.MustGetNumber (); skill.RespawnLimit = sc.Number; } else if (sc.Compare("Aggressiveness")) { ParseAssign(); sc.MustGetFloat (); skill.Aggressiveness = FRACUNIT - FLOAT2FIXED(clamp(sc.Float, 0.,1.)); } else if (sc.Compare("SpawnFilter")) { ParseAssign(); if (sc.CheckNumber()) { if (sc.Number > 0) skill.SpawnFilter |= (1<<(sc.Number-1)); } else { sc.MustGetString (); if (sc.Compare("baby")) skill.SpawnFilter |= 1; else if (sc.Compare("easy")) skill.SpawnFilter |= 2; else if (sc.Compare("normal")) skill.SpawnFilter |= 4; else if (sc.Compare("hard")) skill.SpawnFilter |= 8; else if (sc.Compare("nightmare")) skill.SpawnFilter |= 16; } } else if (sc.Compare("ACSReturn")) { ParseAssign(); sc.MustGetNumber (); skill.ACSReturn = sc.Number; acsreturnisset = true; } else if (sc.Compare("ReplaceActor")) { ParseAssign(); sc.MustGetString(); FName replaced = sc.String; ParseComma(); sc.MustGetString(); FName replacer = sc.String; skill.SetReplacement(replaced, replacer); skill.SetReplacedBy(replacer, replaced); } else if (sc.Compare("Name")) { ParseAssign(); sc.MustGetString (); skill.MenuName = sc.String; } else if (sc.Compare("PlayerClassName")) { ParseAssign(); sc.MustGetString (); FName pc = sc.String; ParseComma(); sc.MustGetString (); skill.MenuNamesForPlayerClass[pc]=sc.String; } else if (sc.Compare("PicName")) { ParseAssign(); sc.MustGetString (); skill.PicName = sc.String; } else if (sc.Compare("MustConfirm")) { skill.MustConfirm = true; if (format_type == FMT_New) { if (CheckAssign()) { sc.MustGetString(); skill.MustConfirmText = sc.String; } } else { if (sc.CheckToken(TK_StringConst)) { skill.MustConfirmText = sc.String; } } } else if (sc.Compare("Key")) { ParseAssign(); sc.MustGetString(); skill.Shortcut = tolower(sc.String[0]); } else if (sc.Compare("TextColor")) { ParseAssign(); sc.MustGetString(); skill.TextColor.Format("[%s]", sc.String); } else if (sc.Compare("MonsterHealth")) { ParseAssign(); sc.MustGetFloat(); skill.MonsterHealth = FLOAT2FIXED(sc.Float); } else if (sc.Compare("FriendlyHealth")) { ParseAssign(); sc.MustGetFloat(); skill.FriendlyHealth = FLOAT2FIXED(sc.Float); } else if (sc.Compare("NoPain")) { skill.NoPain = true; } else if (sc.Compare("ArmorFactor")) { ParseAssign(); sc.MustGetFloat(); skill.ArmorFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare("HealthFactor")) { ParseAssign(); sc.MustGetFloat(); skill.HealthFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare("NoInfighting")) { skill.Infighting = LEVEL2_NOINFIGHTING; } else if (sc.Compare("TotalInfighting")) { skill.Infighting = LEVEL2_TOTALINFIGHTING; } else if (sc.Compare("DefaultSkill")) { if (DefaultSkill >= 0) { sc.ScriptError("%s is already the default skill\n", AllSkills[DefaultSkill].Name.GetChars()); } thisisdefault = true; } else if (!ParseCloseBrace()) { // Unknown sc.ScriptMessage("Unknown property '%s' found in skill definition\n", sc.String); SkipToNext(); } else { break; } } CheckEndOfFile("skill"); for(unsigned int i = 0; i < AllSkills.Size(); i++) { if (AllSkills[i].Name == skill.Name) { if (!acsreturnisset) { // Use the ACS return for the skill we are overwriting. skill.ACSReturn = AllSkills[i].ACSReturn; } AllSkills[i] = skill; if (thisisdefault) { DefaultSkill = i; } return; } } if (!acsreturnisset) { skill.ACSReturn = AllSkills.Size(); } if (thisisdefault) { DefaultSkill = AllSkills.Size(); } AllSkills.Push(skill); }
void FMapInfoParser::ParseCluster() { sc.MustGetNumber (); int clusterindex = FindWadClusterInfo (sc.Number); if (clusterindex == -1) { clusterindex = wadclusterinfos.Reserve(1); } cluster_info_t *clusterinfo = &wadclusterinfos[clusterindex]; clusterinfo->Reset(); clusterinfo->cluster = sc.Number; ParseOpenBrace(); while (sc.GetString()) { if (sc.Compare("name")) { ParseAssign(); if (ParseLookupName(clusterinfo->ClusterName)) clusterinfo->flags |= CLUSTER_LOOKUPCLUSTERNAME; } else if (sc.Compare("entertext")) { ParseAssign(); if (ParseLookupName(clusterinfo->EnterText)) clusterinfo->flags |= CLUSTER_LOOKUPENTERTEXT; } else if (sc.Compare("exittext")) { ParseAssign(); if (ParseLookupName(clusterinfo->ExitText)) clusterinfo->flags |= CLUSTER_LOOKUPEXITTEXT; } else if (sc.Compare("music")) { int order = 0; ParseAssign(); ParseMusic(clusterinfo->MessageMusic, clusterinfo->musicorder); } else if (sc.Compare("flat")) { ParseAssign(); ParseLumpOrTextureName(clusterinfo->finaleflat); } else if (sc.Compare("pic")) { ParseAssign(); ParseLumpOrTextureName(clusterinfo->finaleflat); clusterinfo->flags |= CLUSTER_FINALEPIC; } else if (sc.Compare("hub")) { clusterinfo->flags |= CLUSTER_HUB; } else if (sc.Compare("cdtrack")) { ParseAssign(); sc.MustGetNumber(); clusterinfo->cdtrack = sc.Number; } else if (sc.Compare("cdid")) { ParseAssign(); sc.MustGetString(); clusterinfo->cdid = strtoul (sc.String, NULL, 16); } else if (sc.Compare("entertextislump")) { clusterinfo->flags |= CLUSTER_ENTERTEXTINLUMP; } else if (sc.Compare("exittextislump")) { clusterinfo->flags |= CLUSTER_EXITTEXTINLUMP; } else if (!ParseCloseBrace()) { // Unknown sc.ScriptMessage("Unknown property '%s' found in map definition\n", sc.String); SkipToNext(); } else { break; } } CheckEndOfFile("cluster"); }
void FMapInfoParser::ParseConversationIDs() { ParseOpenBrace(); ParseSpawnMap(sc, ConversationIDsFromMapinfo, "Conversation ID"); }
void FMapInfoParser::ParseSpawnNums() { ParseOpenBrace(); ParseSpawnMap(sc, SpawnablesFromMapinfo, "Spawn number"); }
void FMapInfoParser::ParseSkill () { FSkillInfo skill; skill.AmmoFactor = FRACUNIT; skill.DoubleAmmoFactor = 2*FRACUNIT; skill.DropAmmoFactor = -1; skill.DamageFactor = FRACUNIT; skill.FastMonsters = false; skill.DisableCheats = false; skill.EasyBossBrain = false; skill.AutoUseHealth = false; skill.RespawnCounter = 0; skill.RespawnLimit = 0; skill.Aggressiveness = FRACUNIT; skill.SpawnFilter = 0; skill.ACSReturn = AllSkills.Size(); skill.MenuNameIsLump = false; skill.MustConfirm = false; skill.Shortcut = 0; skill.TextColor = ""; sc.MustGetString(); skill.Name = sc.String; ParseOpenBrace(); while (sc.GetString ()) { if (sc.Compare ("ammofactor")) { ParseAssign(); sc.MustGetFloat (); skill.AmmoFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("doubleammofactor")) { ParseAssign(); sc.MustGetFloat (); skill.DoubleAmmoFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("dropammofactor")) { ParseAssign(); sc.MustGetFloat (); skill.DropAmmoFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("damagefactor")) { ParseAssign(); sc.MustGetFloat (); skill.DamageFactor = FLOAT2FIXED(sc.Float); } else if (sc.Compare ("fastmonsters")) { skill.FastMonsters = true; } else if (sc.Compare ("disablecheats")) { skill.DisableCheats = true; } else if (sc.Compare ("easybossbrain")) { skill.EasyBossBrain = true; } else if (sc.Compare("autousehealth")) { skill.AutoUseHealth = true; } else if (sc.Compare("respawntime")) { ParseAssign(); sc.MustGetFloat (); skill.RespawnCounter = int(sc.Float*TICRATE); } else if (sc.Compare("respawnlimit")) { ParseAssign(); sc.MustGetNumber (); skill.RespawnLimit = sc.Number; } else if (sc.Compare("Aggressiveness")) { ParseAssign(); sc.MustGetFloat (); skill.Aggressiveness = FRACUNIT - FLOAT2FIXED(clamp(sc.Float, 0.,1.)); } else if (sc.Compare("SpawnFilter")) { ParseAssign(); if (sc.CheckNumber()) { if (sc.Number > 0) skill.SpawnFilter |= (1<<(sc.Number-1)); } else { sc.MustGetString (); if (sc.Compare("baby")) skill.SpawnFilter |= 1; else if (sc.Compare("easy")) skill.SpawnFilter |= 2; else if (sc.Compare("normal")) skill.SpawnFilter |= 4; else if (sc.Compare("hard")) skill.SpawnFilter |= 8; else if (sc.Compare("nightmare")) skill.SpawnFilter |= 16; } } else if (sc.Compare("ACSReturn")) { ParseAssign(); sc.MustGetNumber (); skill.ACSReturn = sc.Number; } else if (sc.Compare("Name")) { ParseAssign(); sc.MustGetString (); skill.MenuName = sc.String; skill.MenuNameIsLump = false; } else if (sc.Compare("PlayerClassName")) { ParseAssign(); sc.MustGetString (); FName pc = sc.String; ParseComma(); sc.MustGetString (); skill.MenuNamesForPlayerClass[pc]=sc.String; } else if (sc.Compare("PicName")) { ParseAssign(); sc.MustGetString (); skill.MenuName = sc.String; skill.MenuNameIsLump = true; } else if (sc.Compare("MustConfirm")) { skill.MustConfirm = true; if (format_type == FMT_New) { if (CheckAssign()) { sc.MustGetString(); skill.MustConfirmText = sc.String; } } else { if (sc.CheckToken(TK_StringConst)) { skill.MustConfirmText = sc.String; } } } else if (sc.Compare("Key")) { ParseAssign(); sc.MustGetString(); skill.Shortcut = tolower(sc.String[0]); } else if (sc.Compare("TextColor")) { ParseAssign(); sc.MustGetString(); skill.TextColor.Format("[%s]", sc.String); } else if (!ParseCloseBrace()) { // Unknown sc.ScriptMessage("Unknown property '%s' found in skill definition\n", sc.String); SkipToNext(); } else { break; } } CheckEndOfFile("skill"); for(unsigned int i = 0; i < AllSkills.Size(); i++) { if (AllSkills[i].Name == skill.Name) { AllSkills[i] = skill; return; } } AllSkills.Push(skill); }
void FMapInfoParser::ParseDoomEdNums() { TMap<int, bool> defined; int error = 0; MapinfoEdMapItem editem; editem.filename = sc.ScriptName; ParseOpenBrace(); while (true) { if (sc.CheckString("}")) return; else if (sc.CheckNumber()) { int ednum = sc.Number; sc.MustGetStringName("="); sc.MustGetString(); bool *def = defined.CheckKey(ednum); if (def != NULL) { sc.ScriptMessage("Editor Number %d defined more than once", ednum); error++; } defined[ednum] = true; if (sc.String[0] == '$') { // add special stuff like playerstarts and sound sequence overrides here, too. editem.classname = NAME_None; editem.special = sc.MustMatchString(SpecialMapthingNames) + 1; // todo: assign proper constants } else { editem.classname = sc.String; editem.special = -1; } memset(editem.args, 0, sizeof(editem.args)); editem.argsdefined = 0; editem.noskillflags = false; int minargs = 0; int maxargs = 5; FString specialname; if (sc.CheckString(",")) { if (sc.CheckString("noskillflags")) { editem.noskillflags = true; if (!sc.CheckString(",")) goto noargs; } editem.argsdefined = 5; // mark args as used - if this is done we need to prevent assignment of map args in P_SpawnMapThing. if (editem.special < 0) editem.special = 0; if (!sc.CheckNumber()) { sc.MustGetString(); specialname = sc.String; // save for later error reporting. editem.special = P_FindLineSpecial(sc.String, &minargs, &maxargs); if (editem.special == 0 || minargs == -1) { sc.ScriptMessage("Invalid special %s for Editor Number %d", sc.String, ednum); error++; minargs = 0; maxargs = 5; } if (!sc.CheckString(",")) { // special case: Special without arguments if (minargs != 0) { sc.ScriptMessage("Incorrect number of args for special %s, min = %d, max = %d, found = 0", specialname.GetChars(), minargs, maxargs); error++; } DoomEdFromMapinfo.Insert(ednum, editem); continue; } sc.MustGetNumber(); } int i = 0; while (i < 5) { editem.args[i] = sc.Number; i++; if (!sc.CheckString(",")) break; // special check for the ambient sounds which combine the arg being set here with the ones on the mapthing. if (sc.CheckString("+")) { editem.argsdefined = i; break; } sc.MustGetNumber(); } if (specialname.IsNotEmpty() && (i < minargs || i > maxargs)) { sc.ScriptMessage("Incorrect number of args for special %s, min = %d, max = %d, found = %d", specialname.GetChars(), minargs, maxargs, i); error++; } } noargs: DoomEdFromMapinfo.Insert(ednum, editem); } else { sc.ScriptError("Number expected"); } } if (error > 0) { sc.ScriptError("%d errors encountered in DoomEdNum definition", error); } }