flt_str2num_entries = array(); if(is_string($val)) { if(strlen($val) === 0) throw new Exception("Bad value, string empty, crc28 can't be generated"); //special case if(strpos($val, '@') !== 0) throw new Exception("@ expected"); $name = substr($val, 1) . '.conf.js'; $path = \taskman\config_real_path($config_globals->base_dirs, $name); if(\taskman\config_get_header($path, $proto_id, $alias)) { if($alias !== $val) throw new Exception("Config file header alias doesn't match: $alias vs $val"); $val = $proto_id; } else throw new Exception("Config file header is not valid: $path"); } if(!is_numeric($val)) throw new Exception("Bad value, not a number(" . serialize($val) . ")"); $config_extra->flt_str2num_entries[1*$val] = true; return 1*$val; } function validate_flt_str2num(\taskman\ConfigFetchResult $fetch_result, \taskman\ConfigCacheEntry $entry) { $config_extra = $entry->extras; if(!property_exists($config_extra, 'flt_str2num_entries')) return; foreach($config_extra->flt_str2num_entries as $conf_id => $_) { if($conf_id == 0) continue; $fetch_result->getById($conf_id); } } function flt_range($val, $name, $data, $args) { if(count($args) != 2) throw new Exception("Wrong usage of \"flt_range\". Use \"@flt_range:[0,1]\" where 0 - min, 1 - max"); if(!is_numeric($args[0]) || !is_numeric($args[1])) throw new Exception("Wrong usage of \"flt_range\". Use \"@flt_range:[0,1]\" where 0 - min, 1 - max"); if(is_numeric($val)) { if($val < $args[0] || $val > $args[1]) throw new Exception("Value ".$val.", not in range(" . $args[0] . "," . $args[1] . ")"); } return $val; } function flt_time($val, $name, $data, $args) { $str = ""; if(is_string($val)) { if(strlen($val) === 0) throw new Exception("Bad value, string empty, crc28 can't be generated"); $reg = "/^([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$/"; if(!preg_match($reg, $val, $matches)) throw new Exception("Bad value, pattern 00:00:00"); $h = intval($matches[1]); $m = intval($matches[2]); $s = intval($matches[3]); return $h * 3600 + $m * 60 + $s; } return 0; } function flt_class($val, $name, $data, $args) { global $GAME_ROOT; $config_extra = $GLOBALS['CONFIG_EXTRAS']; if(!property_exists($config_extra, 'flt_class_entries')) $config_extra->flt_class_entries = array(); $target_class = $args; if(is_array($target_class)) $target_class = $target_class[0]; if(!class_exists($target_class)) throw new Exception($val.". Target class \"".$target_class."\" is not valid"); $config_extra->flt_class_entries[$val] = $target_class; return $val; } function validate_flt_class(\taskman\ConfigFetchResult $fetch_result, \taskman\ConfigCacheEntry $entry) { $config_extra = $entry->extras; if(!property_exists($config_extra, 'flt_class_entries')) return; $config_globals = $GLOBALS['CONFIG_GLOBALS']; foreach($config_extra->flt_class_entries as $conf_ref => $target_class) { $conf_cache = null; if(is_string($conf_ref)) { if(empty($conf_ref)) continue; $conf_path = $conf_ref; if(strpos($conf_path, '@') === 0) $conf_path = substr($conf_path, 1) . '.conf.js'; $conf_path = \taskman\normalize_path(\taskman\config_real_path($config_globals->base_dirs, $conf_path)); $conf_cache = $fetch_result->getByPath($conf_path); } else if(is_int($conf_ref)) { if($conf_ref == 0) continue; $conf_cache = $fetch_result->getById($conf_ref); } else throw new Exception("Invalid config ref: '$conf_ref'"); if($conf_cache == null) throw new Exception("Config not found by ref: '$conf_ref'"); $conf_class = $conf_cache->class; if($conf_class != $target_class && !is_subclass_of($conf_class, $target_class)) throw new Exception("Config class is '$conf_class'. Must be '$target_class' or its child"); } }