рд╣рдо рдЧреЗрдо рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рдИрд╕реАрдПрд╕ рдХреЛ рдХреИрд╕реЗ рдбрд┐рдмрдЧ рдХрд░рддреЗ рд╣реИрдВ



рдореИрдВ рдЙрди рддрдВрддреНрд░реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдЧреЗрдо рд▓реЙрдЬрд┐рдХ рдХреЗ рджреГрд╢реНрдп рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдореИрдЪ рд╕реНрдЯреЗрдЯреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ (рдХрдЯ рдХреЗ рдареАрдХ рдиреАрдЪреЗ рдХреА рд╕реВрдЪреА) рдмрддрд╛рдпрд╛ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣рдорд╛рд░реА рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдИрд╕реАрдПрд╕ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЪрдпрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реА рдПрдХ рд╕рдорд╛рдзрд╛рди рдерд╛ рдПрдВрдЯрд╛рдЗрдЯрд╛рд╕ ред рд░рд╛рдЬреНрдп рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдкрд╕рдВрдж рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдХрддрд╛ рдореЗрдВ рдЖрдк рд╕рдВрд╕реНрдерд╛рдУрдВ, рдШрдЯрдХреЛрдВ, рдкреВрд▓ рдкреНрд░рдгрд╛рд▓реА, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдЖрджрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рднреА рдЖрдБрдХрдбрд╝реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдиреЗ рд╣рдореЗрдВ рдЦреЗрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдореИрдЪ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рд╡реЗ рдХреИрд╕реЗ рдЦреЗрд▓рддреЗ рд╣реИрдВ, рд╕рд┐рд╕реНрдЯрдо рдкреВрд░реЗ рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдХрд░реЗрдЧрд╛ред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧреЗрдо рдХреЗ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╡рд┐рдХрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдЬреЛ рд╣рдордиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд┐рдпрд╛ рдерд╛ рдЙрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯреВрд▓ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИрдВред



рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦреЛрдВ рдХреА рд╡рд╛рджрд╛ рдХреА рдЧрдИ рд╕реВрдЪреА:

  1. " рд╣рд╛рдЙ рд╡реА рд╡реАрдВрдЧ рдСрди рдП рдореЛрдмрд╛рдЗрд▓ рдлрд╛рд╕реНрдЯ рдкрд╛рд╕реНрдб рд╢реВрдЯрд░: рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА рдПрдВрдб рдЕрдкреНрдЪреЗрдЬрд╝ ред"
  2. " рд╣рдордиреЗ рдЕрдкрдирд╛ ECS рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛ рд╣реИ ред"
  3. " рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдореЛрдмрд╛рдЗрд▓ PvP рд╢реВрдЯрд░ рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ: рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкреНрд▓реЗрдпрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди ред"
  4. " рдПрдХ рдирдП рдореЛрдмрд╛рдЗрд▓ PvP рд╢реВрдЯрд░ рдФрд░ рдЧреЗрдо рд╕рд░реНрд╡рд░ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди: рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ рд╕рдорд╛рдзрд╛рди ред"

рдЕрдм рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдиреАрдЪреЗред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдиреЗ рдХреБрдЫ рдПрдкреАрдЖрдИ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ред рд╕рд░реНрд╡рд░ рдЦреБрдж рд╕реЙрдХреЗрдЯ рдкреЛрд░реНрдЯ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкреЛрд░реНрдЯ рдкрд░ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдирддрд╛ рд╣реИред

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдХрд╛рдлреА рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИ
private bool HandleHttp(Socket socket) { var buf = new byte[8192]; var bufLen = 0; var recvBuf = new byte[8192]; var bodyStart = -1; while(bodyStart == -1) { var recvLen = socket.Receive(recvBuf); if(recvLen == 0) { return true; } Buffer.BlockCopy(recvBuf, 0, buf, bufLen, recvLen); bufLen += recvLen; bodyStart = FindBodyStart(buf, bufLen); } var headers = Encoding.UTF8.GetString(buf, 0, bodyStart - 2).Replace("\r", "").Split('\n'); var main = headers[0].Split(' '); var reqMethod = ParseRequestMethod(main[0]); if (reqMethod == RequestMethod.Invalid) { SendResponse(400, socket); return true; } // receive POST body var body = string.Empty; if(reqMethod == RequestMethod.Post) { body = ReceiveBody(buf, bufLen, headers, bodyStart, socket); if(body == null) { return true; } } var path = main[1]; if(path == "/") { path = "/index.html"; } // try to serve by a file if(File.Exists(_docRoot + path)) { var content = File.ReadAllBytes(_docRoot + path); if (reqMethod == RequestMethod.Head) { content = null; } SendResponse(200, socket, content, GuessMime(path)); return true; } // try to serve by a handle foreach(var handler in _handlers) { if(handler.Match(reqMethod, path)) { if (handler.Async) { _jobs.Enqueue(() => { RunHandler(socket, path, body, handler); socket.Shutdown(SocketShutdown.Both); socket.Close(); }); return false; } else { RunHandler(socket, path, body, handler); return true; } } } // nothing found :-( var msg = "File not found " + path + "\ndoc root " + _docRoot + "\ncurrent dir " + Directory.GetCurrentDirectory(); SendResponse(404, socket, Encoding.UTF8.GetBytes(msg)); return true; } 


рдлрд┐рд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред
рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЦреЗрд▓ рдореЗрдВ рд╕рднреА рдореИрдЪреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╣реИрдВрдбрд▓рд░ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рд╕рднреА рдореИрдЪреЛрдВ рдХреЗ рдЬреАрд╡рди рд╕рдордп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рддреНрд╡рд░рд┐рдд рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╕ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рд╛, рдЬреЛрд╕рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдкрд░ рдореИрдЪреЛрдВ рдХреА рд╕реВрдЪреА рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ
 public string ListMatches(string method, string path) { var sb = new StringBuilder(); sb.Append("[\n"); foreach (var match in _matches.Values) { sb.Append("{id:\"" + match.GameId + "\"" + ", www:" + match.Tool.Port + "},\n" ); } sb.Append("]"); return sb.ToString(); } 




рдореИрдЪ рдХреЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдирд┐рдпрдВрддреНрд░рдг рдореЗрдиреВ рдкрд░ рдЬрд╛рдПрдВред рдпрд╣рд╛рдВ рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд░реНрд╡рд░ рдХреЗ рдбрд┐рдмрдЧ-рдЕрд╕реЗрдВрдмрд▓реА рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдореИрдЪ рдЕрдкрдиреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░рд╛ рдбреЗрдЯрд╛ рджреЗрддрд╛ рд╣реИред GameState рд╕рд╣рд┐рдд рд╣рдордиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ ред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреВрд░реЗ рдореИрдЪ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╣реЛрдиреЗ рдкрд░, рд╣рдо html рдореЗрдВ рдореИрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рдмрджрд▓ рднреА рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред

рдкрд╣рд▓рд╛ рд▓рд┐рдВрдХ рдорд╛рдирдХ рдорд┐рд▓рд╛рди рд▓реЙрдЧ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:



рдЗрд╕рдореЗрдВ, рд╣рдо рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧреА рдбреЗрдЯрд╛, рдбреЗрдЯрд╛ рдХреА рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд░рд╛рд╢рд┐, рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдореБрдЦреНрдп рдЬреАрд╡рди рдЪрдХреНрд░ рдФрд░ рдЕрдиреНрдп рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

GameViewer рдХрд╛ рджреВрд╕рд░рд╛ рд▓рд┐рдВрдХ рдореИрдЪ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ:



рдЬреЗрдирд░реЗрдЯрд░ рдЬреЛ рдбреЗрдЯрд╛ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП ECS рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИ рд╡рд╣ рднреА json рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЬрд╕рди рд╕реЗ рдореИрдЪ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдЬреАрдПрд▓ рдореЗрдВ рддреАрди.рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ
 { enums: { "HostilityLayer": { 1: "PlayerTeam1", 2: "PlayerTeam2", 3: "NeutralShootable", } }, components: { Transform: { name: 'Transform', fields: { Angle: {type: "float"}, Position: {type: "Vector2"}, }, }, TransformExact: { name: 'TransformExact', fields: { Angle: {type: "float"}, Position: {type: "Vector2"}, } } }, tables: { Transform: { name: 'Transform', component: 'Transform', }, TransformExact: { name: 'TransformExact', component: 'TransformExact', hint: "Copy of Transform for these entities that need full precision when sent over network", } } } 


рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдирд┐рдХрд╛рдпреЛрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ) рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдЪрдХреНрд░ рдЗрд╕ рддрд░рд╣ рд╣реИ
 var rulebook = {}; var worldstate = {}; var physics = {}; var update_dynamic_physics; var camera, scene, renderer; var controls; function init3D () { camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000); camera.up.set(0,0,1); scene = new THREE.Scene(); scene.add( new THREE.AmbientLight( 0x404040 ) ); var light = new THREE.DirectionalLight( 0xFFFFFF, 1 ); light.position.set(-11, -23, 45); scene.add( light ); renderer = new THREE.WebGLRenderer(); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); controls = new THREE.OrbitControls( camera, renderer.domElement ); var cam = localStorage.getObject('gv_camera'); if (cam) { camera.matrix.fromArray(cam.matrix); camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); controls.target.set(cam.target.x, cam.target.y, cam.target.z); } else { camera.position.x = 40; camera.position.y = 40; camera.position.z = 50; controls.target.set(0, 0, 0); } window.addEventListener( 'resize', onWindowResize, false ); } init3D(); function handle_recv_dynamic (r) { eval('physics = ' + r + ';'); update_dynamic_physics(); sleep(10) .then(() => ajax("GET", "/physics/dynamic/")) .then(handle_recv_dynamic); } (function init_dynamic_physics () { var colour = 0x4B5440; var material = new THREE.MeshLambertMaterial({color: colour, flatShading: true}); var meshes = {}; update_dynamic_physics = function () { var i, p, mesh; var to_del = {}; for (i in meshes) to_del[i] = true; for (i in physics) { p = physics[i]; mesh = meshes[p.id]; if (!mesh) { mesh = create_shapes(worldstate, 'Dynamic', p, material, layers.dynamic_collider); meshes[p.id] = mesh; } mesh.position.x = p.pos[0]; mesh.position.y = p.pos[1]; delete to_del[p.id]; } for (i in to_del) { mesh = meshes[i]; scene.remove(mesh); delete meshes[i]; } } })(); 


рд▓рдЧрднрдЧ рд╣рд░ рдЗрдХрд╛рдИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рднреМрддрд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЖрдВрджреЛрд▓рди рдХрд╛ рддрд░реНрдХ рд╣реИ, рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдШрдЯрдХ рд╣реИред рд╕рднреА рдШрдЯрдХреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ WorldState Table Editorред



рдЙрдкрд░реЛрдХреНрдд рдбреНрд░реЙрдкрдбрд╛рдЙрди рдореЗрдиреВ рдореЗрдВ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ, рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдВрдХрдбрд╝рд╛ рдЦреЗрд▓ рдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд: рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдпрд╛ рдЕрдиреНрдп рдЦреЗрд▓ рдЗрдХрд╛рдИ рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рдВрджреБ рддрдХ рддреЗрдЬреА рд╕реЗ рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд░реЗрдЧреА (рдХрднреА-рдХрднреА рд╣рдо playtests рдкрд░ рдордЬрд╝реЗ рдХрд░рддреЗ рд╣реИрдВ)ред

HTML рдЯреЗрдмрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореИрдЪ рдореЗрдВ рдбреЗрдЯрд╛ рдмрджрд▓рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓рд┐рдВрдХ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо, рдлрд╝реАрд▓реНрдб рдФрд░ рдирдпрд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ:

 function handle_edit (id, table_name, field_name, value) { var data = table_name + "\n" + field_name + "\n" + id + "\n" + value; ajax("POST", tableset_name + "/edit/", data); } 

рдЧреЗрдо рд╕рд░реНрд╡рд░ рд╡рд╛рдВрдЫрд┐рдд URL рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп, рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж:

 public static void RegisterEditorHandlers(Action<string, Func<string, string, string>> addHandler, string path, Func<TableSet> ts) { addHandler(path + "/data/", (p, b) => EditorPackJson(ts())); addHandler(path + "/edit/", (p, b) => EditorUpdate(ts(), b)); addHandler(path + "/ins/", (p, b) => EditorInsert(ts(), b)); addHandler(path + "/del/", (p, b) => EditorDelete(ts(), b)); addHandler(path + "/create/", (p, b) => EditorCreateEntity(ts(), b)); } 

рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ рдХреА рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреА рдкреВрд░реНрдгрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЪрдХреНрд░ рдХреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдЦреЗрд▓ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддрд╛рдХрд┐ рдЦреЗрд▓ рдЪрд┐рдХреЛрдЯреА рди рд╣реЛ рдФрд░ рджреБрдирд┐рдпрд╛ рдкрд┐рдЫрдбрд╝ рди рдЬрд╛рдПред



рдЧреНрд░рд╛рдл рдХрд╛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдЕрдХреНрд╖ рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрдирдкреБрдЯ рдмрдлрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдкреНрд▓реЗрдпрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдВрдЦреНрдпрд╛ 1. рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЕрд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдЗрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдирд┐рд░рдВрддрд░ рд╕рдорд╛рдпреЛрдЬрди рдХреЗ рдХрд╛рд░рдг, рдЧреНрд░рд╛рдл рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдирд┐рд╢рд╛рди рдХреЗ рддрддреНрдХрд╛рд▓ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рджреЛрд▓рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдЕрдиреБрд╕реВрдЪреА рддреЗрдЬреА рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдиреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдЦреЛ рджрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝реЗ рдореВрд▓реНрдп рддрдХ рдЧрд┐рд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЕрдЪрд╛рдирдХ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд╕рд╛рде рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

*****

рдЧреЗрдо рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдорд╛рд░реЗ рдореИрдЪ рдПрдбрд┐рдЯрд░ рдХреА рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдЧреЗрдо рдХреЗ рдХреНрд╖рдгреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдореИрдЪреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдареЗрд╕ рд▓рдЧрдиреЗ рдкрд░, рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдЕрдХреНрд╖рдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рд░реНрд╡рд░ рдФрд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдкрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдмрд╣реБрдд рд╣реА рдХрдо рд╕рдордп рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдИрд╕реАрдПрд╕ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рдВ, рд╕рд░реНрд╡рд░ рдХреЛ рдЖрдзреБрдирд┐рдХ рд╡реЗрдм-рдорд╛рдирдХреЛрдВ рдХреЗ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рджреИрдирд┐рдХ рдХрд╛рд░реНрдп рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рдбреАрдмрдЧрд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рднреА рдзреАрд░реЗ-рдзреАрд░реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдирдП рдЕрд╡рд╕рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi424267/


All Articles