X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=3c2e7aa4420f2ee156c2f2fbf37e61e60bbb6ed7;hb=6eab64d006f1081bc5096507bb634928cadd6d66;hp=0db51cf209682768cb56a34eada71f7512781e77;hpb=77620b19e88e8eb4884be54475632754d8a4014e;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 0db51cf..3c2e7aa 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -52,6 +52,8 @@ type TCommand = record Cmd: String; Proc: TCmdProc; + help: String; + hidden: Boolean; end; TAlias = record @@ -157,7 +159,16 @@ begin g_Console_Add(''); g_Console_Add('Commands list:'); for a := High(Commands) downto 0 do - g_Console_Add(' '+Commands[a].Cmd); + begin + if (Length(Commands[a].help) > 0) then + begin + g_Console_Add(' '+Commands[a].Cmd+' -- '+Commands[a].help); + end + else + begin + g_Console_Add(' '+Commands[a].Cmd); + end; + end; end; if Cmd = 'time' then @@ -334,17 +345,19 @@ var begin SetLength(Whitelist, Length(Whitelist)+1); a := High(Whitelist); - Whitelist[a] := Cmd; + Whitelist[a] := LowerCase(Cmd); end; -procedure AddCommand(Cmd: String; Proc: TCmdProc); +procedure AddCommand(Cmd: String; Proc: TCmdProc; ahelp: String=''; ahidden: Boolean=false); var a: Integer; begin SetLength(Commands, Length(Commands)+1); a := High(Commands); - Commands[a].Cmd := Cmd; + Commands[a].Cmd := LowerCase(Cmd); Commands[a].Proc := Proc; + Commands[a].hidden := ahidden; + Commands[a].help := ahelp; end; procedure g_Console_Init(); @@ -365,7 +378,7 @@ begin Time := 0; end; - AddCommand('clear', ConsoleCommands); + AddCommand('clear', ConsoleCommands, 'clear console'); AddCommand('clearhistory', ConsoleCommands); AddCommand('showhistory', ConsoleCommands); AddCommand('commands', ConsoleCommands); @@ -388,20 +401,21 @@ begin AddCommand('d_player', DebugCommands); AddCommand('d_joy', DebugCommands); - AddCommand('pf_draw_frame', ProfilerCommands); - AddCommand('pf_update_frame', ProfilerCommands); - AddCommand('pf_coldet', ProfilerCommands); - AddCommand('r_sq_draw', ProfilerCommands); - AddCommand('r_sq_use_grid', ProfilerCommands); - AddCommand('r_sq_use_tree', ProfilerCommands); - AddCommand('dbg_sq_coldet', ProfilerCommands); + AddCommand('pf_draw_frame', ProfilerCommands, 'draw frame rendering profiles'); + //AddCommand('pf_update_frame', ProfilerCommands); + AddCommand('pf_coldet', ProfilerCommands, 'draw collision detection profiles'); + AddCommand('r_sq_draw', ProfilerCommands, 'accelerated spatial queries in rendering'); + AddCommand('r_sq_use_grid', ProfilerCommands, 'use grid for render acceleration'); + AddCommand('r_sq_use_tree', ProfilerCommands, 'use tree for render acceleration'); + AddCommand('dbg_sq_coldet', ProfilerCommands, 'accelerated spatial queries in map coldet'); AddCommand('t_dump_node_queries', ProfilerCommands); - AddCommand('sq_use_grid', ProfilerCommands); - AddCommand('sq_use_tree', ProfilerCommands); + AddCommand('sq_use_grid', ProfilerCommands, 'use grid for map coldet acceleration'); + AddCommand('sq_use_tree', ProfilerCommands, 'use tree for map coldet acceleration'); - AddCommand('mon_sq_enabled', ProfilerCommands); + AddCommand('mon_sq_enabled', ProfilerCommands, 'use accelerated spatial queries for monsters'); + AddCommand('wtrace_sq_enabled', ProfilerCommands, 'use accelerated weapon hitscan trace'); AddCommand('p1_name', GameCVars); AddCommand('p2_name', GameCVars); @@ -727,39 +741,122 @@ begin CPos := CPos + 1; end; -procedure Complete(); + var - i: Integer; - t: Array of String; + tcomplist: array of string = nil; + tcompidx: array of Integer = nil; + +procedure Complete (); +var + i, c: Integer; + tused: Integer; + ll, lpfx, cmd: string; begin - if Line = '' then - Exit; + if (Length(Line) = 0) then + begin + g_Console_Add(''); + for i := 0 to High(Commands) do + begin + if not Commands[i].hidden then + begin + if (Length(Commands[i].help) > 0) then + begin + g_Console_Add(' '+Commands[i].Cmd+' -- '+Commands[i].help); + end + else + begin + g_Console_Add(' '+Commands[i].Cmd); + end; + end; + end; + exit; + end; - t := nil; + ll := LowerCase(Line); + lpfx := ''; + if (Length(ll) > 1) and (ll[Length(ll)] = ' ') then + begin + ll := Copy(ll, 0, Length(ll)-1); + for i := 0 to High(Commands) do + begin + if Commands[i].hidden then continue; + if (Commands[i].Cmd = ll) then + begin + if (Length(Commands[i].help) > 0) then + begin + g_Console_Add(' '+Commands[i].Cmd+' -- '+Commands[i].help); + end; + end; + end; + exit; + end; + + // build completion list + tused := 0; for i := 0 to High(Commands) do - if LowerCase(Line) = LowerCase(Copy(Commands[i].Cmd, 0, Length(Line))) then + begin + if Commands[i].hidden then continue; + cmd := Commands[i].Cmd; + if (Length(cmd) >= Length(ll)) and (ll = Copy(cmd, 0, Length(ll))) then begin - SetLength(t, Length(t) + 1); - t[Length(t)-1] := Commands[i].Cmd; + if (tused = Length(tcomplist)) then + begin + SetLength(tcomplist, Length(tcomplist)+128); + SetLength(tcompidx, Length(tcompidx)+128); + end; + tcomplist[tused] := cmd; + tcompidx[tused] := i; + Inc(tused); + if (Length(cmd) > Length(lpfx)) then lpfx := cmd; end; + end; - if t = nil then - Exit; + // get longest prefix + for i := 0 to tused-1 do + begin + cmd := tcomplist[i]; + for c := 1 to Length(lpfx) do + begin + if (c > Length(cmd)) then break; + if (cmd[c] <> lpfx[c]) then begin lpfx := Copy(lpfx, 0, c-1); break; end; + end; + end; + + if (tused = 0) then exit; - if Length(t) = 1 then + if (tused = 1) then + begin + Line := tcomplist[0]+' '; + CPos := Length(Line)+1; + end + else + begin + // has longest prefix? + if (Length(lpfx) > Length(ll)) then begin - Line := t[0]+' '; - CPos := Length(Line)+1; + Line := lpfx; + CPos:= Length(Line)+1; end - else + else begin g_Console_Add(''); - for i := 0 to High(t) do - g_Console_Add(' '+t[i]); + for i := 0 to tused-1 do + begin + if (Length(Commands[tcompidx[i]].help) > 0) then + begin + g_Console_Add(' '+tcomplist[i]+' -- '+Commands[tcompidx[i]].help); + end + else + begin + g_Console_Add(' '+tcomplist[i]); + end; + end; end; + end; end; + procedure g_Console_Control(K: Word); begin case K of