
TODO
====

Monsters:
  +  add guard monsters first, seeds around the purpose
     (or the weapon).

  +  "monster map" :
     (1) select 1-4 types of monster to use in room (palette)
         (and a pref for each one)

         (a) palette might not include guard monster
             (bump chance way down)

         (b) from player's current weapons determine a 'firepower'
             value (average of classes in Hexen).
             This is roughly how much damage can be done per sec.

             Hence we know how long each kind of monster would
             take to kill.  TOO LONG = skip monster,
             TOO SHORT = skip or bump chance way down.

  +  once we have the monster map, all we need then is some
     idea of QUANTITIES.

     +  the skill level controls how many monsters to add.
        Each monster is always present in "hard" and may be
        omitted for lower skills.  Maybe: medium keep 66%,
        easy keep 33%.  (always keep at least one).

     +  the GUI 'Monsters' setting not only controls how many
        monsters, but also affects difficulty, though quantity
        is more significant than the difficulty adjustment.

  #  decide level-wide monster palette (no monsters are used
     which are not in this palette).  Could save big monsters
     (arach, mancubus) for later levels and omit small ones
     (esp. pistol zombie).  Perhaps have a palette for each
     usage kind (free-range, guard, trap, cage) ??

  #  add some monsters
  -  cages & ledges
  -  monster closets
  -  pop-ups 
  -  teleport-in
  -  facing entry door [blaze D1]


Ceilings:
  - put several small light fittings/sky holes with
    simple patterns (e.g. inner 2x2 seeds, or outer corners)

  - don't always trim the sky hole


Pickups:
  -  add some powerups


Fight Sim: reimplement monster-weapon preferences

Fight Sim: handle weapon immunity [e.g. Shambler] --> abuse weap prefs
  

Misc:

-  review / improve 'emergency' connections





================================================================
DETAILED TODO LIST
================================================================


!!  CSG CODE: do a proper face-creation pass (merge_face_c list
              in each merge_segment_c ?) and get proper brush
              and area_vert references.

              Hence remove the CSG2_FindXXX rubbish.


++  DOOM CSG: merge linedefs where possible

+   DOOM CSG: fix y_offset values


Windows:
  - better patterns:
    (1) flank door mode
    (2) every second seed mode

  - put in indoor children rooms which don't connect to parent


Hallways:
  - rarely and big room (3+ conn) : make a maze


Ceilings:
  + or a criss-cross of beams, especially with pillars or
    low opposite sides.  [NOTE: can mess up lifts!]

  - mega sky holes (two in one, esp. outer has F_SKY1)


Pictures:
  - implement "billboards", pictures which jut down from the
    ceiling (above doors and low periphs).


POLISH:
  - mark end of big tables with a comment (like D1_WALL_PREFABS)


Quake II:
  -  need to store wall brushes into a big list (qLeaf_c)
     and "split" them with Split_XY (if purely on one side,
     move to that side, otherwise keep in both sides).

     when get to solid wall leaf, keep the ones that match
     that wall (i.e. not completely in front of wall).


Quakey:
  +  create 'worldspawn' entity via Lua code
     (hence don't need gui.property("description"))

  +  merge Q#_CreateEntities into a common function

  -  dface_t == dface2_t, move into common ??


>>>  a segment with same front and back ????

>>>  AssignBrushes: double checking using f/b_sides


CSG IDEA: clipping rectangles (typically a room)


NAME GENERATOR

-  GUI SIDE:
   -  BOOM: DEHACKED lump   -- comments use '#'
            [STRINGS] section
            
            gui.property("bex_string", "HUSTR_%d = %s")

            (also: HUSTR_ExMy, PHUSTR_%d, THUSTR_%d)

   -  EDGE: DDFLANG lump    -- comments use '//'
            [ENGLISH] section

            gui.property("ddf_string", "Map01Desc=\"%s\";")

            (also: ExMyDesc="%s")

   -  Doomsday:  DD_DEFNS lump  -- comments use '#'
              
              Map Info
              {
                ID = "MAP01";
                Name = "Blah Blah";
              }

   -  Eternity:  EMAPINFO lump  -- comments use '#'

              [MAP01]
              levelname = Blah Blah
              music = xxxx
              creator = Oblige 3.xx
              skyname = SKY3

   -  ZDOOM / HEXEN: MAPINFO lump   -- comments use ';' 

             gui.mapinfo_map(lump, description)
             gui.mapinfo_property("cluster", "1")

             LIMIT = 31 letters

   -  QUAKE 1/2: stored in 'worldspawn' entity

             gui.property("level_desc", "%s") --> 'message' field

             LIMIT = 39 letters

-  WILVxx and CWILVxx creation: need an API!


MUSIC RE-ORDERING

   *  Doom 1: shuffle each episode

   *  Doom 2: if one episode (or less), pick random tracks and
              ensure that no two tracks have the same three-letter
              prefix.

   *  Doom 2, full game: shuffle tracks, loop a few times looking
                         for repeats (same three-letter prefix in a
                         row) and move one to random spot.

   -  BOOM, Eternity: [MUSIC] section in BEX

          [MUSIC]
          ROMERO = RUNNIN
          RUNNIN = STALKS
          STALKS = ROMERO

   -  Eternity native: 'music' setting in EMAPINFO

   -  EDGE native:  DDFPLAY lump:
   
          <PLAYLISTS>
          [01]
          MUSICINFO=MUS:LUMP:"D_RUNNIN";

   -  ZDoom : via MAPINFO: music D_RUNNING


THEME SELECTION

(a) Each level has a THEME, e.g. "Tech"

(b) User can select what theme to use ---> case closed

(c) For "mixed" select a random theme, bearing in mind:
    (i) secret levels can choose something whacky
    (ii) One-Episode: use 'epi_prob', group same themes together
    (iii) Full-Game: prefer episodes to have whole theme
                     and prefer theme to match sky


EXTRA GRAPHICS

   { "WALL52_X", "WALL53_1" },  // Doom    : CEMENT1,  CEMENT2
   { "WALL00",   "WALL42"   },  // Heretic : GRSKULL2, CHAINSD
   { "W_320",    "W_321"    }   // Hexen   : BRASS3,   BRASS4

   static const char *ext_patches[] =
   {
     "W74A_1",   "W74A_2", "W74B_1",         // FIREMAGx (water)
     "WALL64_2", "W64B_1", "W64B_2",         // ROCKREDx (lava)
     "RP2_1",    "RP2_2",  "RP2_3", "RP2_4", // BLODRIPx (blood)
     "TP5_1",    "TP5_2",  "TP5_3", "TP5_4", // BLODGRx  (nukage)

     NULL // end marker
   }



Room Fitting Out
----------------

-  can_fab_list: do preliminary size check (e.g. min/max)

-  Junk sides
   (f) sometimes allow one gap for a connection
   (g) ensure floor_fill works OK
   (h) use in rooms with children (no touching them)

-  IDEA: junk a side with a connection, and the little "bridge"
         seed can become a stairway.

-  BUG: lowering bars can bypass-able

-  ability to use patterns with heights both HIGHER and LOWER
   than the '.' entry connection.  (maybe: height=-1 in subs)

- ceilings:
  - big room with no sky neighbours: have a huge sky hole



Stairwells: more steps to ensure wall lengths <= 128 units
            --> SEED_SIZE * max(sx_span, sy_span) / 128

Quests
  - sometimes lock another connection (ESP: symmetry)
    with the same lock as one we just added
    [ESP: when new lock goes to leaf or semi-leaf]

CONNECT:  for TC (etc) patterns, make the ones that branch at
          room corners less likely (i.e. prefer 1 or 2 seeds
          away from corner, though it depends on room size).

HEIGHTS: prevent any room from having more than 4 heights
         [tiny rooms: no more than 2]


HEXEN lua: gui.property("hexen_format", "true")

SPEAR lua: gui.property("file_ext", "SOD")

EDGE: gui.property("solid_exfloor", 400)
      gui.property("liquid_exfloor", 406)
      gui.property("thing_exfloor_flags", "true")

LEGACY: gui.property("solid_exfloor", 281)
        gui.property("liquid_exfloor", 280)  -- 301


q1_nodes:
  -  floor_leaf --> leaf
  ?? move floor/ceiling faces into leaf.faces (instead of leaf.floor)

q2_nodes:
   use cluster=-1 for SOLID leafs

   create a solid leaf for each area_poly
   (can sometimes have 2+ area_polys per solid leaf, walls with stacked brushes)
   NOTE: need CONVEX brush sides : if not convex, find closest
         concave point to face and "chop" there
         _OR_: use bsp to chop em up
         _OR_: share a solid leaf for every empty leaf
   ALSO: handle co-planer sides (allowed by Oblige, maybe ok for Q2, not sure)


QUAKE:

+ fix bounding boxes for everything (especially Leafs)

+ create faces from stacked brushes behind a gap (cf. oa_dm7)

- clipping hulls:

++ grab Q1 textures directly from PAK files
   - read/modify FOLDERS.cfg file
   ??? code to check if data/quake_tex.wad exists
   ? gui.property("extra_tex_wad", "data/oq_tex.wad")
   ? gui.property("needed_pak",  "pak0.pak")

- create "oblige" logo miptex [.wal for QuakeII]

++ perform lighting

++ perform visibility

  ?? convert portal sides into portal faces


DOOM ENTITY PROPS:
  angle
  options
  tid
  special
  args


QUAKE1 ENTITY PROPS:
  light
  spawnflags
  target
  targetname
  speed
  next stop



General:

+  create special BOSS levels (e.g. E1M8, MAP30)

+  get traps (closets / depots) working again.

-  make the EASY skill much easier (less monsters)

-  Deathmatch: implement DM-Equipment module

?  put important constants/tables into defs.lua


GUI / C++:

-  ui_chooser: support last_file in WIN32
      maybe this: lpstrFile contains _base_ of file (FOO.EXT)
              and lpstrInitialDir contains _path_ of last file.
      probably only set it once (first call).

+  get the 'Unixy' type of installation working, and
   write a INSTALL.txt with some useful information.

-  on serious script errors: remember it, so that we
   don't try calling into LUA to write the config.

-  improve icon for Win32 executable.

-  ideas for remaining button (YYY) :
   -  Secrets   (would be useless for DM)
   -  Powerups
   +  Outdoor-iness
   -  Lighting adjustment
   -  Big monster adjustment
   -  Linearity

-  make sure target dir is writable _before_ making levels.
   (have a "CheckDirWritable" function?)


SKY GENERATOR:

-  background part: GRADIENT or CLOUDS or STARS

   GRADIENT params: colors
   CLOUD param: fracdim, powscale, squish, colors
   STARS param: powscale, cutoff, colors

-  foreground part: NONE or MOUNTAINS or BUILDINGS

   MOUNTAINS params: min_h, max_h, fracdim, powscale, colors
   BUILDINGS params: min_h, max_h, gap_size, colors, light_cols


DOOM

-  make light level of windows (esp. outdoor -> outdoor)
   slightly lower than surrounds.


HERETIC:

-  don't build Blaze doors into maps.

-  monsters: not mixed enough (too repetitive), no bosses.

-  weapons: firemace no good for SP/COOP ??


HEXEN:

+  need exit teleporter in final Hub.

-  put 'fighter only' bit on fighter's weapons, etc..

+  bug report: some doors close and never open.

+  rework teleporter gates (make them bi-directional).

+  fix key usage (REQUIRE both to get to boss level).


WOLF3d:

   + push-walls for secret quests!
   + secret elevators
   + bosses!

   - decide_monster : skills are "tiered"
   - health/ammo : no skills! -- use medium one
   - place_items : never where monsters are!
   - create rooms with 'endgame' object.

   + ensure limits are enforced:
     - MAXACTORS = 150  (remove actors at random)
     - MAXSTATS  = 400  (remove statics at random)
     - MAXDOORS  = 64   (remove unneeded doors at random)

   - patrolling monsters (need to create path with arrows).
   - secret levels (full of treasure)
   - something interesting in middle of big rooms.
   - elevator "entry" in first room.


Docs:

-  note that you need full version of XXX to play the games
   (shareware won't work).


Secrets:

-  fix battle simulator to ignore stuff got in secrets
   (push state onto stack, pop afterwards).

-  different item probs, e.g. invuln & berserk are good


Theme system:

-  Room types:

   (a) storage   (crates, barrels)
   (b) quarters  (tables, chairs, beds)
   (c) bathroom
   (d) computer
   (e) library

   (f) armoury | supplies
   (g) processing plant (machines)
   (h) torture  (wolf3d/SOD)


Monsters:

++  put in some Cyberdemons or Spider Masterminds

-  at each room, pick 2-3 (rarer: 1,4) monster types
   then decide how many of each one (for each skill).

-  monster adjustment: don't just increase toughness, actually
   create _more_ monsters.

-  IDEA: treat groups of rooms (esp: multi starts and forked
         paths) as a SINGLE BATTLE ARENA.

-  cage monsters: don't put hitscan snipers up really high.



----------------------------------------------------------------
PIPE DREAMS
----------------------------------------------------------------

++ better global architecture, room-in-a-room.

+  teleporters!

+  make Oblige easier to mod.

-  bridges (activate by a switch)

-  light up levels (a la quake).

-  exit via teleporter pad or holes in floor

-  improved use of liquids.

-  "Horror" mode: fewer but tougher monsters, fewer ammo, darker levels.

-  a mod for Eternal III

-  Rooms that lock you in and you have to find the switch on
   the other side of the room to get out.  All "normal" exits
   would be closed off by a line trigger near the entry way.

-  Pop-up Traps
   you make a sector, lower it enough so monsters cannot see
   the player but are facing him when it springs. The trap walls have
   no lower texture and you set the trigger line to action 19 ( W1
   floor lower to highest floor) and you set the trap monsters deaf so
   they aren't awakened by player gunshots.

   When the player trips the linedef, the floors instantly pop up to
   the nearest floor height without the rising delay of some other
   linedef actions. Another thing is to make sure the line that
   triggers the trap can't be bypassed and thus the player can get
   stuck in the hole if he falls in.

-  Surprise Lifts:
   It is a hallway/room section that looks normal but when the player
   crosses the Lift-Lower-Wait-Rise linedef, it lowers to surprise the
   player with monsters on one or both sides of the lift.

-  Dead/gibbed player corpses sprinkled around on each level (Just
   like Doom episode 1) with the chance of a weapon near their
   remains (Shotgun 35%, chaingun 30%, Supershot 15%, rocket
   launcher 15% and plasmagun 5%?)? Of course the weapon placement
   by the body is at a chance (15-20% chance?)

-  Type of boss battles JohnnyRancid would like to see:
      20+ revenants.
      2-5 arch viles.
      5-10 pain elementals
      2 cyberdemons.
      20+ hell barons or hell knights.
      20+ cacodemons.
      5-15 mancubi
      5-15 arachnatrons

?? one-way routes ??
   -  for example: at along:3 fall-off -> along:4
      BUT... how to get back to along:3 ??
      WITHOUT creating an alternative path?
      ANSWER: use another one-way connection

   - One way connections:
     (a) fall-offs
     (b) teleporters
     (c) doors that only open from one side (esp. via a switch)
     (d) lifts that go up (or down) into a hole
         (activated by a switch only on one side).

-  have a table listing a quantized HSV for each texture/flat
   and make aesthetic decisions using it.

-  Batch mode:
   .  -b(atch) builds then quits
   .  -o(utput) for output filename
   .  set parameters via command-line : xxx=aaa yyy=bbb (non-options)
   .  option to read a different config file: -c(onfig)
   .  never writes the config file
   ?? what to do on error ??

-  CTF maps (boomctf) :

      5130 = "Blue flag";
      5131 = "Red flag";

      5080 = "Blue Start"      
      5081 = "Red Start"


 ____________________
|KEY:                |
|    #  completed    |
|    -  plain item   |
|    +  important    |
|    >> in progress  |
|    ?? not sure     |
|____________________|

