optimisation  t             default     # c = a*b is performed in one operation rather than two, and can
                                        # cause older decompilers to fail.
optimisation  i             default     # if (!a) was traditionally compiled in two statements. This optimisation
                                        # does it in one, but can cause some decompilers to get confused.
optimisation  p             default     # In the original qcc, function parameters were specified as a vector
                                        # store even for floats. This fixes that.
optimisation  c             default     # This optimisation strips out the names of constants (but not strings)
                                        # from your progs, resulting in smaller files. It makes decompilers
                                        # leave out names or fabricate numerical ones.
optimisation  cs            default     # This optimisation strips out the names of string constants from
                                        # your progs. However, this can break addons, so don't use it in
                                        # those cases.
optimisation  d             default     # This will merge definitions of constants which are the same value.
                                        # Pay extra attention to assignment to constant warnings.
optimisation  s             default     # This will compact the string table that is stored in the progs.
                                        # It will be considerably smaller with this.
optimisation  l             default     # Strips out local names and definitions. Most decompiles will break
                                        # on this.
optimisation  n             default     # This strips out the names of functions which are never called.
                                        # Doesn't make much of an impact though.
optimisation  f             default     # This strips out the filenames of the progs. This can confuse the
                                        # really old decompilers, but is nothing to the more recent ones.
optimisation  u             default     # Removes the entries of unreferenced variables. Doesn't make a
                                        # difference in well maintained code.
optimisation  r             default     # Optimises the pr_globals count by overlapping temporaries. In
                                        # QC, every multiplication, division or operation in general produces
                                        # a temporary variable. This optimisation prevents excess, and in
                                        # the case of Hexen2's gamecode, reduces the count by 50k. This
                                        # is the most important optimisation, ever.
optimisation  a             default     # 5*6 actually emits an operation into the progs. This prevents
                                        # that happening, effectivly making the compiler see 30
optimisation  pf            default     # Strip out stuff wasted used in function calls and strings to the
                                        # precache_file builtin (which is actually a stub in quake).
optimisation  ro            default     # Functions ending in a return statement do not need a done statement
                                        # at the end of the function. This can confuse some decompilers,
                                        # making functions appear larger than they were.
optimisation  cj            default     # This optimisation plays an effect mostly with nested if/else statements,
                                        # instead of jumping to an unconditional jump statement, it'll jump
                                        # to the final destination instead. This will bewilder decompilers.
optimisation  sf            default     # Strips out the 'defs' of functions that were only ever called
                                        # directly. This does not affect saved games. This can affect FTE_MULTIPROGS.
optimisation  lo            default     # Store all locals in a single section of the pr_globals. Vastly
                                        # reducing it. This effectivly does the job of overlaptemps.
                                        # However, locals are no longer automatically initialised to 0 (and
                                        # never were in the case of recursion, but at least then its the
                                        # same type).
                                        # If locals appear uninitialised, fteqcc will disable this optimisation
                                        # for the affected functions, you can optionally get a warning about
                                        # these locals using: #pragma warning enable F302
optimisation  vc            default     # Where a function is called with just a vector, this causes the
                                        # function call to store three floats instead of one vector. This
                                        # can save a good number of pr_globals where those vectors contain
                                        # many duplicate coordinates but do not match entirly.
optimisation  cf            default     # Strip class field names. This will harm debugging and can result
                                        # in 'gibberish' names appearing in saved games. Has no effect on
                                        # engines other than FTEQW, which will not recognise these anyway.
keyword       asm           true        # Disables the 'asm' keyword. Use the writeasm flag to see an example
                                        # of the asm.
keyword       break         true        # Disables the 'break' keyword.
keyword       case          true        # Disables the 'case' keyword.
keyword       class         true        # Disables the 'class' keyword.
keyword       const         true        # Disables the 'const' keyword.
keyword       continue      true        # Disables the 'continue' keyword.
keyword       default       true        # Disables the 'default' keyword.
keyword       entity        true        # Disables the 'entity' keyword.
keyword       enum          true        # Disables the 'enum' keyword.
keyword       enumflags     true        # Disables the 'enumflags' keyword.
keyword       extern        true        # Disables the 'extern' keyword. Use only on functions inside addons.
keyword       float         true        # Disables the 'float' keyword. (Disables the float keyword without
                                        # 'local' preceeding it)
keyword       for           true        # Disables the 'for' keyword. Syntax: for(assignment; while; increment)
                                        # {codeblock;}
keyword       goto          true        # Disables the 'goto' keyword.
keyword       int           true        # Disables the 'int' keyword.
keyword       integer       true        # Disables the 'integer' keyword.
keyword       noref         true        # Disables the 'noref' keyword.
keyword       unused        false       # Disables the 'unused' keyword. 'unused' means that the variable
                                        # is unused, you're aware that its unused, and you'd rather not
                                        # know about all the warnings this results in.
keyword       used          false       # Disables the 'used' keyword. 'used' means that the variable is
                                        # used even if the qcc can't see how - thus preventing it from ever
                                        # being stripped.
keyword       static        true        # Disables the 'static' keyword. 'static' means that a variable
                                        # has altered scope. On globals, the variable is visible only to
                                        # the current .qc file. On locals, the variable's value does not
                                        # change between calls to the function. On class variables, specifies
                                        # that the field is a scoped global instead of a local. On class
                                        # functions, specifies that 'this' is expected to be invalid and
                                        # that the function will access any memembers via it.
keyword       nonstatic     true        # Disables the 'nonstatic' keyword. 'nonstatic' acts upon globals+functions,
                                        # reverting the defaultstatic pragma on a per-variable basis. For
                                        # use by people who prefer to keep their APIs explicit.
keyword       ignore        false       # Disables the 'ignore' keyword. 'ignore' is expected to typically
                                        # be hidden behind a 'csqconly' define, and in such a context can
                                        # be used to conditionally compile functions a little more gracefully.
                                        # The opposite of the 'used' keyword. These variables/functions/members
                                        # are ALWAYS stripped, and effectively ignored.
keyword       nosave        true        # Disables the 'nosave' keyword.
keyword       inline        true        # Disables the 'inline' keyword.
keyword       strip         true        # Disables the 'strip' keyword.
keyword       shared        true        # Disables the 'shared' keyword.
keyword       state         false       # Disables the 'state' keyword.
keyword       optional      true        # Disables the 'optional' keyword.
keyword       inout         false       # Disables the 'inout' keyword.
keyword       string        true        # Disables the 'string' keyword.
keyword       struct        true        # Disables the 'struct' keyword.
keyword       switch        true        # Disables the 'switch' keyword.
keyword       thinktime     false       # Disables the 'thinktime' keyword which is used in HexenC
keyword       until         false       # Disables the 'until' keyword which is used in HexenC
keyword       loop          false       # Disables the 'loop' keyword which is used in HexenC
keyword       typedef       true        # Disables the 'typedef' keyword.
keyword       union         true        # Disables the 'union' keyword.
keyword       var           true        # Disables the 'var' keyword.
keyword       vector        true        # Disables the 'vector' keyword.
keyword       wrap          true        # Disables the 'wrap' keyword.
keyword       weak          true        # Disables the 'weak' keyword.
flag          kce           true        # If you want keywords to NOT be disabled when they a variable by
                                        # the same name is defined, check here.
flag          parms         false       # if PARM0 PARM1 etc should be defined by the compiler. These are
                                        # useful if you make use of the asm keyword for function calls,
                                        # or you wish to create your own variable arguments. This is an
                                        # easy way to break decompilers.
flag          autoproto     false       # Causes compilation to take two passes instead of one. The first
                                        # pass, only the definitions are read. The second pass actually
                                        # compiles your code. This means you never have to remember to prototype
                                        # functions again.
flag          wasm          false       # Writes out a qc.asm which contains all your functions but in assembler.
                                        # This is a great way to look for bugs in fteqcc, but can also be
                                        # used to see exactly what your functions turn into, and thus how
                                        # to optimise statements better.
flag          annotate      false       # Annotate source code with assembler statements on compile (requires
                                        # gui).
flag          nullemptystr  false       # Empty string immediates will have the raw value 0 instead of 1.
flag          ifstring      false       # Causes if(string) to behave identically to if(string!=) This is
                                        # most useful with addons of course, but also has adverse effects
                                        # with FRIK_FILE's fgets, where it becomes impossible to determin
                                        # the end of the file. In such a case, you can still use asm {IF
                                        # string 2;RETURN} to detect eof and leave the function.
flag          iffloat       false       # Fixes certain floating point logic.
flag          ifvector      true        # Fixes conditional vector logic.
flag          vectorlogic   true        # Fixes conditional vector logic.
flag          brokenarray   false       # Treat references to arrays as references to the first index of
                                        # said array, to replicate an old fteqcc bug.
flag          rootconstructor false     # When enabled, the root constructor should be called first like
                                        # in c++.
flag          acc           false       # Reacc is a pascall like compiler. It was released before the Quake
                                        # source was released. This flag has a few effects. It sorts all
                                        # qc files in the current directory into alphabetical order to compile
                                        # them. It also allows Reacc global/field distinctions, as well
                                        # as allows ¦ as EOF. Whilst case insensitivity and lax type checking
                                        # are supported by reacc, they are seperate compiler flags in fteqcc.
flag          caseinsens    false       # Causes fteqcc to become case insensitive whilst compiling names.
                                        # It's generally not advised to use this as it compiles a little
                                        # more slowly and provides little benefit. However, it is required
                                        # for full reacc support.
flag          lax           false       # Disables many errors (generating warnings instead) when function
                                        # calls or operations refer to two normally incompatible types.
                                        # This is required for reacc support, and can also allow certain
                                        # (evil) mods to compile that were originally written for frikqcc.
flag          hashonly      false       # Allows use of only #constant for precompiler constants, allows
                                        # certain preqcc using mods to compile
flag          lo            false       # This changes the behaviour of your code. It generates additional
                                        # if operations to early-out in if statements. With this flag, the
                                        # line if (0 && somefunction()) will never call the function. It
                                        # can thus be considered an optimisation. However, due to the change
                                        # of behaviour, it is not considered so by fteqcc. Note that due
                                        # to inprecisions with floats, this flag can cause runaway loop
                                        # errors within the player walk and run functions (without iffloat
                                        # also enabled). This code is advised:
                                        # player_stand1:
                                        #     if (self.velocity_x || self.velocity_y)
                                        # player_run
                                        #     if (!(self.velocity_x || self.velocity_y))
flag          msvcstyle     false       # Generates warning and error messages in a format that msvc understands,
                                        # to facilitate ide integration.
flag          debugmacros   false       # Print out the contents of macros that are expanded. This can help
                                        # look inside macros that are expanded and is especially handy if
                                        # people are using preprocessor hacks.
flag          filetimes     false       # Recompiles the progs only if the file times are modified.
flag          fastarrays    false       # Generates extra instructions inside array handling functions to
                                        # detect engine and use extension opcodes only in supporting engines.
                                        # Adds a global which is set by the engine if the engine supports
                                        # the extra opcodes. Note that this applies to all arrays or none.
flag          assumeint     false       # Numerical constants are assumed to be integers, instead of floats.
flag          subscope      false       # Restrict the scope of locals to the block they are actually defined
                                        # within, as in C.
flag          verbose       false       # Lots of extra compiler messages.
flag          typeexplicit  false       # All type conversions must be explicit or directly supported by
                                        # instruction set.
flag          noboundchecks false       # Disable array index checks, speeding up array access but can result
                                        # in your code misbehaving.
flag          qccx          false       # WARNING: This syntax makes mods inherantly engine specific.
                                        # Do NOT use unless you know what you're doing.This is provided
                                        # for compatibility only
                                        # Any entity hacks will be unsupported in FTEQW, DP, and others,
                                        # resulting in engine crashes if the code in question is executed.
flag          embedsrc      false       # Write the sourcecode into the output file.
showall       off                       # Show all keyword options in the gui
compileonstart off                      # Recompile on GUI startup
log           off                       # Write out a compile log
enginebinary  fteglqw.exe               # Location of the engine binary to run. Change this to something
                                        # else to run a different engine, but not all support debugging.
basedir       ../..                     # The base directory of the game that contains your sub directory
engineargs    "-window -nohome -game game" 
                                        # The engine commandline to use when debugging. You'll likely want
                                        # to ensure this contains -window as well as the appropriate -game
                                        # argument.
srcfile       progs.src                 # The progs.src file to load to find ordering of other qc files.
src                                     # Additional subdir to read qc files from. Typically blank (ie:
                                        # the working directory).
extramargins  off                       # Enables line number and folding margins.
hexen2        off                       # Enable the extra tweaks needed for compatibility with hexen2 engines.
extendedopcodes off                     # Utilise an extended instruction set, providing support for pointers
                                        # and faster arrays and other speedups.
parameters                              # Other additional parameters that are not supported by the gui.
                                        # Likely including -DFOO
