diff --git a/src/config_rules.c b/src/config_rules.c index 9426ac8c08..246ea55908 100644 --- a/src/config_rules.c +++ b/src/config_rules.c @@ -41,50 +41,6 @@ extern "C" { /******************************************************************************/ const char keeper_rules_file[]="rules.cfg"; -const struct NamedCommand rules_game_commands[] = { - {"GOLDPERGOLDBLOCK", 1}, - {"POTOFGOLDHOLDS", 2}, - {"CHESTGOLDHOLD", 3}, - {"GOLDPILEVALUE", 4}, - {"GOLDPILEMAXIMUM", 5}, - {"GOLDPERHOARD", 6}, - {"FOODLIFEOUTOFHATCHERY", 7}, - {"DOUBLECLICKSPEED", 8}, - {"DOOROPENFOR", 9}, - {"BOULDERREDUCEHEALTHSLAP", 10}, - {"BOULDERREDUCEHEALTHWALL", 11}, - {"BOULDERREDUCEHEALTHROOM", 12}, - {"TILESTRENGTH", 13}, - {"GOLDTILESTRENGTH", 14}, - {"MINIMUMGOLD", 15}, - {"MAXGOLDLOOKUP", 16}, - {"MINGOLDTORECORD", 17}, - {"PAYDAYGAP", 18}, - {"PAYDAYSPEED", 19}, - {"SLABCOLLAPSETIME", 20}, - {"DUNGEONHEARTHEALTH", 21}, - {"DUNGEONHEARTHEALTIME", 22}, - {"DUNGEONHEARTHEALHEALTH", 23}, - {"HERODOORWAITTIME", 24}, - {"PRESERVECLASSICBUGS", 25}, - {"DEATHMATCHSTATUEREAPPERTIME",26}, - {"DEATHMATCHOBJECTREAPPERTIME",27}, - {"GEMEFFECTIVENESS", 28}, - {"ROOMSELLGOLDBACKPERCENT", 29}, - {"DOORSELLVALUEPERCENT", 30}, - {"TRAPSELLVALUEPERCENT", 31}, - {"PLACETRAPSONSUBTILES", 32}, - {"BAGGOLDHOLD", 33}, - {"ALLIESSHAREVISION", 34}, - {"ALLIESSHAREDROP", 35}, - {"ALLIESSHARECTA", 36}, - {"MAXTHINGSINHAND", 37}, - {"TORTUREPAYDAY", 38}, - {"TORTURETRAININGCOST", 39}, - {"TORTURESCAVENGINGCOST", 40}, - {NULL, 0}, - }; - const struct NamedCommand rules_game_classicbugs_commands[] = { {"RESURRECT_FOREVER", 1}, {"OVERFLOW_8BIT", 2}, @@ -103,6 +59,46 @@ const struct NamedCommand rules_game_classicbugs_commands[] = { {NULL, 0}, }; +const struct NamedField rules_game_named_fields[] = { + //name //field //field type //min //max + {"GOLDPERGOLDBLOCK", &game.conf.rules.game.gold_per_gold_block, var_type(game.conf.rules.game.gold_per_gold_block ),LONG_MIN,LONG_MAX}, + {"POTOFGOLDHOLDS", &game.conf.rules.game.pot_of_gold_holds, var_type(game.conf.rules.game.pot_of_gold_holds ),LONG_MIN,LONG_MAX}, + {"CHESTGOLDHOLD", &game.conf.rules.game.chest_gold_hold, var_type(game.conf.rules.game.chest_gold_hold ),LONG_MIN,LONG_MAX}, + {"GOLDPILEVALUE", &game.conf.rules.game.gold_pile_value, var_type(game.conf.rules.game.gold_pile_value ),LONG_MIN,LONG_MAX}, + {"GOLDPILEMAXIMUM", &game.conf.rules.game.gold_pile_maximum, var_type(game.conf.rules.game.gold_pile_maximum ),LONG_MIN,LONG_MAX}, + {"GOLDPERHOARD", &game.conf.rules.game.gold_per_hoard, var_type(game.conf.rules.game.gold_per_hoard ),LONG_MIN,LONG_MAX}, + {"FOODLIFEOUTOFHATCHERY", &game.conf.rules.game.food_life_out_of_hatchery, var_type(game.conf.rules.game.food_life_out_of_hatchery ), 0,USHRT_MAX}, + {"BOULDERREDUCEHEALTHSLAP", &game.conf.rules.game.boulder_reduce_health_wall, var_type(game.conf.rules.game.boulder_reduce_health_wall),LONG_MIN,LONG_MAX}, + {"BOULDERREDUCEHEALTHWALL", &game.conf.rules.game.boulder_reduce_health_slap, var_type(game.conf.rules.game.boulder_reduce_health_slap),LONG_MIN,LONG_MAX}, + {"BOULDERREDUCEHEALTHROOM", &game.conf.rules.game.boulder_reduce_health_room, var_type(game.conf.rules.game.boulder_reduce_health_room),LONG_MIN,LONG_MAX}, + {"PAYDAYGAP", &game.conf.rules.game.pay_day_gap, var_type(game.conf.rules.game.pay_day_gap ),LONG_MIN,LONG_MAX}, + {"PAYDAYSPEED", &game.conf.rules.game.pay_day_speed, var_type(game.conf.rules.game.pay_day_speed ), 0,ULONG_MAX}, + {"DUNGEONHEARTHEALTIME", &game.conf.rules.game.dungeon_heart_heal_time, var_type(game.conf.rules.game.dungeon_heart_heal_time ), 0,ULONG_MAX}, + {"DUNGEONHEARTHEALHEALTH", &game.conf.rules.game.dungeon_heart_heal_health, var_type(game.conf.rules.game.dungeon_heart_heal_health ),LONG_MIN,LONG_MAX}, + {"HERODOORWAITTIME", &game.conf.rules.game.hero_door_wait_time, var_type(game.conf.rules.game.hero_door_wait_time ), 0,ULONG_MAX}, + {"GEMEFFECTIVENESS", &game.conf.rules.game.gem_effectiveness, var_type(game.conf.rules.game.gem_effectiveness ), 0,ULONG_MAX}, + {"ROOMSELLGOLDBACKPERCENT", &game.conf.rules.game.room_sale_percent, var_type(game.conf.rules.game.room_sale_percent ), 0,LONG_MAX}, + {"DOORSELLVALUEPERCENT", &game.conf.rules.game.door_sale_percent, var_type(game.conf.rules.game.door_sale_percent ), 0,LONG_MAX}, + {"TRAPSELLVALUEPERCENT", &game.conf.rules.game.trap_sale_percent, var_type(game.conf.rules.game.trap_sale_percent ), 0,LONG_MAX}, + {"PLACETRAPSONSUBTILES", &game.conf.rules.game.place_traps_on_subtiles, var_type(game.conf.rules.game.place_traps_on_subtiles ), 0, 1}, + {"BAGGOLDHOLD", &game.conf.rules.game.bag_gold_hold, var_type(game.conf.rules.game.bag_gold_hold ),LONG_MIN,LONG_MAX}, + {"ALLIESSHAREVISION", &game.conf.rules.game.allies_share_vision, var_type(game.conf.rules.game.allies_share_vision ), 0, 1}, + {"ALLIESSHAREDROP", &game.conf.rules.game.allies_share_drop, var_type(game.conf.rules.game.allies_share_drop ), 0, 1}, + {"ALLIESSHARECTA", &game.conf.rules.game.allies_share_cta, var_type(game.conf.rules.game.allies_share_cta ), 0, 1}, + {"MAXTHINGSINHAND", &game.conf.rules.game.max_things_in_hand, var_type(game.conf.rules.game.max_things_in_hand ), 0,MAX_THINGS_IN_HAND}, + {"TORTUREPAYDAY", &game.conf.rules.game.torture_payday, var_type(game.conf.rules.game.torture_payday ),SHRT_MIN,SHRT_MAX}, + {"TORTURETRAININGCOST", &game.conf.rules.game.torture_training_cost, var_type(game.conf.rules.game.torture_training_cost ),SHRT_MIN,SHRT_MAX}, + {"TORTURESCAVENGINGCOST", &game.conf.rules.game.torture_scavenging_cost, var_type(game.conf.rules.game.torture_scavenging_cost ),SHRT_MIN,SHRT_MAX}, + {NULL, NULL,0,0,0 }, +}; + +//special cases rules_game +const struct NamedCommand rules_game_commands[] = { + {"PRESERVECLASSICBUGS", 1}, + {NULL, 0}, +}; + + const struct NamedCommand rules_computer_commands[] = { {"AUTODIGLIMIT", 1}, {"WAITFORROOMTIME", 2}, @@ -329,488 +325,114 @@ TbBool parse_rules_game_blocks(char *buf, long len, const char *config_textname, return false; } #define COMMAND_TEXT(cmd_num) get_conf_parameter_text(rules_game_commands,cmd_num) - while (pos 0) - { - k = atoi(word_buf); - game.conf.rules.game.gold_per_gold_block = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 2: // POTOFGOLDHOLDS - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.pot_of_gold_holds = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 3: // CHESTGOLDHOLD - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.chest_gold_hold = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 4: // GOLDPILEVALUE - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.gold_pile_value = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 5: // GOLDPILEMAXIMUM - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.gold_pile_maximum = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 6: // GOLDPERHOARD - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.gold_per_hoard = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 7: // FOODLIFEOUTOFHATCHERY - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.food_life_out_of_hatchery = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 8: // DOUBLECLICKSPEED - //Unused - break; - case 9: // DOOROPENFOR - //Unused - break; - case 10: // BOULDERREDUCEHEALTHSLAP - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.boulder_reduce_health_slap = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 11: // BOULDERREDUCEHEALTHWALL - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.boulder_reduce_health_wall = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 12: // BOULDERREDUCEHEALTHROOM - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.boulder_reduce_health_room = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 13: // TILESTRENGTH - case 14: // GOLDTILESTRENGTH - case 15: // MINIMUMGOLD - case 16: // MAXGOLDLOOKUP - case 17: // MINGOLDTORECORD - //unused - break; - case 18: // PAYDAYGAP - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.pay_day_gap = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 19: // PAYDAYSPEED - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.pay_day_speed = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 20: // SLABCOLLAPSETIME - case 21: // DUNGEONHEARTHEALTH - //Unused - break; - case 22: // DUNGEONHEARTHEALTIME - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.dungeon_heart_heal_time = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 23: // DUNGEONHEARTHEALHEALTH - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.dungeon_heart_heal_health = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 24: // HERODOORWAITTIME - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.hero_door_wait_time = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 25: // PRESERVECLASSICBUGS - game.conf.rules.game.classic_bugs_flags = ClscBug_None; - while (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = get_id(rules_game_classicbugs_commands, word_buf); - switch (k) - { - case 1: // RESURRECT_FOREVER - game.conf.rules.game.classic_bugs_flags |= ClscBug_ResurrectForever; - n++; - break; - case 2: // OVERFLOW_8BIT - game.conf.rules.game.classic_bugs_flags |= ClscBug_Overflow8bitVal; - n++; - break; - case 3: // CLAIM_ROOM_ALL_THINGS - game.conf.rules.game.classic_bugs_flags |= ClscBug_ClaimRoomAllThings; - n++; - break; - case 4: // RESURRECT_REMOVED - game.conf.rules.game.classic_bugs_flags |= ClscBug_ResurrectRemoved; - n++; - break; - case 5: // NO_HAND_PURGE_ON_DEFEAT - game.conf.rules.game.classic_bugs_flags |= ClscBug_NoHandPurgeOnDefeat; - n++; - break; - case 6: // MUST_OBEY_KEEPS_NOT_DO_JOBS - game.conf.rules.game.classic_bugs_flags |= ClscBug_MustObeyKeepsNotDoJobs; - n++; - break; - case 7: // BREAK_NEUTRAL_WALLS - game.conf.rules.game.classic_bugs_flags |= ClscBug_BreakNeutralWalls; - n++; - break; - case 8: // ALWAYS_TUNNEL_TO_RED - game.conf.rules.game.classic_bugs_flags |= ClscBug_AlwaysTunnelToRed; - n++; - break; - case 9: // FULLY_HAPPY_WITH_GOLD - game.conf.rules.game.classic_bugs_flags |= ClscBug_FullyHappyWithGold; - n++; - break; - case 10: // FAINTED_IMMUNE_TO_BOULDER - game.conf.rules.game.classic_bugs_flags |= ClscBug_FaintedImmuneToBoulder; - n++; - break; - case 11: // REBIRTH_KEEPS_SPELLS - game.conf.rules.game.classic_bugs_flags |= ClscBug_RebirthKeepsSpells; - n++; - break; - case 12: // STUN_FRIENDLY_UNITS - game.conf.rules.game.classic_bugs_flags |= ClscBug_FriendlyFaint; - n++; - break; - case 13: // PASSIVE_NEUTRALS - game.conf.rules.game.classic_bugs_flags |= ClscBug_PassiveNeutrals; - n++; - break; - case 14: // NEUTRAL_TORTURE_CONVERTS - game.conf.rules.game.classic_bugs_flags |= ClscBug_NeutralTortureConverts; - n++; - break; - default: - CONFWRNLOG("Incorrect value of \"%s\" parameter \"%s\" in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),word_buf,block_buf,config_textname); + skip_conf_to_next_line(buf,&pos,len); + continue; + } + else if( assignresult == ccr_unrecognised) + { + // Finding command number in this line + int cmd_num = recognize_conf_command(buf, &pos, len, rules_game_commands); + // Now store the config item in correct place + if (cmd_num == -3) break; // if next block starts + int n = 0; + char word_buf[COMMAND_WORD_LEN]; + switch (cmd_num) + { + case 1: // PRESERVECLASSICBUGS + game.conf.rules.game.classic_bugs_flags = ClscBug_None; + while (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + k = get_id(rules_game_classicbugs_commands, word_buf); + switch (k) + { + case 1: // RESURRECT_FOREVER + game.conf.rules.game.classic_bugs_flags |= ClscBug_ResurrectForever; + n++; + break; + case 2: // OVERFLOW_8BIT + game.conf.rules.game.classic_bugs_flags |= ClscBug_Overflow8bitVal; + n++; + break; + case 3: // CLAIM_ROOM_ALL_THINGS + game.conf.rules.game.classic_bugs_flags |= ClscBug_ClaimRoomAllThings; + n++; + break; + case 4: // RESURRECT_REMOVED + game.conf.rules.game.classic_bugs_flags |= ClscBug_ResurrectRemoved; + n++; + break; + case 5: // NO_HAND_PURGE_ON_DEFEAT + game.conf.rules.game.classic_bugs_flags |= ClscBug_NoHandPurgeOnDefeat; + n++; + break; + case 6: // MUST_OBEY_KEEPS_NOT_DO_JOBS + game.conf.rules.game.classic_bugs_flags |= ClscBug_MustObeyKeepsNotDoJobs; + n++; + break; + case 7: // BREAK_NEUTRAL_WALLS + game.conf.rules.game.classic_bugs_flags |= ClscBug_BreakNeutralWalls; + n++; + break; + case 8: // ALWAYS_TUNNEL_TO_RED + game.conf.rules.game.classic_bugs_flags |= ClscBug_AlwaysTunnelToRed; + n++; + break; + case 9: // FULLY_HAPPY_WITH_GOLD + game.conf.rules.game.classic_bugs_flags |= ClscBug_FullyHappyWithGold; + n++; + break; + case 10: // FAINTED_IMMUNE_TO_BOULDER + game.conf.rules.game.classic_bugs_flags |= ClscBug_FaintedImmuneToBoulder; + n++; + break; + case 11: // REBIRTH_KEEPS_SPELLS + game.conf.rules.game.classic_bugs_flags |= ClscBug_RebirthKeepsSpells; + n++; + break; + case 12: // STUN_FRIENDLY_UNITS + game.conf.rules.game.classic_bugs_flags |= ClscBug_FriendlyFaint; + n++; + break; + case 13: // PASSIVE_NEUTRALS + game.conf.rules.game.classic_bugs_flags |= ClscBug_PassiveNeutrals; + n++; + break; + case 14: // NEUTRAL_TORTURE_CONVERTS + game.conf.rules.game.classic_bugs_flags |= ClscBug_NeutralTortureConverts; + n++; + break; + default: + CONFWRNLOG("Incorrect value of \"%s\" parameter \"%s\" in [%s] block of %s file.", + COMMAND_TEXT(cmd_num),word_buf,block_buf,config_textname); + break; + } + } + break; + case 0: // comment + break; + case -1: // end of buffer + break; + default: + CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.", + cmd_num,block_buf,config_textname); break; - } - } - break; - case 26: // DEATHMATCHSTATUEREAPPERTIME - case 27: // DEATHMATCHOBJECTREAPPERTIME - //Unused - break; - case 28: // GEMEFFECTIVENESS - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.gem_effectiveness = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 29: // ROOMSELLGOLDBACKPERCENT - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.room_sale_percent = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 30: // DOORSELLVALUEPERCENT - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.door_sale_percent = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 31: // TRAPSELLVALUEPERCENT - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.trap_sale_percent = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 32: // PLACETRAPSONSUBTILES - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.place_traps_on_subtiles = (TbBool)k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 33: // BAGGOLDHOLD - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.bag_gold_hold = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); } - break; - case 34: // ALLIESSHAREVISION - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.allies_share_vision = (TbBool)k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 35: // ALLIESSHAREDROP - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.allies_share_drop = (TbBool)k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 36: // ALLIESSHARECTA - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.allies_share_cta = (TbBool)k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 37: // MAXTHINGSINHAND - if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - if (k > MAX_THINGS_IN_HAND) - { - CONFWRNLOG("Value of \"%s\" parameter in [%s] block of %s file is out of range. Max %d.", - COMMAND_TEXT(cmd_num),block_buf,config_textname, MAX_THINGS_IN_HAND); - k = MAX_THINGS_IN_HAND; - } - game.conf.rules.game.max_things_in_hand = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num),block_buf,config_textname); - } - break; - case 38: // TORTUREPAYDAY - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.torture_payday = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 39: // TORTURETRAININGCOST - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.torture_training_cost = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 40: // TORTURESCAVENGINGCOST - if (get_conf_parameter_single(buf, &pos, len, word_buf, sizeof(word_buf)) > 0) - { - k = atoi(word_buf); - game.conf.rules.game.torture_scavenging_cost = k; - n++; - } - if (n < 1) - { - CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.", - COMMAND_TEXT(cmd_num), block_buf, config_textname); - } - break; - case 0: // comment - break; - case -1: // end of buffer - break; - default: - CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.", - cmd_num,block_buf,config_textname); + skip_conf_to_next_line(buf,&pos,len); + continue; + } + else if( assignresult == ccr_endOfBlock || assignresult == ccr_error || assignresult == ccr_endOfFile) + { break; } - skip_conf_to_next_line(buf,&pos,len); - } + } #undef COMMAND_TEXT return true; } @@ -1142,7 +764,6 @@ TbBool parse_rules_magic_blocks(char *buf, long len, const char *config_textname break; } } - return true; } diff --git a/src/config_rules.h b/src/config_rules.h index b242b5735e..5ac59b7bf2 100644 --- a/src/config_rules.h +++ b/src/config_rules.h @@ -202,6 +202,7 @@ extern const struct NamedCommand sacrifice_unique_desc[]; extern const struct NamedField rules_magic_named_fields[]; extern const struct NamedField rules_rooms_named_fields[]; +extern const struct NamedField rules_game_named_fields[]; /******************************************************************************/ #ifdef __cplusplus diff --git a/src/lvl_script_commands.c b/src/lvl_script_commands.c index 7a516d5df4..e908f37bfb 100644 --- a/src/lvl_script_commands.c +++ b/src/lvl_script_commands.c @@ -266,23 +266,24 @@ const struct NamedCommand room_config_desc[] = { }; -static const struct NamedField* ruleblocks[] = {rules_rooms_named_fields,rules_magic_named_fields}; + +static const struct NamedField rules_script_only_named_fields[] = { + //name //field //field type //min //max + {"PayDayProgress",&game.pay_day_progress,var_type(game.pay_day_progress),0,LONG_MAX}, + {NULL, NULL,0,0,0 }, +}; + +static const struct NamedField* ruleblocks[] = {rules_game_named_fields,rules_rooms_named_fields,rules_magic_named_fields,rules_script_only_named_fields}; + static const struct NamedCommand game_rule_desc[] = { + {"PreserveClassicBugs", 1}, + {"AlliesShareVision", 2}, +//ones below still need to be moved to NamedField {"StunEvilEnemyChance", 7}, {"StunGoodEnemyChance", 8}, {"BodyRemainsFor", 9}, {"FightHateKillValue", 10}, - {"PreserveClassicBugs", 11}, - {"DungeonHeartHealHealth", 12}, {"ImpWorkExperience", 13}, - {"GemEffectiveness", 14}, - {"RoomSellGoldBackPercent", 15}, - {"DoorSellValuePercent", 16}, - {"TrapSellValuePercent", 17}, - {"PayDayGap", 18}, - {"PayDaySpeed", 19}, - {"PayDayProgress", 20}, - {"PlaceTrapsOnSubtiles", 21}, {"DiseaseHPTemplePercentage", 22}, {"DungeonHeartHealth", 23}, {"HungerHealthLoss", 24}, @@ -290,13 +291,6 @@ static const struct NamedCommand game_rule_desc[] = { {"FoodHealthGain", 26}, {"TortureHealthLoss", 27}, {"GameTurnsPerTortureHealthLoss", 28}, - {"AlliesShareVision", 29}, - {"AlliesShareDrop", 30}, - {"AlliesShareCta", 31}, - {"MaxThingsInHand", 33}, - {"TorturePayday", 35}, - {"TortureTrainingCost", 36}, - {"TortureScavengingCost", 37}, {NULL, 0}, }; @@ -4850,103 +4844,86 @@ static void set_game_rule_check(const struct ScriptLine* scline) { ALLOCATE_SCRIPT_VALUE(scline->command, 0); - long rulegroup = -1; - long ruledesc = -1; + long rulegroup = 0; long ruleval = scline->np[1]; - for (size_t i = 0; i < sizeof(ruleblocks)/sizeof(ruleblocks[0]); i++) + long ruledesc = get_id(game_rule_desc, scline->tp[0]); + if(ruledesc != -1) { - ruledesc = get_named_field_id(ruleblocks[i], scline->tp[0]); - if (ruledesc != -1) + rulegroup = -1; + switch (ruledesc) { - rulegroup = i; - if (ruleval < (ruleblocks[i]+ruledesc)->min) - { - ruleval = (ruleblocks[i]+ruledesc)->min; - SCRPTERRLOG("Game Rule '%s' value %d is smaller then minimum of %d", scline->tp[0], ruleval,(ruleblocks[i]+ruledesc)->min); - } - else if(ruleval > (ruleblocks[i]+ruledesc)->max) - { - ruleval = (ruleblocks[i]+ruledesc)->max; - SCRPTERRLOG("Game Rule '%s' value %d is bigger then maximum of %d", scline->tp[0], ruleval,(ruleblocks[i]+ruledesc)->max); - } - break; + case 1: //PreserveClassicBugs + //this one is a special case because in the cfg it's not done trough number + if ((ruleval < 0) || (ruleval >= ClscBug_ListEnd)) + { + SCRPTERRLOG("Game Rule '%s' value %d out of range", scline->tp[0], ruleval); + DEALLOCATE_SCRIPT_VALUE + return; + } + break; + + + case 7: //StunEvilEnemyChance + case 8: //StunGoodEnemyChance + case 22: //DiseaseHPTemplePercentage + if ((ruleval < 0) || (ruleval > 100)) + { + SCRPTERRLOG("Game Rule '%s' value %d out of range", scline->tp[0], ruleval); + DEALLOCATE_SCRIPT_VALUE + return; + } + break; + case 2: //AlliesShareVision + case 6: //FoodGenerationSpeed + case 9: //BodyRemainsFor + case 13: //ImpWorkExperience + case 25: //GameTurnsPerHungerHealthLoss + case 28: //GameTurnsPerTortureHealthLoss + if (ruleval < 0) + { + SCRPTERRLOG("Game Rule '%s' value %d out of range", scline->tp[0], ruleval); + DEALLOCATE_SCRIPT_VALUE + return; + } + break; + case 23: //DungeonHeartHealth + default: + WARNMSG("Unsupported Game Rule, command %d.", ruledesc); + DEALLOCATE_SCRIPT_VALUE + return; } } - - - if(ruledesc == -1) + else { - ruledesc = get_id(game_rule_desc, scline->tp[0]); - const char *rulename = get_conf_parameter_text(game_rule_desc,ruledesc); - if (ruledesc == -1) + for (size_t i = 0; i < sizeof(ruleblocks)/sizeof(ruleblocks[0]); i++) { - SCRPTERRLOG("Unknown Game Rule '%s'.", scline->tp[0]); - DEALLOCATE_SCRIPT_VALUE - return; - } - switch (ruledesc) - { - case 11: //PreserveClassicBugs - if ((ruleval < 0) || (ruleval >= ClscBug_ListEnd)) + ruledesc = get_named_field_id(ruleblocks[i], scline->tp[0]); + if (ruledesc != -1) { - SCRPTERRLOG("Game Rule '%s' value %d out of range", rulename, ruleval); - DEALLOCATE_SCRIPT_VALUE - return; - } - break; - case 33: //MaxThingsInHand - if ((ruleval < 0) || (ruleval > MAX_THINGS_IN_HAND)) // No more than 64 things in hand, defined with MAX_THINGS_IN_HAND. - { - SCRPTERRLOG("Game Rule '%s' value %d out of range, max %d.", rulename, ruleval, MAX_THINGS_IN_HAND); - DEALLOCATE_SCRIPT_VALUE - return; - } - break; - case 7: //StunEvilEnemyChance - case 8: //StunGoodEnemyChance - case 22: //DiseaseHPTemplePercentage - if ((ruleval < 0) || (ruleval > 100)) - { - SCRPTERRLOG("Game Rule '%s' value %d out of range", rulename, ruleval); - DEALLOCATE_SCRIPT_VALUE - return; - } - break; - case 6: //FoodGenerationSpeed - case 9: //BodyRemainsFor - case 13: //ImpWorkExperience - case 14: //GemEffectiveness - case 15: //RoomSellGoldBackPercent - case 16: //DoorSellValuePercent - case 17: //TrapSellValuePercent - case 18: //PayDayGap - case 19: //PayDaySpeed - case 20: //PayDayProgress - case 21: //PlaceTrapsOnSubtiles - case 25: //GameTurnsPerHungerHealthLoss - case 28: //GameTurnsPerTortureHealthLoss - case 29: //AlliesShareVision - case 30: //AlliesShareDrop - case 31: //AlliesShareCta - case 35: //TorturePayday - case 36: //TortureTrainingCost - case 37: //TortureScavengingCost - if (ruleval < 0) - { - SCRPTERRLOG("Game Rule '%s' value %d out of range", rulename, ruleval); - DEALLOCATE_SCRIPT_VALUE - return; + rulegroup = i; + if (ruleval < (ruleblocks[i]+ruledesc)->min) + { + ruleval = (ruleblocks[i]+ruledesc)->min; + SCRPTERRLOG("Game Rule '%s' value %d is smaller then minimum of %d", scline->tp[0], ruleval,(ruleblocks[i]+ruledesc)->min); + } + else if(ruleval > (ruleblocks[i]+ruledesc)->max) + { + ruleval = (ruleblocks[i]+ruledesc)->max; + SCRPTERRLOG("Game Rule '%s' value %d is bigger then maximum of %d", scline->tp[0], ruleval,(ruleblocks[i]+ruledesc)->max); + } + break; } - break; - case 23: //DungeonHeartHealth - default: - WARNMSG("Unsupported Game Rule, command %d.", ruledesc); - DEALLOCATE_SCRIPT_VALUE - return; } } + if (ruledesc == -1) + { + SCRPTERRLOG("Unknown Game Rule '%s'.", scline->tp[0]); + DEALLOCATE_SCRIPT_VALUE + return; + } + value->shorts[0] = rulegroup; value->shorts[1] = ruledesc; value->arg1 = ruleval; @@ -4962,6 +4939,7 @@ static void set_game_rule_process(struct ScriptContext* context) if(rulegroup != -1) { + SCRIPTDBG(7,"Changing Game Rule '%s' to %d", (ruleblocks[rulegroup]+ruledesc)->name, rulevalue); assign_named_field_value((ruleblocks[rulegroup]+ruledesc),rulevalue); return; } @@ -4972,6 +4950,19 @@ static void set_game_rule_process(struct ScriptContext* context) #endif switch (ruledesc) { + case 1: //PreserveClassicBugs + //this one is a special case because in the cfg it's not done trough number + SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.classic_bugs_flags, rulevalue); + game.conf.rules.game.classic_bugs_flags = rulevalue; + break; + case 2: //AlliesShareVision + //this one is a special case because it updates minimap + SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.allies_share_vision, rulevalue); + game.conf.rules.game.allies_share_vision = (TbBool)rulevalue; + panel_map_update(0, 0, gameadd.map_subtiles_x + 1, gameadd.map_subtiles_y + 1); + break; + +//ones below here still need to be moved to NamedField case 7: //StunEvilEnemyChance SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.creature.stun_enemy_chance_evil, rulevalue); game.conf.rules.creature.stun_enemy_chance_evil = rulevalue; @@ -4988,50 +4979,10 @@ static void set_game_rule_process(struct ScriptContext* context) SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.creature.fight_hate_kill_value, rulevalue); game.conf.rules.creature.fight_hate_kill_value = rulevalue; break; - case 11: //PreserveClassicBugs - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.classic_bugs_flags, rulevalue); - game.conf.rules.game.classic_bugs_flags = rulevalue; - break; - case 12: //DungeonHeartHealHealth - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.dungeon_heart_heal_health, rulevalue); - game.conf.rules.game.dungeon_heart_heal_health = rulevalue; - break; case 13: //ImpWorkExperience SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.workers.digger_work_experience, rulevalue); game.conf.rules.workers.digger_work_experience = rulevalue; break; - case 14: //GemEffectiveness - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.gem_effectiveness, rulevalue); - game.conf.rules.game.gem_effectiveness = rulevalue; - break; - case 15: //RoomSellGoldBackPercent - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.room_sale_percent, rulevalue); - game.conf.rules.game.room_sale_percent = rulevalue; - break; - case 16: //DoorSellGoldBackPercent - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.door_sale_percent, rulevalue); - game.conf.rules.game.door_sale_percent = rulevalue; - break; - case 17: //TrapSellGoldBackPercent - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.trap_sale_percent, rulevalue); - game.conf.rules.game.trap_sale_percent = rulevalue; - break; - case 18: //PayDayGap - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.pay_day_gap, rulevalue); - game.conf.rules.game.pay_day_gap = rulevalue; - break; - case 19: //PayDaySpeed - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.pay_day_speed, rulevalue); - game.conf.rules.game.pay_day_speed = rulevalue; - break; - case 20: //PayDayProgress - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.pay_day_progress, rulevalue); - game.pay_day_progress = rulevalue; - break; - case 21: //PlaceTrapsOnSubtiles - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.place_traps_on_subtiles, rulevalue); - game.conf.rules.game.place_traps_on_subtiles = (TbBool)rulevalue; - break; case 22: //DiseaseHPTemplePercentage SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.computer.disease_to_temple_pct, rulevalue); game.conf.rules.computer.disease_to_temple_pct = rulevalue; @@ -5056,35 +5007,7 @@ static void set_game_rule_process(struct ScriptContext* context) SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.health.turns_per_torture_health_loss, rulevalue); game.conf.rules.health.turns_per_torture_health_loss = rulevalue; break; - case 29: //AlliesShareVision - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.allies_share_vision, rulevalue); - game.conf.rules.game.allies_share_vision = (TbBool)rulevalue; - panel_map_update(0, 0, gameadd.map_subtiles_x + 1, gameadd.map_subtiles_y + 1); - break; - case 30: //AlliesShareDrop - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.allies_share_drop, rulevalue); - game.conf.rules.game.allies_share_drop = (TbBool)rulevalue; - break; - case 31: //AlliesShareCta - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.allies_share_cta, rulevalue); - game.conf.rules.game.allies_share_cta = (TbBool)rulevalue; - break; - case 33: //MaxThingsInHand - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.max_things_in_hand, rulevalue); - game.conf.rules.game.max_things_in_hand = rulevalue; - break; - case 35: //TorturePayday - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.torture_payday, rulevalue); - game.conf.rules.game.torture_payday = rulevalue; - break; - case 36: //TortureTrainingCost - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.torture_training_cost, rulevalue); - game.conf.rules.game.torture_training_cost = rulevalue; - break; - case 37: //TortureScavengingCost - SCRIPTDBG(7,"Changing Game Rule '%s' from %d to %d", rulename, game.conf.rules.game.torture_scavenging_cost, rulevalue); - game.conf.rules.game.torture_scavenging_cost = rulevalue; - break; + default: WARNMSG("Unsupported Game Rule, command %d.", ruledesc); break;