X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=f91bc624495dbbf29073904eb7ede60a3be7d8b7;hb=ded89321df07e3f5832331127637375840c25e6f;hp=3ed1d138818daa0cdb64e42251613634afc6ec5e;hpb=38ffc69cb8386eb4f610ad5838e776ac04c6c297;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 3ed1d13..f91bc62 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -42,6 +42,7 @@ procedure g_Console_Chat_Switch (team: Boolean=false); procedure conRegVar (const conname: AnsiString; pvar: PBoolean; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; procedure conRegVar (const conname: AnsiString; pvar: PSingle; amin, amax: Single; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +procedure conRegVar (const conname: AnsiString; pvar: PInteger; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks function conParseFloat (var res: Single; const s: AnsiString): Boolean; @@ -60,7 +61,7 @@ implementation uses g_textures, g_main, e_graphics, e_input, g_game, - SysUtils, g_basic, g_options, Math, + SysUtils, g_basic, g_options, Math, g_touch, g_menu, g_language, g_net, g_netmsg, e_log, conbuf; @@ -192,6 +193,41 @@ begin end; +procedure intVarHandler (me: PCommand; p: SSArray); + procedure binaryFlag (var flag: Boolean; msg: AnsiString); + begin + if (Length(p) > 2) then + begin + conwritefln('too many arguments to ''%s''', [p[0]]); + end + else + begin + case conGetBoolArg(p, 1) of + -1: begin end; + 0: if not me.cheat or conIsCheatsEnabled then flag := false else begin conwriteln('not available'); exit; end; + 1: if not me.cheat or conIsCheatsEnabled then flag := true else begin conwriteln('not available'); exit; end; + 666: if not me.cheat or conIsCheatsEnabled then flag := not flag else begin conwriteln('not available'); exit; end; + end; + if (Length(msg) = 0) then msg := p[0] else msg += ':'; + if flag then conwritefln('%s tan', [msg]) else conwritefln('%s ona', [msg]); + end; + end; +begin + if (Length(p) <> 2) then + begin + conwritefln('%s %d', [me.cmd, PInteger(me.ptr)^]); + end + else + begin + try + PInteger(me.ptr)^ := StrToInt(p[1]); + except + conwritefln('invalid integer value: "%s"', [p[1]]); + end; + end; +end; + + procedure conRegVar (const conname: AnsiString; pvar: PBoolean; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; var f: Integer; @@ -211,6 +247,25 @@ begin end; +procedure conRegVar (const conname: AnsiString; pvar: PInteger; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +var + f: Integer; + cp: PCommand; +begin + f := Length(commands); + SetLength(commands, f+1); + cp := @commands[f]; + cp.cmd := LowerCase(conname); + cp.proc := nil; + cp.procEx := intVarHandler; + cp.help := ahelp; + cp.hidden := ahidden; + cp.ptr := pvar; + cp.msg := amsg; + cp.cheat := acheat; +end; + + // ////////////////////////////////////////////////////////////////////////// // type PVarSingle = ^TVarSingle; @@ -926,6 +981,7 @@ begin if gChatShow then Exit; gConsoleShow := not gConsoleShow; Cons_Shown := True; + g_Touch_ShowKeyboard(gConsoleShow or gChatShow); end; procedure g_Console_Chat_Switch(Team: Boolean = False); @@ -938,6 +994,7 @@ begin gChatEnter := False; Line := ''; CPos := 1; + g_Touch_ShowKeyboard(gConsoleShow or gChatShow); end; procedure g_Console_Char(C: AnsiChar); @@ -961,6 +1018,7 @@ var begin if (Length(Line) = 0) then begin + if (g_Game_IsNet and g_Game_IsServer) or (g_Game_IsClient) then exit; g_Console_Add(''); for i := 0 to High(commands) do begin @@ -1077,13 +1135,13 @@ begin IK_DELETE: if (Length(Line) > 0) and (CPos <= Length(Line)) then Delete(Line, CPos, 1); - IK_LEFT, IK_KPLEFT: + IK_LEFT, IK_KPLEFT, VK_LEFT: if CPos > 1 then CPos := CPos - 1; - IK_RIGHT, IK_KPRIGHT: + IK_RIGHT, IK_KPRIGHT, VK_RIGHT: if CPos <= Length(Line) then CPos := CPos + 1; - IK_RETURN, IK_KPRETURN: + IK_RETURN, IK_KPRETURN, VK_OPEN, VK_FIRE: begin if Cons_Shown then g_Console_Process(Line) @@ -1114,12 +1172,13 @@ begin CPos := 1; gChatShow := False; gJustChatted := True; + g_Touch_ShowKeyboard(gConsoleShow or gChatShow); end; end; IK_TAB: if not gChatShow then Complete(); - IK_DOWN, IK_KPDOWN: + IK_DOWN, IK_KPDOWN, VK_DOWN: if not gChatShow then if (CommandHistory <> nil) and (CmdIndex < Length(CommandHistory)) then @@ -1129,7 +1188,7 @@ begin Line := CommandHistory[CmdIndex]; CPos := Length(Line) + 1; end; - IK_UP, IK_KPUP: + IK_UP, IK_KPUP, VK_UP: if not gChatShow then if (CommandHistory <> nil) and (CmdIndex <= Length(CommandHistory)) then @@ -1139,9 +1198,9 @@ begin Line := CommandHistory[CmdIndex]; Cpos := Length(Line) + 1; end; - IK_PAGEUP, IK_KPPAGEUP: // PgUp + IK_PAGEUP, IK_KPPAGEUP, VK_PREV: // PgUp if not gChatShow then Inc(conSkipLines); - IK_PAGEDN, IK_KPPAGEDN: // PgDown + IK_PAGEDN, IK_KPPAGEDN, VK_NEXT: // PgDown if not gChatShow and (conSkipLines > 0) then Dec(conSkipLines); IK_HOME, IK_KPHOME: CPos := 1;