
рд╣рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдЬреАрд╡рди рдореЗрдВ рдХреБрдЫ рдРрд╕реЗ рдкрд▓ рдЖрдП рдЬрдм рдЙрд╕рдиреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЦреЗрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдкрдирд╛ рджреЗрдЦрд╛ред рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрди рд╕рдкрдиреЛрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдЦреЗрд▓ рдЦреЗрд▓рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ (рдЬреНрдЮрд╛рди рдФрд░ рдЕрдиреБрднрд╡ рдХреЗ рдмрд┐рдирд╛ рднреА) рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреЛ рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ рдкреНрд░рд╕рд┐рджреНрдзрд┐ (рдФрд░ рднрд╛рд░реА рдореБрдирд╛рдлрд╛) рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдХреЗрд▓реЗ рдирд╛рдпрдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдЧреБрд░реБ igrostroya рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рд╡рд╣ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рдФрд░ рдирд╣реАрдВ ...
рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд░рд┐рдЪрдп
рдореИрдВ рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рдг рдХрд░реВрдВрдЧрд╛: рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдкреИрд╕рд╛ рдХрдорд╛рдирд╛ рдирд╣реАрдВ рд╣реИ - рд╣реИрдмреЗ рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд╣реИрдВред рдирд╣реАрдВ, рд╣рдо рдПрдХ рд╕рдкрдиреЗ рдХрд╛ рдЦреЗрд▓ рдмрдирд╛рдПрдВрдЧреЗред
рд╕рдкрдиреЛрдВ рдХреЗ рдЦреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧреЗрдп рд╡рд┐рд╖рдпрд╛рдВрддрд░рдореИрдВрдиреЗ рдПрдХрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдЫреЛрдЯреЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реЗ рдЗрд╕ рд╢рдмреНрдж рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рд╕реБрдирд╛ рд╣реИред рдЬрд╣рд╛рдБ рднреА рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рднреА рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдЗрдЧреНрд░реЛрдбреЗрд▓реЛрд╡ рдЕрдкрдиреЗ рд╕рдкрдиреЛрдВ рдФрд░ "рд╕рд╣реА рджреГрд╖реНрдЯрд┐" рдХреЛ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рдордиреЗ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рд╡реАрд░ рдкреНрд░рдпрд╛рд╕реЛрдВ, рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╡рд┐рддреНрддреАрдп рдХрдард┐рдирд╛рдЗрдпреЛрдВ, рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ "рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ-рдХреГрддрдШреНрди-рдХреБрддреНрддреЛрдВ- im- рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдмреЗ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рджреЗ-рдЧреНрд░рд╛рдл-рдПрдВрдб-рд╕рд┐рдХреНрдХреЛрдВ рдПрдВрдб-рдСрд▓-рдлреНрд░реА-рдПрдВрдб-рдПрдВрдб-рдСрдлрд╝-рдбреВ-рдЯреВ-рдбреВ-рдП-рдЧреЗрдо-рдП-рдЧреЗрдо-рдкрд╛рдЗрд░реЗрдЯреНрд╕-рдПрдВрдб-рд╡реА-рд╣реИ-рд▓реЙ-рдкреНрд░реЙрдлрд┐рдЯ-рдСрдлрд╝-рд╣рд┐рдпрд░-рдСрдлрд╝-рд╣рд┐рдпрд░-рдСрдлрд╝-рд╣рд┐рдпрд░ред "
рд▓реЛрдЧ, рдореВрд░реНрдЦ рдордд рдмрдиреЛред рдЖрдк рдПрдХ рд╕рдкрдиреЗ рдХрд╛ рдЦреЗрд▓ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЦреЗрд▓ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмреЗрдЪ рджреЗрдЧрд╛ - рдпреЗ рджреЛ рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВред рдЦрд┐рд▓рд╛рдбрд╝реА (рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд) рдЖрдкрдХреЗ рд╕рдкрдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рд▓рд╛рдн рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЕрдзреНрдпрдпрди рдХреЗ рд░реБрдЭрд╛рди, рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдм рдХреНрдпрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдХреБрдЫ рдЕрдиреЛрдЦрд╛ рдХрд░реЗрдВ, рдмреЗрд╣рддрд░ рдХрд░реЗрдВ, рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрд╕рд╛рдорд╛рдиреНрдп, рд▓реЗрдЦ рдкрдврд╝реЗрдВ (рдХрдИ рд╣реИрдВ), рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВ - рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдкрдиреЛрдВ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░реЗрдВ, рдЖрдкрдХрд╛ рдирд╣реАрдВред
рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ рднрд╛рдЧ рдирд╣реАрдВ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрднреА рднреА рдЕрдкрдиреЗ рд╕рдкрдиреЗ рдХреЗ рдЦреЗрд▓ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдн рдЫреЛрдбрд╝ рджреЗрдВред рдЕрдкрдиреЗ рд╕рдкрдиреЗ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рди рдмреЗрдЪреЗрдВ - рдореБрдлреНрдд рдореЗрдВ рдмрд╛рдВрдЯреЗрдВред рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдирд╛ рд╕рдкрдирд╛ рджреЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд╛рдПрдВ, рдФрд░ рдЕрдЧрд░ рдЖрдкрдХрд╛ рд╕рдкрдирд╛ рдХреБрдЫ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдЖрдк рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдпрджрд┐ рдкреИрд╕рд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкреНрдпрд╛рд░ рдФрд░ рдорд╛рдиреНрдпрддрд╛ред рдпрд╣ рдХрднреА-рдХрднреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрддрд╛ рд╣реИред
рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЦреЗрд▓ рд╕рдордп рдФрд░ рдКрд░реНрдЬрд╛ рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИ, рдФрд░ рдЧрдВрднреАрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХрддреНрд░ рд╣реБрдП рд▓реЛрдЧ рдЧрдВрднреАрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рднрд╛рдЧ рдореЗрдВ рд╕рд╣рдордд рд╣реИрдВ - рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЦреЗрд▓рддреЗ рд╣реИрдВ рддреЛ рдЦреЗрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЦреЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдИ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓рд╛рдн рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдкрдХреЛ рдЙрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ, рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЧреИрд░-рдЧреЗрдорд┐рдВрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╛ рдЦреБрдж рдХреЗ рдФрдЬрд╛рд░реЛрдВ рдХреЗ рдХреМрд╢рд▓ рдХреЛ рдЧрд╣рд░рд╛ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛), рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд░реЛрдорд╛рдВрдЪрдХ рдХрд╛рдо рдХрд░рдирд╛ред рдЕрдкрдиреЗ рджрдо рдкрд░ рдореИрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ (рдФрд░ рдмрд╣реБрдд рд╕реЗ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ) рдХрд┐ рдЦреЗрд▓ рд╡рд┐рдХрд╛рд╕ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд╕рдлрд▓) рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖, рдЕрддреБрд▓рдиреАрдп рдЕрдиреБрднрд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдлрд┐рд░ рд╕реЗ рд╡рд┐рд░рдХреНрддрд┐ рдФрд░ рдкреНрд░реЗрдо рдХреЗ рд╕рд╛рде рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдЬреАрд╡рди рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрднрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╣рдо рдирдП-рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреЗрдо рдЗрдВрдЬрди, рдлреНрд░реЗрдорд╡рд░реНрдХ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдЧреЗрдордкреНрд▓реЗ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЕрдВрджрд░ рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗред рд╣рдо рд▓рдЪреАрд▓реА рд╡рд┐рдХрд╛рд╕ рдкрджреНрдзрддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдХрд╛рдо рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣рдо рдзреНрд╡рдирд┐ рдореЗрдВ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ, рдХрд▓рд╛рдХрд╛рд░реЛрдВ, рд╕рдВрдЧреАрддрдХрд╛рд░реЛрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдФрд░ рдКрд░реНрдЬрд╛ рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рд╕рдм рдХреБрдЫ рдЦреБрдж рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╣рдо рд╕рдм рдХреБрдЫ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдХрд░реЗрдВрдЧреЗ - рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдЪрд╛рдирдХ рдПрдХ рдХрд▓рд╛рдХрд╛рд░ рд╣реИ, рддреЛ рд╣рдо рдлреИрд╢рдиреЗрдмрд▓ рдХреЛ рдЬрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рддреИрдпрд╛рд░ рдлреНрд░реЗрдо рдкрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕)ред рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреВрд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рд╣реА рдХреЛ рдЪреБрдирд╛ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдЙрд╕реА рдкрд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рдореЗрдВ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб (рдпрд╛ рдПрдХ рдХреЙрдлреА рдирд┐рд░реНрдорд╛рддрд╛) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред
тАЬрдЖрд╣ !!! рдЖрддрдВрдХ! рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛! рдРрд╕реЗ рдмрдХрд╡рд╛рд╕ рдкрд░ рдЖрдк рдХреИрд╕реЗ рд╕рдордп рдмрд┐рддрд╛ рд╕рдХрддреЗ рд╣реИрдВ! рдпрд╣рд╛рдБ рд╕реЗ рдЪрд▓реЗ рдЬрд╛рдУ, рдореИрдВ рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкрдврд╝рдиреЗ рдЬрд╛рдКрдБрдЧрд╛! "рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдХрд░реЗрдВ? рд░реЗрдбреАрдореЗрдб рдЧреЗрдо рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдм рдЦреЗрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд╕рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдорд╛рдирд╕рд┐рдХрддрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: тАЬрдореИрдВ рдПрдХ рдЦреЗрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ! рдорд╛рдВрд╕, рдФрд░ рд╡рд┐рд╕реНрдлреЛрдЯ, рдФрд░ рдкрдВрдкрд┐рдВрдЧ рд╣реЛрдВрдЧреЗ,
рдФрд░ рдЖрдк рдПрдХ рдХреЛрд░реЛрд╡рди рд▓реВрдЯ рд╕рдХрддреЗ рд╣реИрдВ , рдФрд░ рд╕рд╛рдЬрд┐рд╢ рдмрдордмрд╛рд░реА рдХрд░ рд░рд╣реА рд╣реИ, рдФрд░ рдпрд╣ рдХрд╣реАрдВ рдФрд░ рдХрднреА рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ! рдореИрдВ рдЕрднреА рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛! .. рдФрд░ рдХрд┐рд╕ рдкрд░? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХреНрдпрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ ... рд╣рд╛рдБ, рдПрдХреНрд╕, рд╡рд╛рдИ рдФрд░ рдЬреЗрдбред рдЪрд▓реЛ рдЬреЗрдб рд▓реЗрддреЗ рд╣реИрдВ, рдЕрдм рд╣рд░ рдХреЛрдИ рдЗрд╕ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ ... "ред рдФрд░ рдЗрдВрдЬрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдФрд░ рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИред рдлрд┐рдиред рдпрд╛, рдареАрдХ рд╣реИ, рдпрд╣ рд╣рд╛рд░ рдирд╣реАрдВ рдорд╛рдирддрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрдЬрди рдХреЛ рд╕реАрдЦреЗ рдмрд┐рдирд╛, рдпрд╣ рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рддрдм рд╡рд╣ рдХрд┐рд╕реА рдХреЛ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ "рд╢рд┐рд▓реНрдк" рдирд╣реАрдВ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╡рд┐рд╡реЗрдХ рд░рдЦрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдирд╣реАрдВ (рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреЛрд░ рдкрд░ рдЬрд╛рдПрдВ, рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ) - рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдореБрдирд╛рдлрд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╣рди рдХрд░рдиреЗ рдХреА рддрд╛рдХрдд рдирд╣реАрдВред рдПрдХ рдмрд╛рд░ рдЦреЗрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЙрддреНрд╕рд╛рд╣реА рд░рдЪрдирд╛рддреНрдордХ рд▓реЛрдЧреЛрдВ рдХреА рдмрд╣реБрдд рдХрдореА рдереАред рдХрд╛рд╢, рдЗрд╕ рд╕рдордп рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЕрдм рдЦреЗрд▓ рдореЗрдВ рдореБрдЦреНрдп рдЪреАрдЬ рдЖрддреНрдорд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╕рд╛рдп рдореЙрдбрд▓ (рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╕рд░рд▓ рд╣реИ: рд╣рдо рдЖрддреНрдорд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрдкрдХрд░рдг рд╕реЗ рд╕рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (рдХреЛрдИ рднреА рдХрд░реЗрдЧрд╛) рдФрд░ рдХрд╛рд░реНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рддреЛ, рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВред
рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдбрд╝рд╡реЗ рдЕрдиреБрднрд╡ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЧреЗрдо рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЖрдорддреМрд░ рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдкрд╡рд╛рдж рд╣реИрдВ), рдФрд░ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдкрд╡рд╛рдж рд╣реИрдВ)ред рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рджреБрд░реНрд▓рдн рдЧреЗрдо рдмрд╛рдИрдкрд╛рд╕ рд╣реИред рдХреНрдпрд╛ рдХрд░реЗрдВ?
рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
1. рдПрдХ рд╕рд░рд▓ рдЪрд┐рддреНрд░рдордп рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рдм рдХреБрдЫ рдбреНрд░рд╛ рдХрд░реЗрдВ
рдЦреЗрд▓ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ "рдЙрд╕реЗ рдорд╛рд░ рдбрд╛рд▓реЛ", 2003 2. рдПрдХ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рдм рдХреБрдЫ рдбреНрд░рд╛ рдХрд░реЗрдВ
рдЦреЗрд▓ "рд░реЗрд╡реЗрди", 2001 рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
рдЦреЗрд▓ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ "рдЗрдиреНрдлрд░реНрдиреЛ", 2002 3. рдПрдХ рдРрд╕реЗ рднрд╛рдИ рд╕реЗ рдкреВрдЫрд┐рдП рдЬреЛ рдпрд╣ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП (рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИ)
рдЦреЗрд▓ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ "рдХрдордмрдЦреНрдд", 2004 4. 3D-рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдЦреАрдВрдЪреЗрдВ
рдЦреЗрд▓ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ "рдХрдордмрдЦреНрдд 2. рдбреЗрдореЛ", 2006 5. рд╣рддрд╛рд╢рд╛ рдореЗрдВ, рд╕рд┐рд░ рдкрд░ рдмрд╛рд▓ рдлрд╛рдбрд╝рдХрд░
рдЦреЗрд▓ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ "рдХрдордмрдЦреНрдд", 2004 6. рдЫрджреНрдо рд╡рд┐рдЬреНрдЮрд╛рди (ASCII) рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рдм рдХреБрдЫ рдбреНрд░рд╛ рдХрд░реЗрдВ
рдЦреЗрд▓ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ "рдлреАрдлрд╛", 2000
рдЦреЗрд▓ "рд╕реВрдореЛ", 1998 рдХрд╛ тАЛтАЛрд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣рдореЗрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдкрд░ рднрд╛рдЧ рджреЗрдВ (рднрд╛рдЧ рдореЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рдХреА рдХреА рддрд░рд╣ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ)ред рдХрдИ рдЕрдиреБрднрд╡рд╣реАрди рдЧреЗрдорд░реНрд╕ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╢рд╛рдВрдд рдЖрдзреБрдирд┐рдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдЧреЗрдо рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХрд╛ рджрд┐рд▓ рдЬреАрддрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЧреЗрдо рдХрд╛ рдирд╛рдо рднреА рдЙрдиреНрд╣реЗрдВ рдЧреЗрдо рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
ADOM ,
NetHack рдФрд░
рдмреМрдиреЗ рдХрд┐рд▓реЗ рдЬреИрд╕реА рдЙрддреНрдХреГрд╖реНрдЯ рдХреГрддрд┐рдпреЛрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣рдореЗрд╢рд╛ рдирд┐рд░реНрдгрд╛рдпрдХ рдХрд╛рд░рдХ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ,
ASCII рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИ:
- рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЧреЗрдордкреНрд▓реЗ, рдЧреЗрдо рдореИрдХреЗрдирд┐рдХреНрд╕, рдкреНрд▓реЙрдЯ рдШрдЯрдХ рдФрд░ рдЕрдзрд┐рдХ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдорд╛рдореВрд▓реА рдЪреАрдЬреЛрдВ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реБрдП;
- рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ - рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк (рдпрд╛рдиреА, рдПрдХ рдРрд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд┐рд╕реЗ рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрдХ рд╣реИ) рдмрд╣реБрдд рдкрд╣рд▓реЗ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛;
- рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХ рдЗрдВрдЬрди рд╕реАрдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ;
- рдЖрдкрдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдореЗрдВ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдХрд┐ рдЖрдк рдЦреЗрд▓ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ;
- рдХрдЯреНрдЯрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЖрдкрдХреЗ рдЙрддреНрдкрд╛рдж рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдЙрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рднреА рдХрд░ рд╕рдХреЗрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдирд╣реАрдВ рд╣реИ;
- рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдВрдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рдмрд╛рдж рдореЗрдВ, рдмрд╛рдж рдореЗрдВ рдЙрдкрд╡рд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рд▓рдВрдмреЗ рдкрд░рд┐рдЪрдп рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдЗрдЧреНрд░реЛрдбреЗрд▓реЛрд╡ рдХреЛ рдЖрд╢рдВрдХрд╛рдУрдВ рдФрд░ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣реЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдерд╛, рдЪрд┐рдВрддрд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░реЛ рдФрд░ рдлрд┐рд░ рднреА рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛред рдХреНрдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рд╣реИрдВ? рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдХрджрдоред рд╡рд┐рдЪрд╛рд░
рдХреИрд╕реЗ? рдЕрднреА рднреА рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ?
рдХрдВрдкреНрдпреВрдЯрд░ рдмрдВрдж рдХрд░реЗрдВ, рдЦрд╛рдПрдВ, рдЪрд▓реЗрдВ, рд╡реНрдпрд╛рдпрд╛рдо рдХрд░реЗрдВред рдпрд╛ рд╕реЛ рдЬрд╛рдУ, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдкрд░ред рдПрдХ рдЦреЗрд▓ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЛ рдзреЛрдирд╛ рдирд╣реАрдВ рд╣реИ - рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдирд╣реАрдВ рдЖрддреА рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЦреЗрд▓ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдЪрд╛рдирдХ, рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдкреИрджрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдЕрдЪрд╛рдирдХ рд╣реБрдЖ, рддреЛ рдПрдХ рдкреЗрдВрд╕рд┐рд▓ рдХреЛ рддреЗрдЬреА рд╕реЗ рдкрдХрдбрд╝реЗрдВ рдФрд░ рддрдм рддрдХ рд▓рд┐рдЦ рджреЗрдВ рдЬрдм рддрдХ рд╡рд┐рдЪрд╛рд░ рдЙрдбрд╝ рди рдЬрд╛рдПред рдХрд┐рд╕реА рднреА рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдЖрдк рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдЦреЗрд▓ рдХреА рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рдирдХрд▓ред рдмреЗрд╢рдХ, рдмреЗрд╢рд░реНрдореА рд╕реЗ рдЖрдВрд╕реВ рди рдмрд╣рд╛рдПрдВ, рд╣рд░ рдХреЛрдиреЗ рдкрд░ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХрд┐рддрдиреЗ рд╕реНрдорд╛рд░реНрдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЖрдкрдХреЗ рд╕рдкрдиреЗ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рддрдирд╛ рдЕрд▓рдЧ рд░рд╣реЗрдЧрд╛, рдпрд╣ рдПрдХ рдЧреМрдг рдкреНрд░рд╢реНрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рдЧреЗрдорд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдпрд╣ рд╣реЛрддрд╛ рд╣реИ: рд╡реЗ рдЦреЗрд▓ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рджреЛ рдпрд╛ рддреАрди рдХрд╖реНрдЯрдкреНрд░рдж рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ ... рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЗ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рдирд╛ рдЖрдкрдХрд╛ рд╕рдкрдирд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдо рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ - рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдФрд░ рд╣рдордиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред рд╣рдорд╛рд░реА рдкрд╣рд▓реА рднрд╡реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдУрдмреНрд╕реАрдбрд┐рдпрди -
рдкрд╛рдердлрд╛рдЗрдВрдбрд░ рдПрдбрд╡реЗрдВрдЪрд░реНрд╕ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдЦреЗрд▓ рдХрд╛ рдПрдХ рдХреНрд▓реЛрди рдмрдирд╛рдПрдВрдЧреЗред
тАЬрдпрд╣ рдХреНрдпрд╛ рдореБрд╕реАрдмрдд рд╣реИ! рдХреЛрдИ рдЯреЗрдмрд▓? тАЭрдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ,
рдкреАрдХреНрд╡рд╛рдпреЛрдИ рдкреЗрд╕? рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдЦреЗрд▓ рдХреЛ рдПрдХ рд╕реЗ рдПрдХ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдмреБрдирд┐рдпрд╛рджреА рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдмрд╛рд░реА рдЖрдзрд╛рд░рд┐рдд рдмреЛрд░реНрдб рд╕рд╣рдХрд╛рд░реА рдЦреЗрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ:
- рдпрд╣ рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ рдЯрд╛рдЗрдорд░, рддреБрд▓реНрдпрдХрд╛рд▓рди, рдЕрдиреБрдХреВрд▓рди, рдПрдлрдкреАрдПрд╕ рдФрд░ рдЕрдиреНрдп рд╕реБрдирд╕рд╛рди рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ;
- рдпрд╣ рд╕рд╣рдХрд╛рд░реА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЦрд┐рд▓рд╛рдбрд╝реА рдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рд░реНрдзрд╛рд░рдХ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдкрд░реНрдпрд╛рд╡рд░рдг" рдХреЗ рдЦрд┐рд▓рд╛рдл - рдпрд╣ рдПрдЖрдИ ( рдПрдЖрдИ ) рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ - рдЦреЗрд▓ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдмрд╕реЗ рдХрдард┐рди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ;
- рдпрд╣ рд╕рд╛рд░реНрдердХ рд╣реИ - рдЯреЗрдмрд▓рдЯреЙрдк рдЖрдо рддреМрд░ рдкрд░ рд╕рдирдХреА рд▓реЛрдЧ рд╣реИрдВ, рд╡реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЗрд▓рддреЗ рд╣реИрдВ: рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдпрд╛рдВрддреНрд░рд┐рдХреА рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЧреЗрдордкреНрд▓реЗ рджреЗрдВ - рдЖрдк рдПрдХ рд╕реБрдВрджрд░ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓реЗрдВрдЧреЗ (рдпрд╣ рджреЛрд╕реНрддреЛрдВ рдХреЛ рдХреБрдЫ рджреЗрддрд╛ рд╣реИ, рдареАрдХ рд╣реИ?)ред
- рдпрд╣ рдХрдерд╛рдирдХ рдХреЗ рд╕рд╛рде рд╣реИ - рдХрдИ рдИ-рдЦрд┐рд▓рд╛рдбрд╝реА рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЦреЗрд▓ рдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╣рд╛рдиреА рдмрддрд╛рдиреА рдЪрд╛рд╣рд┐рдП - рдПрдХ рдХрд┐рддрд╛рдм рдХреА рддрд░рд╣, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдХрд▓рд╛рддреНрдордХ рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
- рд╡рд╣ рдордиреЛрд░рдВрдЬрдХ рд╣реИ, рдЬреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ - рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕реА рднреА рдмрд╛рдж рдХреЗ рд╕рдкрдиреЗ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рддрдирд╛ рднреА рд╣реЛред
рдирд┐рдпрдореЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп:рдкрд╛рдердлрд╛рдЗрдВрдбрд░ рдПрдбрд╡реЗрдВрдЪрд░реНрд╕ рдПрдХ рдмреЛрд░реНрдб рдХрд╛рд░реНрдб рдЧреЗрдо рдХрд╛ рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдПрдХ рдмреЛрд░реНрдб рд░реЛрд▓-рдкреНрд▓реЗрдЗрдВрдЧ рдЧреЗрдо (рдпрд╛ рдмрд▓реНрдХрд┐, рдПрдХ рд╕рдВрдкреВрд░реНрдг рд░реЛрд▓-рдкреНрд▓реЗрдЗрдВрдЧ рд╕рд┐рд╕реНрдЯрдо) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЦрд┐рд▓рд╛рдбрд╝реА (1 рд╕реЗ 6 рдХреА рд░рд╛рд╢рд┐ рдореЗрдВ) рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдЪрд░рд┐рддреНрд░ рдЪреБрдирддреЗ рд╣реИрдВ рдФрд░, рдЙрд╕рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░, рдПрдХ рд╕рд╛рд╣рд╕рд┐рдХ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рддреНрд░ рдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ (рдЬреИрд╕реЗ: рд╣рдерд┐рдпрд╛рд░, рдХрд╡рдЪ, рдордВрддреНрд░, рд╕рд╣рдпреЛрдЧреА, рд╡рд╕реНрддреБрдПрдВ, рдЖрджрд┐) рдХреЗ рдирд┐рдкрдЯрд╛рди рдХрд╛рд░реНрдб рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЙрд╕реЗ рд╕реНрдХреИрдВрдбрд▓рд░ рдХреЛ рдвреВрдВрдврдирд╛ рдФрд░ рдХреНрд░реВрд░рддрд╛рдкреВрд░реНрд╡рдХ рджрдВрдбрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡рд┐рд╢реЗрд╖ рдЧреБрдгреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдбред
рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХрдИ рд╕реНрдерд╛рди рдпрд╛ рд╕реНрдерд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ) рдЬрд┐рд╕реЗ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рддрд▓рд╛рд╢рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рди рдкрд░ рдХрд╛рд░реНрдбреЛрдВ рдХрд╛ рдПрдХ рдбреЗрдХ рд▓рдЧрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкрд╛рддреНрд░ рдЕрдкрдиреА рдмрд╛рд░реА рдореЗрдВ рдЦреЛрдЬрддреЗ рд╣реИрдВ - рдЕрд░реНрдерд╛рддреН, рд╡реЗ рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдб рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдбреЗрдХ рдХреЛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдХрд╛рд░реНрдбреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рдбреЗрдХ рдореЗрдВ рдмреБрд░реЗ рджреБрд╢реНрдорди рдФрд░ рдмрд╛рдзрд╛рдПрдВ рднреА рд╣реЛрддреА рд╣реИрдВ - рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд╛рдЬрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдХреИрдВрдбрд░ рдХрд╛рд░реНрдб рднреА рдбреЗрдХ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ - рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдбреНрд╕ рдХреЛ рд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ рдирдП рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдорд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ, рдЖрд░рдкреАрдЬреА, рд╢рдХреНрддрд┐, рдирд┐рдкреБрдгрддрд╛, рдЬреНрдЮрд╛рди, рдЖрджрд┐) рдХреЗ рдорд╛рдирдХ рдХреЛ рдорд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рди рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (d4 рд╕реЗ d12 рддрдХ), рд╕рдВрд╢реЛрдзрдХ (рдкрд░рд┐рднрд╛рд╖рд┐рдд) рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рдирд┐рдпрдо рдФрд░ рдЪрд░рд┐рддреНрд░ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╕реНрддрд░) рдФрд░ рд╣рд╛рде рд╕реЗ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдб рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВред рдЬреАрдд рдХреЗ рдмрд╛рдж, рдореЗрдЯ рдХрд╛рд░реНрдб рдХреЛ рдпрд╛ рддреЛ рдЧреЗрдо рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдпрд╣ рдПрдХ рджреБрд╢реНрдорди рд╣реИ) рдпрд╛ рдХрд┐рд╕реА рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╣рд╛рде (рдпрджрд┐ рдпрд╣ рдПрдХ рдЖрдЗрдЯрдо рд╣реИ) рдХреА рднрд░рдкрд╛рдИ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрд╛рд▓ рджреВрд╕рд░реЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкрд╛рд╕ рдЪрд▓реА рдЬрд╛рддреА рд╣реИред рд╣рд╛рд░рдиреЗ рдкрд░, рдЪрд░рд┐рддреНрд░ рдЕрдХреНрд╕рд░ рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдЕрдкрдиреЗ рд╣рд╛рде рд╕реЗ рдХрд╛рд░реНрдб рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдореИрдХреЗрдирд┐рдХ рдпрд╣ рд╣реИ рдХрд┐ рдЪрд░рд┐рддреНрд░ рдХрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЙрд╕рдХреЗ рдбреЗрдХ рдореЗрдВ рдХрд╛рд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ - рдЬреИрд╕реЗ рд╣реА рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдбреЗрдХ рд╕реЗ рдХрд╛рд░реНрдб рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдЪрд░рд┐рддреНрд░ рдорд░ рдЬрд╛рддрд╛ рд╣реИред
рд▓рдХреНрд╖реНрдп, рд╕реНрдерд╛рди рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ, рдмрджрдорд╛рд╢ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЙрд╕реЗ рд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рдкреАрдЫреЗ рд╣рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рдкрдврд╝рдХрд░ рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдЦреЗрд▓ рдХреА рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рд╣реИред рдЪрд╛рд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдЦреНрддреА рд╕реЗ рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдбреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЬреНрдЮрд╛рди рд▓рдХреНрд╖реНрдп рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдЪрддреБрд░ рддрдХрдиреАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдкреВрд░реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдкрд╛рддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдВрдЧреЗ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдВрдЧреЗ, рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирдП рдЙрдкрдпреЛрдЧреА рдХреМрд╢рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдбреЗрдХ рдХрд╛ рдкреНрд░рдмрдВрдзрди рднреА рдЦреЗрд▓ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрддреНрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдо (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ) рдЖрдорддреМрд░ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрдпрдирд┐рдд рдХрд╛рд░реНрдб (рдФрд░ рдмрд╣реБрдд рднрд╛рдЧреНрдп рдкрд░, рд▓реЗрдХрд┐рди рдЖрдк рдкрд╛рд╕рд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЦреЗрд▓ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдпреЛрдЧреНрдп рд╣реИ, рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ "рдореБрд╢реНрдХрд┐рд▓" рдХреЗ рдЕрд░реНрде рдореЗрдВ "рдореБрд╢реНрдХрд┐рд▓" рдХрд╣рддрд╛ рд╣реВрдВ) рдЗрд╕рдХреЗ рдХреНрд▓реЛрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрдЪрд╛рд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдХрд╛рд░реНрдб рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдордиреЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдХрд╛рд░реНрдбреНрд╕ рдХреЛ рдХреНрдпреВрдмреНрд╕ рд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗ, рдлрд┐рд░ рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдХрд╛рд░ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдХреЗ (рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрдирдХреЗ "рдХреНрдпреВрдмреНрд╕" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╣реА рд╣реЗрдХреНрд╕рд╛рдЧреЛрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЖрдХрд╛рд░ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ "рд╣рдбреНрдбрд┐рдпреЛрдВ" рдХрд╣рдирд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ) рдФрд░ рдпрд╣ рдЕрдкреНрд░рд┐рдп рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдореЗрд░рд┐рдХреА рдбреЗрдЬрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦрд░рд╛рдм рд╕реНрд╡рд╛рдж рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрдВ)ред рдЕрдм рдбреЗрдХ рдХреЗ рдмрдЬрд╛рдп рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рдмреИрдЧ рд╣реЛрдВрдЧреЗред рдФрд░ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдмреИрдЧ рднреА рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХреНрдпреВрдмреНрд╕ рдЦреАрдВрдЪреЗрдВрдЧреЗред рдШрди рдХрд╛ рд░рдВрдЧ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдоред рдЪрд░рд┐рддреНрд░ рдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ (рд╢рдХреНрддрд┐, рдирд┐рдкреБрдгрддрд╛, рдЖрджрд┐), рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдирдП рджрд┐рд▓рдЪрд╕реНрдк рдпрд╛рдВрддреНрд░рд┐рдХреА рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ (рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ)ред
рдХреНрдпрд╛ рдпрд╣ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬреЗрджрд╛рд░ рд╣реЛрдЧрд╛? рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдХреЛрдИ рднреА рдЗрд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЦреЗрд▓ рдХрд╛ рдЖрдирдВрдж рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд╛рд╕, рд╕рд╣реА рд╣реИ? рдЗрд╕рд▓рд┐рдП, рд╕рдлрд▓рддрд╛ рдХрд╛ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЪрд░рдг рджреЛ рдбрд┐рдЬрд╝рд╛рдЗрди
рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рдж рдХрд╣рд╛рдиреА рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рддрд┐рд╣рд╛рдИ рд╣реИред рдЕрдм рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣реА рд╣реИ, рдкрд╛рд░реНрдХ рдореЗрдВ рдЯрд╣рд▓реЗрдВ рдпрд╛ рд╕реНрдЯреАрдо рдмрд╛рде рди рд▓реЗрдВ, рдмрд▓реНрдХрд┐ рдЯреЗрдмрд▓ рдкрд░ рдмреИрдареЗрдВ, рдкреЗрди рд╕реЗ рдкреЗрдкрд░ рд▓реЗрдВ (рдпрд╛ рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рдЦреЛрд▓реЗрдВ) рдФрд░ рдзреНрдпрд╛рди рд╕реЗ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рд▓рд┐рдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдо рдореИрдХреЗрдирд┐рдХреНрд╕ рдХреЗ рд╣рд░ рдкрд╣рд▓реВ рдкрд░ рдзреНрдпрд╛рди рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдПрдХ рд╕рдлрд▓рддрд╛ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рдмреИрдардХ рдореЗрдВ рд▓реЗрдЦрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рди рдХрд░реЗрдВред рдФрд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреА рднреА рдЙрдореНрдореАрдж рди рдХрд░реЗрдВ - рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджреЗрдЦреЗрдВрдЧреЗ (рдФрд░ рдХрднреА-рдХрднреА рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдХрд┐рд╕реА рдЪреАрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдЖрдзрд╛рд░ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рднрд╡реНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдкрд╣рд▓реА рд▓рд╣рд░ рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕рд┐рд░ рдЙрдард╛рддреЗ рд╣реИрдВ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд░ рд╕реЗрдХрдВрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ)ред рдзреАрд░реЗ-рдзреАрд░реЗ, рдХрджрдо рд╕реЗ рдХрджрдо, рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд╛рд░реНрдердХ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдорд┐рд▓рддрд╛ рд╣реИ,
рдЬреИрд╕реЗ ред
рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдЙрд╕ рднрд╛рд╖рд╛ рдХреЛ рдЪреБрдиреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдЕрдХреЗрд▓реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрднреА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдЖрдкрдХреЗ рд╕рд┐рд░ рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕рднреА рд░рдЪрдирд╛рддреНрдордХ рдмрдХрд╡рд╛рд╕ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВред
рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЙрджреНрдзреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдХрдо рд╕реЗ рдХрдо рддрд┐рд░рдЫреЗ рдврдВрдЧ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдЙрдирдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд┐рд╡рд╛рд╕ рдХрд┐рдП рдмрд┐рдирд╛, рд╡рд╣рд╛рдБ рдкреНрд░рд╕реНрддреБрдд рд╢рд░реНрддреЛрдВ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реВрдВрдЧрд╛ред
тАЬрд▓реЗрдЦрдХ, рдЦреБрдж рдХреЛ рджреАрд╡рд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд╛рд░ рд▓реЛред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрддреНрд░ред тАЭрдЪрд░рдг рддреАрди рдореЛрдбрд▓рд┐рдВрдЧ
рдпрд╣реА рд╣реИ, рд╕рднреА рдПрдХ рд╣реА рдбрд┐рдЬрд╛рдЗрди, рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрддред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЖрдИрдбреАрдИ рдЦреЛрд▓рдиреЗ рдФрд░ рдХреЛрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдФрд░ рдзреИрд░реНрдп рд░рдЦреЗрдВред рдЬрдм рд╡рд┐рдЪрд╛рд░ рд╣рдорд╛рд░реЗ рд╕рд┐рд░ рдкрд░ рд╣рд╛рд╡реА рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреАрдмреЛрд░реНрдб рдХреЛ рдЫреВрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╣рд╛рде рдЖрдХрд╛рд╢-рдЙрдЪреНрдЪ рджреВрд░реА рдкрд░ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ - рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдХреЙрдлреА рдХреЛ рд╕реНрдЯреЛрд╡ рдкрд░ рдЙрдмрд╛рд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рд╣реИ ... рдХреВрдбрд╝реЗрджрд╛рди рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдХрдИ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ (рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреАрди рдШрдВрдЯреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓реЗрдЖрдЙрдЯ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирдП рд╕рд┐рд░реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ), рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдХреА рдореБрдЦреНрдп рд╕рдВрд░рдЪрдирд╛ (рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЪреВрдВрдХрд┐ рд╣рдо, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдУрдУрдкреА) рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдУрдУрдкреА рдХреЗ рд▓рд┐рдП рдмреЛрд░рд┐рдВрдЧ рдпреВрдПрдордПрд▓ рдЖрд░реЗрдЦреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред (рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐
рдпреВрдПрдордПрд▓ рдХреНрдпрд╛
рд╣реИ ? рдореИрдВ рднреА рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЦреБрд╢реА рдХреЗ рд╕рд╛рде рдпрд╛рдж рдХрд░реВрдВрдЧрд╛ - рдмрд╕ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ рдХрд┐рддрдирд╛ рдореЗрд╣рдирддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реВрдВ, рд╡рд╣ рд╣реВрдВред)
рдЪрд▓реЛ рдЙрдкрдпреЛрдЧ-рдХреЗрд╕ рдЖрд░реЗрдЦ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдЙрди рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд┐рддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдореЗрдВ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЦрд┐рд▓рд╛рдбрд╝реА) рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ:
рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ "рдЙрд╣ ... рдпрд╣ рд╕рдм рдХреНрдпрд╛ рд╣реИ?"рдмрд╕ рдордЬрд╛рдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд╕ рдордЬрд╛рдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ... рдФрд░, рд╢рд╛рдпрдж, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордЬрд╛рдХ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реВрдВ - рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рдорд╛рдорд▓рд╛ рд╣реИ (рдПрдХ рд╕рдкрдирд╛, рд╕рдм рдХреЗ рдмрд╛рдж)ред рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдЖрд░реЗрдЦ рдкрд░, рдЙрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдореЗрдВред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╣реБрдЖ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд┐рддреНрд░ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмреБрд░рд╛ рд╣реИ - рдзреИрд░реНрдп рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ред рдФрд░ рдЖрдкрдХреЛ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рд╣реИ - рд╣рдо рдбрд┐рдкреНрд▓реЛрдорд╛ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЗрддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЧреЗрдо рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдХрд┐ рджреГрд╢реНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЧреЗрдо рдореИрдХреЗрдирд┐рдХреНрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛ рддреЛ рдЧреНрд░рд╛рдлрд┐рдХ рдШрдЯрдХ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХреЛрдВ рдХреЗ рдЖрд░реЗрдЦ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХ рдпрд╣рд╛рдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдк-рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡реЗ рд╕рднреА рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдВрдЧреЗредрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реА рдЪрд░рдг рдореЗрдВ, рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдореБрдЦреНрдп рдЦреЗрд▓ рдЪрдХреНрд░ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ (рдпрд╛ рдмрд▓реНрдХрд┐, рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╣ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЖрд░реЗрдЦ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ:рдЕрдЧрд░ рдЖрдк рдЦрдбрд╝реЗ рд╣реИрдВ, рддреЛ рдмреИрда рдЬрд╛рдЗрдП рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЧреЗрдо рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛редрд░рд╛рдд рд▓рдВрдмреА рд╣реИ, рд╕реБрдмрд╣ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред рдЯреЗрдмрд▓ рдкрд░ рдмреИрдардиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдиреНрдп рджреЛ рджрд░реНрдЬрди рдЖрд░реЗрдЦреЛрдВ рдХреЛ рд╢рд╛рдВрддрд┐ рд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ - рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЖрдкрдХреЛ рдЪреБрдиреЗ рд╣реБрдП рдорд╛рд░реНрдЧ рдкрд░ рдмрдиреЗ рд░рд╣рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА, рдЕрдкрдиреЗ рдЖрддреНрдорд╕рдореНрдорд╛рди рдХреЛ рдмрдврд╝рд╛рдПрдЧреА, рдХрдорд░реЗ рдХреЗ рдЗрдВрдЯреАрд░рд┐рдпрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧреА, рд░рдВрдЧреАрди рдкреЛрд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡реЙрд▓рдкреЗрдкрд░ рд▓рдЯрдХрд╛рдПрдЧреА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдкрдиреА рджреГрд╖реНрдЯрд┐ рдХреЛ рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрддрд╛рдПрдЧреАред рд╕рд╛рдереА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬреЛ рдЬрд▓реНрдж рд╣реА рдбреНрд░рдо рдореЗрдВ рдЖрдкрдХреЗ рдирдП рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рджрд░рд╡рд╛рдЬреЗ рдкрд░ рднрд╛рдЧреЗрдВрдЧреЗ (рд╣рдо рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИрдВ, рдпрд╛рдж рд░рдЦреЗрдВ?)редрдЕрдм рддрдХ рд╣рдо рд╡рд░реНрдЧ рдЖрд░реЗрдЦреЛрдВ (рд╡рд░реНрдЧ) рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рдирд╕реЗ рд╣рдо рд╕рднреА рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдЯреВрдЯрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдФрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рддреАрди рд╕реНрдХреНрд░реАрди рдореЗрдВ рдЪрд┐рддреНрд░ рдирд╣реАрдВ рдЬреБрдбрд╝реЗрдВрдЧреЗред рдЙрдЪрд┐рдд рдЙрдкрддрдВрддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдкрд░ рдЗрд╕реЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдирд╛ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИредрдЪрд░рдг рдЪрд╛рд░ рдЙрдкрдХрд░рдг рдЪрдпрди
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рд╕рд╣рдорддрд┐ рд╣реИ, рд╣рдо рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рджреЛрдиреЛрдВ рдЪрд▓рддрд╛ рд╣реИред рд╣рдо рдЬрд╛рд╡рд╛ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдиреЗрдВрдЧреЗ, рдФрд░ рдХреЛрдЯрд▓рд┐рди рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдирдпрд╛ рдФрд░ рдирдпрд╛ рд╣реИ, рдФрд░ рдЕрднреА рддрдХ рдЙрд╕ рдЖрдХреНрд░реЛрд╢ рдХреА рд▓рд╣рд░реЛрдВ рдореЗрдВ рддреИрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХреЛ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рд╕рд╛рде рдмрд╣ рджрд┐рдпрд╛ рд╣реИ (рдЙрд╕реА рд╕рдордп рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ)ред рдЬреЗрд╡реАрдПрдо , рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣рд░ рдЬрдЧрд╣ рдЙрдкрд▓рдмреНрдз рд╣реИ (рддреАрди рдмрд┐рд▓рд┐рдпрди рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░, рд╣реЗ), рд╣рдо рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдпреВрдирд┐рдХреНрд╕ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдо рдПрд╕рдПрд╕рдПрдЪ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ)ред рдЕрдореАрд░ рд╣реЛрдиреЗ рдФрд░ рдХрд▓рд╛рдХрд╛рд░ рдХреЛ рдирд┐рдпреБрдХреНрдд рдХрд░рдиреЗ рдкрд░ рд╣рдо рдЗрд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХредрдкреБрд╕реНрддрдХрд╛рд▓рдп (рд╣рдо рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ) рд╣рдо рдЕрдкрдиреА рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЪреБрдиреЗрдВрдЧреЗред рд╣рдо рдорд╛рд╡реЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╛ рдЧреНрд░реЗрдбрд▓ред рдпрд╛ рд╕рднреА рдПрдХ рд╣реА, рдорд╛рд╡реЗрди, рдЪрд▓реЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рддреБрд░рдВрдд рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ (рдЬреЛ рднреА рдЖрдк рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ), рддрд╛рдХрд┐ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж рдЙрджрд╛рд╕реАрди рднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдпрд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдП рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рд╛рди рдерд╛ред IDE рдкрд░рд┐рдЪрд┐рдд, рдкрд╕рдВрджреАрджрд╛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рднреА рдЪреБрдирддреЗ рд╣реИрдВредрджрд░рдЕрд╕рд▓, рд╣рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЖрдк рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдЪрд░рдг рдкрд╛рдБрдЪ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
рдпрджрд┐ рдЖрдк рдПрдХ рдЖрдИрдбреАрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛ рддреБрдЪреНрдЫ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рд╣рдорд╛рд░реА рднрд╡рд┐рд╖реНрдп рдХреА рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реЛрдиреЛрд░рд╕ рдирд╛рдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдкрд╛рд╕рд╛ ) рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдорд╛рд╡реЗрди рд╕рдорд░реНрдерди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ
pom.xml
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВ:
<modelVersion>4.0.0</modelVersion> <groupId>my.company</groupId> <artifactId>dice</artifactId> <version>1.0</version> <packaging>jar</packaging>
рдХреЛрдЯрд▓рд┐рди рд╕рдорд░реНрдерди рднреА рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рд╣реИ:
<dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency>
рдФрд░ рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬреЛ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдПрдВрдЧреЗ:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <kotlin.version>1.3.20</kotlin.version> <kotlin.compiler.incremental>true</kotlin.compiler.incremental> </properties>
рд╣рд╛рдЗрдмреНрд░рд┐рдб рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдереЛрдбрд╝реА рдЬрд╛рдирдХрд╛рд░реАрдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬрд╛рд╡рд╛ рдФрд░ рдХреЛрдЯрд▓рд┐рди рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ
src/main/kotlin
, рдЖрдкрдХреЗ рдкрд╛рд╕
src/main/java
рдлрд╝реЛрд▓реНрдбрд░ рднреА рд╣реЛрдЧрд╛ред рдХреЛрдЯрд▓рд┐рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ (
*.kt
) рд╕реЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдлрд╝реЛрд▓реНрдбрд░ (
*.java
) рд╕реЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рд▓рд┐рдП рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдорд╛рдирдХ рдорд╛рд╡реЗрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрджрд▓ рджреЗрдВ:
<build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>process-sources</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/main/kotlin</sourceDir> <sourceDir>${project.basedir}/src/main/java</sourceDir> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/test/kotlin</sourceDir> <sourceDir>${project.basedir}/src/test/java</sourceDir> </sourceDirs> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <id>default-compile</id> <phase>none</phase> </execution> <execution> <id>default-testCompile</id> <phase>none</phase> </execution> <execution> <id>java-compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>java-test-compile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЗрд╕ рд╢реАрдЯ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓ рд░рд╣реА рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреА рдЬрд╛рддреА рд╣реИред
рдЖрдЗрдП рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рддреАрди рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВ (рдХреНрдпреЛрдВ рдХреБрдЫ рдХреЛ рд░реМрдВрджреЗрдВ?):
model
- рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ;game
- рдЧреЗрдордкреНрд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП;ui
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред
рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдореЗрдВ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╣рдо рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред рдЗрд╕ рдмреАрдЪ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдкреНрд░реЗ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдХрдВрдзреЗ рд╕реЗ рдХрдВрдзрд╛ рдорд┐рд▓рд╛рдХрд░ред
рддреБрд░рдВрдд рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВ: рдкреИрдХреЗрдЬ рдХреЗ рдирд╛рдореЛрдВ, рдЗрдВрдЯрд░рдлреЗрд╕, рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЛрдЪреЗрдВ; рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЖрдкрд╕ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкрд░рд╕реНрдкрд░ рд╕рдВрдкрд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ - рдпрд╣ рд╕рдм рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдХ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреА рд╣реИ, рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдмрджрд╕реВрд░рдд, рднрд╛рд░реА рд▓рдЧрдиреЗ рд▓рдЧреЗрдВрдЧреА, рдЖрдк рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рднрд╛рд╡реА рдФрд░ рдЬреИрд╕реЗ - рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдзреБрдирд┐рдХ рдЖрдИрдбреАрдИ рдореЗрдВ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╕реНрддрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред
рд╣рдо
main
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рднреА рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рд╣рдо рдорд╣рд╛рди рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдЖрдк рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдЖрдИрдбреАрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ (рдорд╛рдирдХ рдЖрдИрдбреАрдИ рдХрдВрд╕реЛрд▓ рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рдЗрд╕рд▓рд┐рдП рд╣рдо рдмреИрдЪ (рдпрд╛ рдпреВрдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╢реЗрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдиреНрдЪ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред рдлрд╝рд╛рдЗрд▓ред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧ рдХрд░реЗрдВрдЧреЗред
mvn package
рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕рднреА рд╕рдВрдХрд▓рд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде JAR рдЖрд░реНрдХрд╛рдЗрд╡ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдЕрдм рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдирдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ)ред рджреВрд╕рд░реЗ,
main
рд╡рд┐рдзрд┐ рд╕реЗ рдпреБрдХреНрдд рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдкрде рд╕рдВрдЧреНрд░рд╣ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо
java -jar dice-1.0.jar
рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ
java -jar dice-1.0.jar
рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
pom.xml
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ:
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>my.company.dice.MainKt</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдХреЛрдЯрд▓рд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдирд┐рд╣рд┐рдд (рдЬреИрд╕реЗ
main
рдХрд╛рд░реНрдп), рдХрдХреНрд╖рд╛рдПрдВ рд╡реИрд╕реЗ рднреА рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрд╡реАрдПрдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдирдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ)ред рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо
Kt
рд╕рд╛рде рдлрд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдЖрдкрдиреЗ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдореЗрди рд░рдЦрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ
MainKt.class
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рджреЛ рдЬрд╛рд░ рдлрд╛рдЗрд▓реЗрдВ
dice-1.0.jar
:
dice-1.0.jar
рдФрд░
dice-1.0-jar-with-dependencies.jar
ред рд╣рдо рджреВрд╕рд░реЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЙрдиреНрдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗред
dice.bat (рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП)
@ECHO OFF rem Compiling call "path_to_maven\mvn.bat" -f "path_to_project\Dice\pom.xml" package if errorlevel 1 echo Project compilation failed! & pause & goto :EOF rem Running java -jar path_to_project\Dice\target\dice-1.0-jar-with-dependencies.jar pause
dice.sh (UNIX рдХреЗ рд▓рд┐рдП)
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рд╕рдВрдХрд▓рди рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдЕрдВрддрд┐рдо рд╡реАрдгрд╛ рдХреЛ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реА рд╕рдлрд▓ рдЕрд╕реЗрдВрдмрд▓реА рд╕реЗ рдмрдЪреА рд╣реБрдИ рдлрд╝рд╛рдЗрд▓ (рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдЕрдВрддрд░ рднреА рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рддрд╛)ред рдЕрдХреНрд╕рд░, рдбреЗрд╡рд▓рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
mvn clean package
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░реА рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣рдореЗрд╢рд╛ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧреА (рднрд▓реЗ рд╣реА рд╕реНрд░реЛрдд рдХреЛрдб рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реЛ), рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ - рд╣рдореЗрдВ рдПрдХ рдЦреЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рддреЛ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдареАрдХ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рд╣рдо рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдареАрдХ рдХрд░ рд▓реЗрдВрдЧреЗред
рдЪрд░рдг рдЫрд╣ рдореБрдЦреНрдп рд╡рд╕реНрддреБрдПрдВ
рдзреАрд░реЗ-рдзреАрд░реЗ, рд╣рдо рдЧреЗрдордкреНрд▓реЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде
model
рдкреИрдХреЗрдЬ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред
рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдХреНрдпреВрдмреНрд╕ рд╣рдорд╛рд░реЗ рд╕рдм рдХреБрдЫ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдбрд╛рдИ (
Die
рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг) рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (рд░рдВрдЧ) рдФрд░ рдЖрдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдХреНрдпреВрдм рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрд▓рдЧ рдПрдиреНрдпреВрдорд░реЗрд╢рди (
Die.Type
)
Die.Type
, 4 рд╕реЗ 12 рддрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЖрдХрд╛рд░ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗред рд╣рдо
roll()
рд╡рд┐рдзрд┐ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрдпреВрдм (1 рд╕реЗ рдЖрдХрд╛рд░ рдорд╛рди рд╕рдорд╛рд╡реЗрд╢реА) рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕реАрдорд╛ рд╕реЗ рдПрдХ рдордирдорд╛рдирд╛, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред
рд╡рд░реНрдЧ
Comparable
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
Comparable
рдХреНрдпреВрдмреНрд╕ рдХреА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХреЗ (рдЙрдкрдпреЛрдЧреА рдмрд╛рдж рдореЗрдВ рдЬрдм рд╣рдо рдПрдХ рдЖрджреЗрд╢рд┐рдд рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рдХреНрдпреВрдмреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ)ред рдмрдбрд╝реЗ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдкрд╣рд▓реЗ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
class Die(val type: Type, val size: Int) : Comparable<Die> { enum class Type { PHYSICAL,
рдзреВрд▓ рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпреВрдмреНрд╕ рдХреЛ рд╣реИрдВрдбрдмреИрдЧ (
Bag
рдХреНрд▓рд╛рд╕ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмреИрдЧ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд▓рдЧрддрд╛ рд╣реИред рд╕реЗрдЯ (рд╕реЗрдЯ) рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ
equals()
рдФрд░
hashCode()
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐, рдХреНрдпреВрдмреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ - рд╣рдорд╛рд░реЗ рд╕реЗрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдорд╛рди рдХреНрдпреВрдмреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдХреНрдпреВрдм рдХреЛ рдмреИрдЧ рд╕реЗ рдмрд╛рд╣рд░ рдЦреАрдВрдЪрдХрд░, рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдиреЙрди-рдбрд┐рд╕реЗрдВрдЯрд┐рд╡ рди рд╣реЛ, рдмрд▓реНрдХрд┐ рд░реИрдВрдбрдо рд╣реЛред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ рдЖрджреЗрд╢рд┐рдд рд╕рдВрдЧреНрд░рд╣ (рд╕реВрдЪреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреЛрдИ рдирдпрд╛ рддрддреНрд╡ (
put()
рд╡рд┐рдзрд┐) рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдпрд╛ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (
draw()
рд╡рд┐рдзрд┐) рдореЗрдВ рдлреЗрд░рдмрджрд▓ рдХрд░рддреЗ рд╣реИрдВред
examine()
рд╡рд┐рдзрд┐ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрдм рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╕реЗ рдердХрд╛ рд╣реБрдЖ рдЦрд┐рд▓рд╛рдбрд╝реА рджрд┐рд▓реЛрдВ рдореЗрдВ рдореЗрдЬ рдкрд░ рдмреИрдЧ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рд┐рд▓рд╛рддрд╛ рд╣реИ (рдЫрдВрдЯрд╛рдИ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ), рдФрд░
clear()
рд╡рд┐рдзрд┐ - рдЕрдЧрд░ рд╣рд┐рд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреНрдпреВрдмреНрд╕ рдмреИрдЧ рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВред
open class Bag { protected val dice = LinkedList<Die>() val size get() = dice.size fun put(vararg dice: Die) { dice.forEach(this.dice::addLast) this.dice.shuffle() } fun draw(): Die = dice.pollFirst() fun clear() = dice.clear() fun examine() = dice.sorted().toList() }
рдХреНрдпреВрдмреНрд╕ рдХреЗ рд╕рд╛рде рдмреИрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдХреНрдпреВрдмреНрд╕ (
Pile
рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг) рдХреЗ рд╕рд╛рде рдвреЗрд░ рднреА рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рд╕реЗ, рджреВрд╕рд░реЗ рд╡рд╛рд▓реЗ рдЕрд▓рдЧ рд╣реИрдВ рдХрд┐ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдвреЗрд░ рд╕реЗ рдПрдХ рдбрд╛рдИ рд╣рдЯрд╛ рджреЗрдВ, рдЦрд┐рд▓рд╛рдбрд╝реА рдмреНрдпрд╛рдЬ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ
removeDie()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
class Pile : Bag() { fun removeDie(die: Die) = dice.remove(die) }
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдореБрдЦреНрдп рдкрд╛рддреНрд░реЛрдВ - рдирд╛рдпрдХреЛрдВ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдРрд╕реЗ рдЪрд░рд┐рддреНрд░ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЕрдм рдирд╛рдпрдХ рдХрд╣реЗрдВрдЧреЗ (рдЬрд╛рд╡рд╛ рдореЗрдВ
Character
рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ)ред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдг рд╣реИрдВ (рдЗрд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рдмреНрдж
class
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ), рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдХрд╛рдордХрд╛рдЬреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд▓реЗрдиреЗ рд╣реЛрдВрдЧреЗ:
рдмреНрд░реЙрд▓рд░ (рдЬреЛ рдХрд┐ рддрд╛рдХрдд рдФрд░ рддрд╛рдХрдд рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд▓рдбрд╝рд╛рдХреВ рд╣реИ) рдФрд░
рд╣рдВрдЯрд░ (рдЙрд░реНрдл рд░реЗрдВрдЬрд░ / рдЪреЛрд░, рдЬреЛрд░ рдХреЗ рд╕рд╛рде) рдирд┐рдкреБрдгрддрд╛ рдФрд░ рдЪреБрдкрдХреЗ)ред рдирд╛рдпрдХ рдХрд╛ рд╡рд░реНрдЧ рдЙрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ, рдХреМрд╢рд▓ рдФрд░ рдХреНрдпреВрдмреНрд╕ рдХреЗ рд╢реБрд░реБрдЖрддреА рд╕реЗрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдирд╛рдпрдХреЛрдВ рдХреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмрд╛рдВрдзрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдирдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдбрд┐рдЬрд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╛рдпрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧреБрдг рдЬреЛрдбрд╝реЗрдВрдЧреЗ: рдирд╛рдо, рдкрд╕рдВрджреАрджрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрдпреВрдм, рдХреНрдпреВрдм рд╕реАрдорд╛рдПрдВ, рдХреМрд╢рд▓ рд╕реАрдЦрд╛ рдФрд░ рдмрд┐рдирд╛ рдкрдврд╝реЗ, рд╣рд╛рде, рдмреИрдЧ рдФрд░ рд░реАрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдвреЗрд░ред рд╕рдВрдЧреНрд░рд╣ рдЧреБрдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╕рднреНрдп рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ, рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрд╡рд░реНрдб рдПрдХреНрд╕реЗрд╕ (рдПрдХ рдЧреЗрдЯреНрдЯрд░ рдХреА рдорджрдж рд╕реЗ) рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдмреБрд░рд╛ рд░реВрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдмреЗрдИрдорд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╡рд░реНрдЧ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдЗрди рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рд╣реИред рдЖрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ - рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
data class Hero(val type: Type) { enum class Type { BRAWLER HUNTER } var name = "" var isAlive = true var favoredDieType: Die.Type = Die.Type.ALLY val hand = Hand(0) val bag: Bag = Bag() val discardPile: Pile = Pile() private val diceLimits = mutableListOf<DiceLimit>() private val skills = mutableListOf<Skill>() private val dormantSkills = mutableListOf<Skill>() fun addDiceLimit(limit: DiceLimit) = diceLimits.add(limit) fun getDiceLimits(): List<DiceLimit> = Collections.unmodifiableList(diceLimits) fun addSkill(skill: Skill) = skills.add(skill) fun getSkills(): List<Skill> = Collections.unmodifiableList(skills) fun addDormantSkill(skill: Skill) = dormantSkills.add(skill) fun getDormantSkills(): List<Skill> = Collections.unmodifiableList(dormantSkills) fun increaseDiceLimit(type: Die.Type) { diceLimits.find { it.type == type }?.let { when { it.current < it.maximal -> it.current++ else -> throw IllegalArgumentException("Already at maximum") } } ?: throw IllegalArgumentException("Incorrect type specified") } fun hideDieFromHand(die: Die) { bag.put(die) hand.removeDie(die) } fun discardDieFromHand(die: Die) { discardPile.put(die) hand.removeDie(die) } fun hasSkill(type: Skill.Type) = skills.any { it.type == type } fun improveSkill(type: Skill.Type) { dormantSkills .find { it.type == type } ?.let { skills.add(it) dormantSkills.remove(it) } skills .find { it.type == type } ?.let { when { it.level < it.maxLevel -> it.level += 1 else -> throw IllegalStateException("Skill already maxed out") } } ?: throw IllegalArgumentException("Skill not found") } }
рдирд╛рдпрдХ рдХреЗ рд╣рд╛рде (рдЙрд╕ рд╕рдордп рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЬреЛ рдХреНрдпреВрдмреНрд╕ рд╣реИрдВ) рдПрдХ рдЕрд▓рдЧ рд╡рд╕реНрддреБ (
Hand
рдХреНрд▓рд╛рд╕) рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдореБрдЦреНрдп рд╣рд╛рде рд╕реЗ рд╕рдВрдмрджреНрдз рдХреНрдпреВрдмреНрд╕ рдХреЛ рдЕрд▓рдЧ рд░рдЦрдиреЗ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рд░реНрдгрдп рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдкрд╣рд▓реЗ рддреЛ рдпрд╣ рдПрдХ рд╕реБрдкрд░-рдХреВрд▓ рдлреАрдЪрд░ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЗрд╕рдиреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХреАрдВред рдлрд┐рд░ рднреА, рд╣рдо рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП
dice
рдФрд░
allies
рд╕реВрдЪрд┐рдпрд╛рдВ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдореЗрдВ рд╣реИрдВ, рдЙрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдЬреЛрдбрд╝рдиреЗ, рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ)ред рдЬрдм рдЖрдк рдЕрдкрдиреЗ рд╣рд╛рде рд╕реЗ рдПрдХ рдХреНрдпреВрдм рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рдж рдХреЗ рд╕рднреА рдХреНрдпреВрдмреНрд╕ рд╕реВрдЪреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЪрд▓реЗ рдЬрд╛рдПрдВрдЧреЗ, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рднрд░рддреЗ рд╣реБрдП - рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рдЦреЛрдЬ рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдПрдЧрд╛ (
null
рд╕рд╛рде рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)ред
class Hand(var capacity: Int) { private val dice = LinkedList<Die>() private val allies = LinkedList<Die>() val dieCount get() = dice.size val allyDieCount get() = allies.size fun dieAt(index: Int) = when { (index in 0 until dieCount) -> dice[index] else -> null } fun allyDieAt(index: Int) = when { (index in 0 until allyDieCount) -> allies[index] else -> null } fun addDie(die: Die) = when { die.type == Die.Type.ALLY -> allies.addLast(die) else -> dice.addLast(die) } fun removeDie(die: Die) = when { die.type == Die.Type.ALLY -> allies.remove(die) else -> dice.remove(die) } fun findDieOfType(type: Die.Type): Die? = when (type) { Die.Type.ALLY -> if (allies.isNotEmpty()) allies.first else null else -> dice.firstOrNull { it.type == type } } fun examine(): List<Die> = (dice + allies).sorted() }
DiceLimit
рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрдпреВрдмреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕реАрдорд╛
DiceLimit
рд╣реИ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд╛рдпрдХ рдХреЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рд╣рдо рд╢реБрд░реВ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдФрд░ рд╡рд░реНрддрдорд╛рди рдорд╛рдиред
class DiceLimit(val type: Die.Type, val initial: Int, val maximal: Int, var current: Int)
рд▓реЗрдХрд┐рди рдХреМрд╢рд▓ рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ (рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ) рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
рд╣рд┐рдЯ рдФрд░
рд╢реВрдЯ (рдХреНрд░рдорд╢рдГ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ)ред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХрддрдо рд╕реНрддрд░ рддрдХ рдХреМрд╢рд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ("рдкрдВрдк"), рдЬреЛ рдЕрдХреНрд╕рд░ рдкрд╛рд╕рд╛ рдХреЗ рд░реЛрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╢реЛрдзрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЧреБрдг
level
,
maxLevel
level
,
modifier1
рдФрд░
modifier2
рдореЗрдВ
maxLevel
рд╣реИред
class Skill(val type: Type) { enum class Type {
Hero
рд╡рд░реНрдЧ рдХреЗ рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд╛рде рд╕реЗ рдорд░рдиреЗ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдпрд╛ рд░реЛрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдирд╛рдпрдХ рдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреМрд╢рд▓ рд╣реИ, рдФрд░ рд╕реАрдЦрд╛ рдХреМрд╢рд▓ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрдврд╝рд╛рдПрдВ рдпрд╛ рдПрдХ рдирдпрд╛ рд╕реАрдЦреЗрдВред рдЗрди рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред
рдХреГрдкрдпрд╛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдбрд░реЛ рдордд, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдХрдИ рд╕реМ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИред рдпрд╣рд╛рдВ, рдХрд┐рд╕реА рднреА рдЧрдВрднреАрд░ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ - рд╣рдо рдЫреЛрдЯреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдзреАрд░реЗ-рдзреАрд░реЗ рдЧрддрд┐ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдПрдХ рдорд╣реАрдиреЗ рдореЗрдВ рд╣рдо рджрд╛рдпрд░реЗ рд╕реЗ рдШрдмрд░рд╛ рдЬрд╛рддреЗ рд╣реИрдВред рдордд рднреВрд▓реЛ, рд╣рдо рдЕрднреА рднреА рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╣реИрдВ - рд╣рдо рднрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
тАЬрдореБрдЭреЗ рдХреБрдЫ рдмреАрдорд╛рд░ рд╣реЛ рдЧрдпрд╛ред рдореБрдЭреЗ рдзреВрдореНрд░рдкрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдХреБрдЫ рдФрд░ ... "рдФрд░ рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред
рдорд╣рд╛рди рдФрд░ рднрдпрд╛рдирдХ рдЧреЗрдо рдореИрдХреЗрдирд┐рдХреНрд╕ - рдирд╛рдпрдХреЛрдВ рдФрд░ рдЙрдирдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рд░реЛрдзреА рддрд╛рдХрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ, рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдирд╛рдпрдХреЛрдВ рдХреЛ рдмрд╛рддрдЪреАрдд рдХрд░рдиреА рд╣реЛрддреА рд╣реИред
рдПрдХ рдФрд░ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рд╣рдорд╛рд░реЗ рдмрд╣рд╛рджреБрд░ рдирд╛рдпрдХ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрдпреВрдмреНрд╕ рдФрд░ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ: рдЦрд▓рдирд╛рдпрдХ (
Villain
рд╡рд░реНрдЧ), рджреБрд╢реНрдорди (
Enemy
рд╡рд░реНрдЧ) рдФрд░ рдмрд╛рдзрд╛рдПрдВ (
Obstacle
рд╡рд░реНрдЧ), рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж "рдЦрддрд░реЛрдВ" рдХреЗ рддрд╣рдд рдПрдХрдЬреБрдЯ рд╣реЛрддреЗ рд╣реИрдВ (
Threat
рдПрдХ рдЕрдореВрд░реНрдд "рд▓реЙрдХ" рд╡рд░реНрдЧ рд╣реИ, рдЗрд╕рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╛рд░рд┐рд╕реЛрдВ рдХреА рд╕реВрдЪреА рд╕рдЦреНрддреА рд╕реЗ рд╣реИред рд╕реАрдорд┐рдд)ред рдкреНрд░рддреНрдпреЗрдХ рдЦрддрд░реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ (
Trait
) рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЦрддрд░реЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧреЗрдордкреНрд▓реЗ рдореЗрдВ рд╡рд┐рд╡рд┐рдзрддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
sealed class Threat { var name: String = "" var description: String = "" private val traits = mutableListOf<Trait>() fun addTrait(trait: Trait) = traits.add(trait) fun getTraits(): List<Trait> = traits } class Obstacle(val tier: Int, vararg val dieTypes: Die.Type) : Threat() class Villain : Threat() class Enemy : Threat() enum class Trait { MODIFIER_PLUS_ONE,
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
Trait
рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд (
MutableList
) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп
List
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдпрд╣ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдХреЛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ - рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рд╣реИ (рдЬрд╣рд╛рдВ
List
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИ)ред рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╡рд┐рдЪрд┐рддреНрд░ рддрд░реАрдХрд╛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реИ:
fun getTraits(): List<Trait> = Collections.unmodifiableList(traits)
рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдореЗрдВ рдЗрддрдиреЗ рд▓рд╛рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ (рдЖрдк, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреЗрддрд╛рд╡рдиреА рджреА рдЧрдИ рд╣реИ)ред
рдЦреЗрд▓ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг,
Obstacle
рдХреНрд╖реЗрддреНрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдкрдиреЗ рд╕рдордХрдХреНрд╖реЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдзрдордХреА рдХрд╛рд░реНрдб (рдФрд░ рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпреЗ рдХрд╛рд░реНрдб рд╣реИрдВ)
Deck
рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рдбреЗрдХ рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд╣реИрдВ:
class Deck<E: Threat> { private val cards = LinkedList<E>() val size get() = cards.size fun addToTop(card: E) = cards.addFirst(card) fun addToBottom(card: E) = cards.addLast(card) fun revealTop(): E = cards.first fun drawFromTop(): E = cards.removeFirst() fun shuffle() = cards.shuffle() fun clear() = cards.clear() fun examine() = cards.toList() }
рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХрдХреНрд╖рд╛ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдЖрджреЗрд╢рд┐рдд рд╕реВрдЪреА (рдпрд╛ рдмрд▓реНрдХрд┐ рджреЛ-рддрд░рдлрд╛ рдХрддрд╛рд░) рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╢рддреНрд░реБрдУрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреА рдбреЗрдХ рдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдм рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ...
...
Location
рд╡рд░реНрдЧ рдореЗрдВ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЗрд▓рд╛рдХреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдирд╛рдпрдХреЛрдВ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред
class Location { var name: String = "" var description: String = "" var isOpen = true var closingDifficulty = 0 lateinit var bag: Bag var villain: Villain? = null lateinit var enemies: Deck<Enemy> lateinit var obstacles: Deck<Obstacle> private val specialRules = mutableListOf<SpecialRule>() fun addSpecialRule(rule: SpecialRule) = specialRules.add(rule) fun getSpecialRules() = specialRules }
рдкреНрд░рддреНрдпреЗрдХ рдЗрд▓рд╛рдХреЗ рдХрд╛ рдирд╛рдо, рд╡рд┐рд╡рд░рдг, рдмрдВрдж рд╣реЛрдиреЗ рдХреА рдХрдард┐рдирд╛рдИ рдФрд░ "рдЦреБрд▓рд╛ / рдмрдВрдж" рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИред рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЦрд▓рдирд╛рдпрдХ рджреБрдмрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдпрд╣ рдЧреБрдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк
villain
рд╕рдВрдкрддреНрддрд┐
null
рд╣реЛ рд╕рдХрддреА рд╣реИ)ред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреНрдпреВрдмреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдмреИрдЧ рдФрд░ рдЦрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдб рдХрд╛ рдПрдХ рдбреЗрдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд╖реЗрддреНрд░ рдХреА рдЕрдкрдиреА рдЕрдиреВрдареА рдЧреЗрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ (рд╡рд┐рд╢реЗрд╖
SpecialRule
) рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬреЛ рдЦрддрд░реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреА рддрд░рд╣, рдЧреЗрдордкреНрд▓реЗ рдореЗрдВ рд╡рд┐рд╡рд┐рдзрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рд░рдЦ рд░рд╣реЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╣рдо рдЗрд╕реЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рди рдХрд░реЗрдВ (рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдореЙрдбрд▓рд┐рдВрдЧ рдЪрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ (
Scenario
рд╡рд░реНрдЧ):
class Scenario { var name = "" var description = "" var level = 0 var initialTimer = 0 private val allySkills = mutableListOf<AllySkill>() private val specialRules = mutableListOf<SpecialRule>() fun addAllySkill(skill: AllySkill) = allySkills.add(skill) fun getAllySkills(): List<AllySkill> = Collections.unmodifiableList(allySkills) fun addSpecialRule(rule: SpecialRule) = specialRules.add(rule) fun getSpecialRules(): List<SpecialRule> = Collections.unmodifiableList(specialRules) }
рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдЯрд╛рдЗрдорд░ рдХреЗ рд╕реНрддрд░ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛,
specialRules
(рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо) рдФрд░ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рдХреМрд╢рд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рд╣рдо рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЪреВрдХ рдЬрд╛рдПрдВрдЧреЗ)ред рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реНрдерд╛рдиреЛрдВ (
Location
рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ) рдХреА рдПрдХ рд╕реВрдЪреА рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░, рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдо рдХрд╣реАрдВ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдХреЛрдИ рддрдХрдиреАрдХреА рд▓рд╛рдн рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдм рддрдХ рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рднреА рд╡рд░реНрдЧ
model
рдкреИрдХреЗрдЬ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВ - рд╣рдо, рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдЦрд┐рд▓реМрдирд╛ рд▓рдбрд╝рд╛рдИ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, рдореЗрдЬ рдХреА рд╕рддрд╣ рдкрд░ рд╕реИрдирд┐рдХреЛрдВ рдХреЛ рд░рдЦрд╛ред
рдФрд░ рдЕрдм, рдХреБрдЫ рджрд░реНрджрдирд╛рдХ рдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж, рдХрдорд╛рдВрдбрд░-рдЗрди-рдЪреАрдл рдХреЗ рд╕рдВрдХреЗрдд рдкрд░, рд╣рдо рдЕрдкрдиреЗ рдЦрд┐рд▓реМрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдзрдХреЗрд▓рдиреЗ рдФрд░ рдЧреЗрдордкреНрд▓реЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдбрд╝рд╛рдИ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ред"рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ ..."рд╕рд╛рддрд╡рд╛рдБ рдЪрд░рдгред рдкреИрдЯрд░реНрди рдФрд░ рдЬреЗрдирд░реЗрдЯрд░
рдЖрдЗрдП рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдорд╛рдиреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрдпрд╛ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рди (рдЗрд▓рд╛рдХрд╝рд╛)ред рд╣рдореЗрдВ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ Location
, рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░реЗрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЗрд▓рд╛рдХреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдЦреЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ: рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдмреИрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рднреА рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдмреИрдЧ рдореЗрдВ рдХреНрдпреВрдмреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ - рдпреЗ рднреА рдЗрд╕реА рд╡рд░реНрдЧ ( Die
) рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ ред рдпрд╣ рдореИрдВ рджреБрд╢реНрдордиреЛрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдЙрдиреНрд╣реЗрдВ рдЖрдорддреМрд░ рдкрд░ рдбреЗрдХ рдореЗрдВ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЦрд▓рдирд╛рдпрдХ рдЦреБрдж рдЗрд▓рд╛рдХреЗ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред рдЦреИрд░, рдЖрдк рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ: val location = Location().apply { name = "Some location" description = "Some description" isOpen = true closingDifficulty = 4 bag = Bag().apply { put(Die(Die.Type.PHYSICAL, 4)) put(Die(Die.Type.SOMATIC, 4)) put(Die(Die.Type.MENTAL, 4)) put(Die(Die.Type.ENEMY, 6)) put(Die(Die.Type.OBSTACLE, 6)) put(Die(Die.Type.VILLAIN, 6)) } villain = Villain().apply { name = "Some villain" description = "Some description" addTrait(Trait.MODIFIER_PLUS_ONE) } enemies = Deck<Enemy>().apply { addToTop(Enemy().apply { name = "Some enemy" description = "Some description" }) addToTop(Enemy().apply { name = "Other enemy" description = "Some description" }) shuffle() } obstacles = Deck<Obstacle>().apply { addToTop(Obstacle(1, Die.Type.PHYSICAL, Die.Type.VERBAL).apply { name = "Some obstacle" description = "Some Description" }) } }
рдпрд╣ рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рднреА рдзрдиреНрдпрд╡рд╛рдж рд╣реИ apply{}
- рдЬрд╛рд╡рд╛ рдореЗрдВ, рдХреЛрдб рджреБрдЧреБрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рд╕реНрдерд╛рди рд╣реЛрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХрд╣рд╛, рдФрд░ рдЙрдирдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд░рд┐рджреГрд╢реНрдп, рд░реЛрдорд╛рдВрдЪ рдФрд░ рдирд╛рдпрдХ рднреА рд╣реИрдВ рдЬрд┐рдирдХреЗ рдХреМрд╢рд▓ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЧреЗрдо рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░рдирд╛ рд╣реИредрд▓реЗрдХрд┐рди рдЧреЗрдо рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрд╣рд╛рдВ, рдХреЛрдИ рднреА рд╕рдХреНрд╖рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЖрдкрддреНрддрд┐ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рддрд╛рдХрд┐ рдмрд╛рдж рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреВрд░реНрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдбреНрд░рд╛рдЗрдВрдЧ рдкреНрд▓рд╛рдВрдЯ рд╕реЗ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд┐рддреНрд░ рднреА рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реЗ рдкреИрдЯрд░реНрди рд╣реЛрдиреЗ рд╕реЗ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб (рдЬрдирд░реЗрдЯрд░) рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдореЙрдбрд▓ рд╕реЗ рдЕрдВрддрд┐рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛редрдХрд┐рд╕реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рджреЛ рдирдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЬрдирд░реЗрдЯрд░ рд╡рд░реНрдЧред рдФрд░ рдЬрдм рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рднреНрдп рд░рд╛рд╢рд┐ рдЬрдорд╛ рд╣реБрдИ рд╣реИ, рддреЛ рдХрдИ рд╕рдВрд╕реНрдерд╛рдПрдВ рднреА рд╣реЛрдВрдЧреА ... рдЕрд╢реЛрднрдиреАрдп:рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдХреГрдкрдпрд╛ рдЧрд╣рд░реА рд╕рд╛рдВрд╕ рд▓реЗрдВ, рдзреНрдпрд╛рди рд╕реЗ рд╕реБрдиреЗрдВ рдФрд░ рд╡рд┐рдЪрд▓рд┐рдд рди рд╣реЛрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрд░реЗрдЦ рдЧреЗрдо рдХреА рджреБрдирд┐рдпрд╛ рдХреА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореБрдЦреНрдп рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкрд╣рд▓реЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рджреВрд╕рд░реЗ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░реНрдХрд┐рдЯ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рдЖрд░реЗрдЦреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХреБрдЫ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛редрдЖрдЗрдП рдХреБрдЫ рд╕рд░рд▓ - рдЙрддреНрдкрд╛рджрдХ рдХреНрдпреВрдмреНрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред "рдХреИрд╕реЗ? - рдЖрдк рдХрд╣рддреЗ рд╣реИрдВред - рдХреНрдпрд╛ рд╣рдо рдкрд░реНрдпрд╛рдкреНрдд рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИрдВ? рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реИред тАЭ рдирд╣реАрдВ, рдореИрдВ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдирд┐рдпрдореЛрдВ рдХреЛ рдкрдврд╝реЗрдВ), рдХреНрдпреВрдмреНрд╕ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд░рд╛рд╢рд┐ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: "рдпрд╛ рддреЛ рдиреАрд▓реЗ рдпрд╛ рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рдПрдХ рд╕реЗ рддреАрди рдХреНрдпреВрдмреНрд╕ рд╕реЗ")ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдХрд╛рд░ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕реНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ DieTypeFilter
ред interface DieTypeFilter { fun test(type: Die.Type): Boolean }
рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣ рдЬрд╛рдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдХреНрдпреВрдм рдкреНрд░рдХрд╛рд░ рдирд┐рдпрдореЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдХреЛрдИ рднреА рдЬреЛ рдХреЗрд╡рд▓ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд╛рд╣реЗ рдкреНрд░рдХрд╛рд░ рдХрдбрд╝рд╛рдИ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдп ("рдиреАрд▓рд╛") рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХреА рд╢реНрд░реЗрдгреА ("рдиреАрд▓рд╛, рдкреАрд▓рд╛ рдпрд╛ рд╣рд░рд╛") рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛ; рдпрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рджрд┐рдП рдЧрдП рдПрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ ("рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдлреЗрдж рдирд╣реАрдВ рд╣реИ" - рдХреБрдЫ рднреА, рдмрд╕ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ - рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдЗрд╕ рд╕реЗ рдирд╣реАрдВ рдЯреВрдЯреЗрдЧрд╛ (рдмрд╣реБрд░реВрдкрддрд╛, рдпрд╛рдж рд░рдЦреЗрдВ?)ред class SingleDieTypeFilter(val type: Die.Type): DieTypeFilter { override fun test(type: Die.Type) = (this.type == type) } class InvertedSingleDieTypeFilter(val type: Die.Type): DieTypeFilter { override fun test(type: Die.Type) = (this.type != type) } class MultipleDieTypeFilter(vararg val types: Die.Type): DieTypeFilter { override fun test(type: Die.Type) = (type in types) } class InvertedMultipleDieTypeFilter(vararg val types: Die.Type): DieTypeFilter { override fun test(type: Die.Type) = (type !in types) }
рдХреНрдпреВрдм рдХрд╛ рдЖрдХрд╛рд░ рднреА рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред рдЗрд╕ рдмреАрдЪ, рд╣рдо рдПрдХ рдХреНрдпреВрдмреНрд╕ рдЬрдирд░реЗрдЯрд░ ( DieGenerator
) рд▓рд┐рдЦреЗрдВрдЧреЗ , рдЬреЛ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд Die
, рдХреНрдпреВрдм рдХреЗ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рд╕реНрддрд░ред private val DISTRIBUTION_LEVEL1 = intArrayOf(4, 4, 4, 4, 6, 6, 6, 6, 8) private val DISTRIBUTION_LEVEL2 = intArrayOf(4, 6, 6, 6, 6, 8, 8, 8, 8, 10) private val DISTRIBUTION_LEVEL3 = intArrayOf(6, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12) private val DISTRIBUTIONS = arrayOf( intArrayOf(4), DISTRIBUTION_LEVEL1, DISTRIBUTION_LEVEL2, DISTRIBUTION_LEVEL3 ) fun getMaxLevel() = DISTRIBUTIONS.size - 1 fun generateDie(filter: DieTypeFilter, level: Int) = Die(generateDieType(filter), generateDieSize(level)) private fun generateDieType(filter: DieTypeFilter): Die.Type { var type: Die.Type do { type = Die.Type.values().random() } while (!filter.test(type)) return type } private fun generateDieSize(level: Int) = DISTRIBUTIONS[if (level < 1 || level > getMaxLevel()) 0 else level].random()
рдЬрд╛рд╡рд╛ рдореЗрдВ, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕реНрдерд┐рд░ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдХреЛрдЯрд▓рд┐рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЕрдиреНрдп рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рд╣реИ (рдлрд┐рд░ рднреА, рддрд╛рд░реНрдХрд┐рдХ рд╕реНрддрд░ рдкрд░, рд╣рдо рдЕрднреА рднреА рдХрдХреНрд╖рд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ)редрджреЛ рдирд┐рдЬреА рддрд░реАрдХреЗ рдЕрд▓рдЧ рд╕реЗ рдХреНрдпреВрдм рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ - рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдзрд┐ generateDieType()
рдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рдХрд░рдХреЗ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ override fun test(filter: DieTypeFilter) = false
(рд▓реЗрдЦрдХреЛрдВ рдХрд╛ рджреГрдврд╝ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдФрд░ рдХрдерд╛рдирдХ рдХреЗ рдЫрд┐рджреНрд░реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдкрд╛рддреНрд░ рд╕реНрд╡рдпрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдиреА рдХреЗ рджреМрд░рд╛рди рджрд░реНрд╢рдХреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ)ред рд╡рд┐рдзрд┐ generateDieSize()
рдПрдХ рд╕рд░рдгреА (рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдПрдХ) рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рддрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред рдЬрдм рдореЗрд░реЗ рдмреБрдврд╝рд╛рдкреЗ рдореЗрдВ рдореИрдВ рдЕрдореАрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдмрд╣реБрд░рдВрдЧреА рдЦреЗрд▓ рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреНрдпреВрдмреНрд╕ рдХрд╛ рдПрдХ рдкреИрдХреЗрдЯ рдЦрд░реАрджрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдкрд╛рд╕рд╛ рдирд╣реАрдВ рдЦреЗрд▓ рдкрд╛рдКрдВрдЧрд╛ , рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рдЙрдирд╕реЗ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдПрдХ рдмреИрдЧ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реВрдВ (рдкрдбрд╝реЛрд╕реА рд╕реЗ рдкреВрдЫрдиреЗ рдФрд░ рдЗрд╕ рд╕рдордп рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред рдпрд╣ рдХрд╛рд░реНрдб рдХрд╛ рдПрдХ рдбреЗрдХ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЙрд▓реНрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рддрдВрддреНрд░ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ (рдФрд░ рдЙрд╕реЗ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдкрдврд╝рдиреЗ рдХрд╛ рдзреИрд░реНрдп рдерд╛), рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВредрдФрд░ рдЬрдм рд╕реЗ рд╣рдо рдмреИрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЖрдкрдХреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ ( BagTemplate
) рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдореЛрдВ (рдпрд╛ Plan
) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреНрдпреВрдмреНрд╕ (рдкрд╣рд▓реЗ рдХреА рдЧрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ?) рдмреИрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред class BagTemplate { class Plan(val minQuantity: Int, val maxQuantity: Int, val filter: DieTypeFilter) val plans = mutableListOf<Plan>() fun addPlan(minQuantity: Int, maxQuantity: Int, filter: DieTypeFilter) { plans.add(Plan(minQuantity, maxQuantity, filter)) } }
рдкреНрд░рддреНрдпреЗрдХ рдпреЛрдЬрдирд╛ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рд╕рд╛рде рд╣реА рдХреНрдпреВрдмреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо) рдЬреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреА рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рд╡рд┐рдЪрд┐рддреНрд░ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмреИрдЧ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдмреБрдврд╝рд╛рдкреЗ рдХреЗ рд▓рд┐рдП рдлреВрдЯ рдлреВрдЯ рдХрд░ рд░реЛрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрдбрд╝реЛрд╕реА рдиреЗ рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рд╣реИ)ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣: private fun realizePlan(plan: BagTemplate.Plan, level: Int): Array<Die> { val count = (plan.minQuantity..plan.maxQuantity).shuffled().last() return (1..count).map { generateDie(plan.filter, level) }.toTypedArray() } fun generateBag(template: BagTemplate, level: Int): Bag { return template.plans.asSequence() .map { realizePlan(it, level) } .fold(Bag()) { b, d -> b.put(*d); b } } }
рдпрджрд┐ рдЖрдк, рдореЗрд░реА рддрд░рд╣, рдпрд╣ рд╕рдм рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛ рд╕реЗ рдердХ рдЧрдП рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЬрдХрдбрд╝реЗрдВ - рдпрд╣ рдХреЗрд╡рд▓ рдмрджрддрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрдИ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЪрддреБрд░ рддрд░реАрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИредрдЕрдкрдиреЗ рдЖрдк рд╕реЗ, рдмреИрдЧ рдореИрджрд╛рди рдкрд░ рдЭреВрда рдирд╣реАрдВ рдмреЛрд▓реЗрдВрдЧреЗ - рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдирд╛рдпрдХреЛрдВ рдФрд░ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред interface LocationTemplate { val name: String val description: String val bagTemplate: BagTemplate val basicClosingDifficulty: Int val enemyCardsCount: Int val obstacleCardsCount: Int val enemyCardPool: Collection<EnemyTemplate> val obstacleCardPool: Collection<ObstacleTemplate> val specialRules: List<SpecialRule> }
рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдореЗрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп, get()
рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреИрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕рдВрдкрддреНрддрд┐ basicClosingDifficulty
рдЗрд▓рд╛рдХреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреА рдореВрд▓ рдЬрдЯрд┐рд▓рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧреАред рдпрд╣рд╛рдВ "рдореВрд▓" рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдЬрдЯрд┐рд▓рддрд╛ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреА рдФрд░ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ (рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЦрд▓рдирд╛рдпрдХ) рдХреЗ рд▓рд┐рдП рдкреИрдЯрд░реНрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреБрд╢реНрдордиреЛрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ рд╕реЗ, рд╕рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореВрд▓реНрдп рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо ( SpecialRule
) рдПрдХ рд╕рд░рд▓ рдЧрдгрдирд╛ ( enum class
) рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ , рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред interface EnemyTemplate { val name: String val description: String val traits: List<Trait> } interface ObstacleTemplate { val name: String val description: String val tier: Int val dieTypes: Array<Die.Type> val traits: List<Trait> } interface VillainTemplate { val name: String val description: String val traits: List<Trait> }
рдФрд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ рди рдХреЗрд╡рд▓ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рджреЗрдВ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдбреЗрдХ рднреАред fun generateVillain(template: VillainTemplate) = Villain().apply { name = template.name description = template.description template.traits.forEach { addTrait(it) } } fun generateEnemy(template: EnemyTemplate) = Enemy().apply { name = template.name description = template.description template.traits.forEach { addTrait(it) } } fun generateObstacle(template: ObstacleTemplate) = Obstacle(template.tier, *template.dieTypes).apply { name = template.name description = template.description template.traits.forEach { addTrait(it) } } fun generateEnemyDeck(types: Collection<EnemyTemplate>, limit: Int?): Deck<Enemy> { val deck = types .map { generateEnemy(it) } .shuffled() .fold(Deck<Enemy>()) { d, c -> d.addToTop(c); d } limit?.let { while (deck.size > it) deck.drawFromTop() } return deck } fun generateObstacleDeck(templates: Collection<ObstacleTemplate>, limit: Int?): Deck<Obstacle> { val deck = templates .map { generateObstacle(it) } .shuffled() .fold(Deck<Obstacle>()) { d, c -> d.addToTop(c); d } limit?.let { while (deck.size > it) deck.drawFromTop() } return deck }
рдпрджрд┐ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ (рдкреИрд░рд╛рдореАрдЯрд░ limit
) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреЗрдХ рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдб рд╣реИрдВ , рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред рдХреНрдпреВрдмреНрд╕ рдФрд░ рдХрд╛рд░реНрдб рдХреЗ рдкреИрдХ рдХреЗ рд╕рд╛рде рдмреИрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рд╣рдо рдЕрдВрдд рдореЗрдВ рдЗрд▓рд╛рдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: fun generateLocation(template: LocationTemplate, level: Int) = Location().apply { name = template.name description = template.description bag = generateBag(template.bagTemplate, level) closingDifficulty = template.basicClosingDifficulty + level * 2 enemies = generateEnemyDeck(template.enemyCardPool, template.enemyCardsCount) obstacles = generateObstacleDeck(template.obstacleCardPool, template.obstacleCardsCount) template.specialRules.forEach { addSpecialRule(it) } }
рдЕрдзреНрдпрд╛рдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдо рдЬрд┐рд╕ рдЗрд▓рд╛рдХреЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд░реВрдк рд▓реЗрдЧрд╛: class SomeLocationTemplate: LocationTemplate { override val name = "Some location" override val description = "Some description" override val bagTemplate = BagTemplate().apply { addPlan(1, 1, SingleDieTypeFilter(Die.Type.PHYSICAL)) addPlan(1, 1, SingleDieTypeFilter(Die.Type.SOMATIC)) addPlan(1, 2, SingleDieTypeFilter(Die.Type.MENTAL)) addPlan(2, 2, MultipleDieTypeFilter(Die.Type.ENEMY, Die.Type.OBSTACLE)) } override val basicClosingDifficulty = 2 override val enemyCardsCount = 2 override val obstacleCardsCount = 1 override val enemyCardPool = listOf( SomeEnemyTemplate(), OtherEnemyTemplate() ) override val obstacleCardPool = listOf( SomeObstacleTemplate() ) override val specialRules = emptyList<SpecialRule>() } class SomeEnemyTemplate: EnemyTemplate { override val name = "Some enemy" override val description = "Some description" override val traits = emptyList<Trait>() } class OtherEnemyTemplate: EnemyTemplate { override val name = "Other enemy" override val description = "Some description" override val traits = emptyList<Trait>() } class SomeObstacleTemplate: ObstacleTemplate { override val name = "Some obstacle" override val description = "Some description" override val traits = emptyList<Trait>() override val tier = 1 override val dieTypes = arrayOf( Die.Type.PHYSICAL, Die.Type.VERBAL ) } val location = generateLocation(SomeLocationTemplate(), 1)
рдкрд░рд┐рджреГрд╢реНрдп рдкреАрдврд╝реА рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдШрдЯрд┐рдд рд╣реЛрдЧреАред interface ScenarioTemplate { val name: String val description: String val initialTimer: Int val staticLocations: List<LocationTemplate> val dynamicLocationsPool: List<LocationTemplate> val villains: List<VillainTemplate> val specialRules: List<SpecialRule> fun calculateDynamicLocationsCount(numberOfHeroes: Int) = numberOfHeroes + 2 }
рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд╛рдпрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдорд╛рдирдХ рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдкрд░рд┐рджреГрд╢реНрдп рдЬрдирд░реЗрдЯрд░ рдЗрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреВ-рднрд╛рдЧ рднреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ - рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдЦрд▓рдирд╛рдпрдХ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЗрд▓рд╛рдХреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред fun generateScenario(template: ScenarioTemplate, level: Int) = Scenario().apply { name =template.name description = template.description this.level = level initialTimer = template.initialTimer template.specialRules.forEach { addSpecialRule(it) } } fun generateLocations(template: ScenarioTemplate, level: Int, numberOfHeroes: Int): List<Location> { val locations = template.staticLocations.map { generateLocation(it, level) } + template.dynamicLocationsPool .map { generateLocation(it, level) } .shuffled() .take(template.calculateDynamicLocationsCount(numberOfHeroes)) val villains = template.villains .map(::generateVillain) .shuffled() locations.forEachIndexed { index, location -> if (index < villains.size) { location.villain = villains[index] location.bag.put(generateDie(SingleDieTypeFilter(Die.Type.VILLAIN), level)) } } return locations }
рдХрдИ рдЪреМрдХрд╕ рдкрд╛рдардХ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЖрдкрддреНрддрд┐ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ (рд▓рд┐рдкрд┐рдпреЛрдВ) рдореЗрдВ, рддрд╛рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рджреВрд░ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рднреА рдЙрдиреНрд╣реЗрдВ рдмрдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦ рд╕рдХреЗрдВред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореИрдВ рдЕрдкрдиреА рдЯреЛрдкреА рдЙрддрд╛рд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдкрд░ рд░рд╛рдЦ рдЫрд┐рдбрд╝рдХрддрд╛ рдирд╣реАрдВ рд╣реВрдВ - рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдЧреБрдг рдорд╛рди рдмрд╛рд╣рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдкреАрдврд╝реА рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ iota рдХреЛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧреАредрдЦреИрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреБрдЫ рднреА рднреВрд▓ рдирд╣реАрдВ рдЧрдП рд╣реИрдВ ... рдУрд╣ рд╣рд╛рдБ, рдирд╛рдпрдХреЛрдВ - рдЙрдиреНрд╣реЗрдВ рднреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреБрдЫ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: interface HeroTemplate { val type: Hero.Type val initialHandCapacity: Int val favoredDieType: Die.Type val initialDice: Collection<Die> val initialSkills: List<SkillTemplate> val dormantSkills: List<SkillTemplate> fun getDiceCount(type: Die.Type): Pair<Int, Int>? }
рдФрд░ рддреБрд░рдВрдд рд╣рдо рджреЛ рд╡рд┐рд╖рдорддрд╛рдУрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрдирдореЗрдВ рдмреИрдЧ рдФрд░ рдХреНрдпреВрдмреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ?
рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдирд╛рдпрдХреЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ (рд╡рд░реНрдЧ) рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрдпреВрдмреНрд╕ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдЦреНрддреА рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рдмрд╛рдд, getDiceCount()
- рдпреЗ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдбрдЧрд░ рд╣реИ ??? рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рдУ, рдпреЗ рд╡рд╣реА рд╣реИрдВ DiceLimit
рдЬреЛ рдХреНрдпреВрдмреНрд╕ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдРрд╕реЗ рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдп рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдереЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЦреБрдж рджреЗрдЦреЗрдВ: class BrawlerHeroTemplate : HeroTemplate { override val type = Hero.Type.BRAWLER override val favoredDieType = PHYSICAL override val initialHandCapacity = 4 override val initialDice = listOf( Die(PHYSICAL, 6), Die(PHYSICAL, 6), Die(PHYSICAL, 4), Die(PHYSICAL, 4), Die(PHYSICAL, 4), Die(PHYSICAL, 4), Die(PHYSICAL, 4), Die(PHYSICAL, 4), Die(SOMATIC, 6), Die(SOMATIC, 4), Die(SOMATIC, 4), Die(SOMATIC, 4), Die(MENTAL, 4), Die(VERBAL, 4), Die(VERBAL, 4) ) override fun getDiceCount(type: Die.Type) = when (type) { PHYSICAL -> 8 to 12 SOMATIC -> 4 to 7 MENTAL -> 1 to 2 VERBAL -> 2 to 4 else -> null } override val initialSkills = listOf( HitSkillTemplate() ) override val dormantSkills = listOf<SkillTemplate>() } class HunterHeroTemplate : HeroTemplate { override val type = Hero.Type.HUNTER override val favoredDieType = SOMATIC override val initialHandCapacity = 5 override val initialDice = listOf( Die(PHYSICAL, 4), Die(PHYSICAL, 4), Die(PHYSICAL, 4), Die(SOMATIC, 6), Die(SOMATIC, 6), Die(SOMATIC, 4), Die(SOMATIC, 4), Die(SOMATIC, 4), Die(SOMATIC, 4), Die(SOMATIC, 4), Die(MENTAL, 6), Die(MENTAL, 4), Die(MENTAL, 4), Die(MENTAL, 4), Die(VERBAL, 4) ) override fun getDiceCount(type: Die.Type) = when (type) { PHYSICAL -> 3 to 5 SOMATIC -> 7 to 11 MENTAL -> 4 to 7 VERBAL -> 1 to 2 else -> null } override val initialSkills = listOf( ShootSkillTemplate() ) override val dormantSkills = listOf<SkillTemplate>() }
рд▓реЗрдХрд┐рди рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреМрд╢рд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред interface SkillTemplate { val type: Skill.Type val maxLevel: Int val modifier1: Int val modifier2: Int val isActive get() = true } class HitSkillTemplate : SkillTemplate { override val type = Skill.Type.HIT override val maxLevel = 3 override val modifier1 = +1 override val modifier2 = +3 } class ShootSkillTemplate : SkillTemplate { override val type = Skill.Type.SHOOT override val maxLevel = 3 override val modifier1 = +0 override val modifier2 = +2 }
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рд╢рддреНрд░реБрдУрдВ рдФрд░ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рдмреИрдЪреЛрдВ рдореЗрдВ рдХреМрд╢рд▓ рдХреЛ рд░рд┐рд╡рд╛рдЗрд╡ рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рдирдП рдХреМрд╢рд▓ рдореЗрдВ рдЦреЗрд▓ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЦреЗрд▓ рдЗрдВрдЬрди рдореЗрдВ рдПрдХ рдирдпрд╛ рдХреЛрдб рдЬреЛрдбрд╝рдирд╛ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдирд╛рдпрдХреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдЖрд╕рд╛рди рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдореВрд░реНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рддрдХ рдПрдХ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реВрдВред рд╣рд╛рдБ, рдФрд░ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдирд╣реАрдВ рдХреАред fun generateSkill(template: SkillTemplate, initialLevel: Int = 1): Skill { val skill = Skill(template.type) skill.isActive = template.isActive skill.level = initialLevel skill.maxLevel = template.maxLevel skill.modifier1 = template.modifier1 skill.modifier2 = template.modifier2 return skill } fun generateHero(type: Hero.Type, name: String = ""): Hero { val template = when (type) { BRAWLER -> BrawlerHeroTemplate() HUNTER -> HunterHeroTemplate() } val hero = Hero(type) hero.name = name hero.isAlive = true hero.favoredDieType = template.favoredDieType hero.hand.capacity = template.initialHandCapacity template.initialDice.forEach { hero.bag.put(it) } for ((t, l) in Die.Type.values().map { it to template.getDiceCount(it) }) { l?.let { hero.addDiceLimit(DiceLimit(t, it.first, it.second, it.first)) } } template.initialSkills .map { generateSkill(it) } .forEach { hero.addSkill(it) } template.dormantSkills .map { generateSkill(it, 0) } .forEach { hero.addDormantSkill(it) } return hero }
рдмрд╕ рдХреБрдЫ рд╣реА рдХреНрд╖рдг рд╣рдбрд╝рддрд╛рд▓реА рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреАрдврд╝реА рд╡рд┐рдзрд┐ рдЦреБрдж рдирд╛рдпрдХ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЪрдпрди рдХрд░рддреА рд╣реИред рджреВрд╕рд░реЗ, рддреБрд░рдВрдд рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдХрднреА-рдХрднреА рдкреАрдврд╝реА рд╕реНрддрд░ рдкрд░ рд╣рдо рдЕрднреА рддрдХ рдЗрд╕реЗ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ)ред рддреАрд╕рд░рд╛, рдХреЛрдЯрд▓рд┐рди рдПрдХ рдЕрднреВрддрдкреВрд░реНрд╡ рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рд┐рдВрдереИрдЯрд┐рдХ рд╢реБрдЧрд░ рд▓реЗ рдЖрдпрд╛, рдЬрд┐рд╕реЗ рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдиреБрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЬрд░рд╛ рднреА рд╢рд░реНрдо рдирд╣реАрдВ рдЖрдИредрдЖрдард╡рд╛рдВ рдЪрд░рдгред рдЦреЗрд▓ рдЪрдХреНрд░
рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдП - рдЦреЗрд▓ рдЪрдХреНрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╡реЗ "рдЦреЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП" рд╢реБрд░реВ рд╣реБрдПред рдХрдИ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдХреНрд╕рд░ рдЦреЗрд▓ рдмрдирд╛рдиреЗ, рд╕рдм рдХреБрдЫ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдЪрд░рдг рд╕реЗ рд╕рдЯреАрдХ рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд░реНрдерд╣реАрди рдЫреЛрдЯреА рдпреЛрдЬрдирд╛рдПрдБ рдЦреАрдВрдЪрдирд╛, рдкреАрдПрдлрдПрдл ... рд▓реЗрдХрд┐рди рд╣рдо рдЬрд▓реНрджрдмрд╛рдЬрд╝реА рдирд╣реАрдВ рдХрд░рддреЗ (рдпрд╣ рдЕрднреА рднреА рд╕реБрдмрд╣ рд╕реЗ рджреВрд░ рд╣реИ), рдФрд░ рдЗрд╕рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдФрд░ рдореЙрдбрд▓рд┐рдВрдЧред рд╣рд╛рдБ, рдлрд┐рд░ рд╕реЗредрдЧрддрд┐рд╡рд┐рдзрд┐ рдЪрд╛рд░реНрдЯ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЦреЗрд▓ рдЪрдХреНрд░ рдХрд╛ рджрд┐рдпрд╛ рд╣реБрдЖ рдЯреБрдХрдбрд╝рд╛, рдЬреЛ рд╣рдордиреЗ рдКрдкрд░ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдХрдо рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд▓рд╛рдХреЗ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВрдЧреЗ (рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрдпреВрдмреНрд╕ рдХреЗ рд╕рд╛рде рдмреИрдардХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ) рдФрд░ рдореЛрдбрд╝ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдФрд░ рдПрдХ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ (рд╣рд╛рдБ, рд╣рдо рдЕрднреА рддрдХ рдЕрдкрдирд╛ рдЧреЗрдо рдЬреАрддрдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ) - рд▓реЗрдХрд┐рди рдЖрдк рдХреИрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ? рдЯрд╛рдЗрдорд░ рд╣рд░ рдореЛрдбрд╝ рдореЗрдВ рдХрдореА рдХрд░реЗрдЧрд╛, рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЦреЗрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ - рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реЛ рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдпрдореЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдирд╛рдпрдХреЛрдВ рдХреА рдореМрдд рдкрд░ рдПрдХ рдФрд░ рдЦреЗрд▓ рдкреВрд░рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЙрдиреНрд╣реЗрдВ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЬреАрддрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдиреЗ рдкрд░ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдХреНрд╖рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдкреНрд░реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдмрд╛рдХреА рдХреЛ рдмрд╛рдж рдореЗрдВ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ (рдпрд╛ рдмрд▓реНрдХрд┐, рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)рдФрд░ рддреБрдо - рдПрдХ рдЦреЗрд▓ рд▓рд┐рдЦреЛрдЕрдкрдиреЗ рд╕рдкрдиреЛрдВ рдХрд╛)редрддреЛ, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрд╣реАрд░реЛрдЬред рд▓рд┐рдкрд┐ред рд╕реНрдерд╛рдиредрд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рд╣реИ - рд╣рдо рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗ рдирд╣реАрдВред рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдЗрд▓рд╛рдХреЛрдВ рдХреЗ рдкреИрдЯрд░реНрди рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд░реЗрдВрдЧреЗред class TestLocationTemplate : LocationTemplate { override val name = "Test" override val description = "Some Description" override val basicClosingDifficulty = 0 override val enemyCardsCount = 0 override val obstacleCardsCount = 0 override val bagTemplate = BagTemplate().apply { addPlan(2, 2, SingleDieTypeFilter(Die.Type.PHYSICAL)) addPlan(2, 2, SingleDieTypeFilter(Die.Type.SOMATIC)) addPlan(2, 2, SingleDieTypeFilter(Die.Type.MENTAL)) addPlan(2, 2, SingleDieTypeFilter(Die.Type.VERBAL)) addPlan(2, 2, SingleDieTypeFilter(Die.Type.DIVINE)) } override val enemyCardPool = emptyList<EnemyTemplate>() override val obstacleCardPool = emptyList<ObstacleTemplate>() override val specialRules = emptyList<SpecialRule>() }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмреИрдЧ рдореЗрдВ рдХреЗрд╡рд▓ "рд╕рдХрд╛рд░рд╛рддреНрдордХ" рдХреНрдпреВрдмреНрд╕ рд╣реИрдВ - рдиреАрд▓реЗ, рд╣рд░реЗ, рдмреИрдВрдЧрдиреА, рдкреАрд▓реЗ рдФрд░ рдиреАрд▓реЗред рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрдИ рджреБрд╢реНрдорди рдФрд░ рдмрд╛рдзрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рдЦрд▓рдирд╛рдпрдХ рдФрд░ рдШрд╛рд╡ рдирд╣реАрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рднреА рдирд╣реАрдВ рд╣реИрдВ - рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдЧреМрдг рд╣реИредрдмрд░рдХрд░рд╛рд░ рдХреНрдпреВрдмреНрд╕ рдХреЗ рд▓рд┐рдП рдвреЗрд░редрдпрд╛ рдПрдХ рдирд┐рд╡рд╛рд░рдХ рдвреЗрд░ред рдЪреВрдВрдХрд┐ рд╣рдо рдЗрд▓рд╛рдХреЗ рдХреЗ рдмреИрдЧ рдореЗрдВ рдиреАрд▓реЗ рдХреНрдпреВрдмреНрд╕ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪ рдореЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдвреЗрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ Pile
редрд╕рдВрд╢реЛрдзрдХредрдпрд╣реА рд╣реИ, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдЬрд┐рдиреНрд╣реЗрдВ рдбрд╛рдИ рд░реЛрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдпрд╛ рдШрдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпреВрдм рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрд╢реЛрдзрдХ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╢реЛрдзрдХ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк (рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ) рдЪреБрдиреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ DiePair
ред class DiePair(val die: Die, var modifier: Int = 0)
рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХрд╛ рд╕реНрдерд╛рдиредрдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдЗрд╕ рдХреНрд╖рдг рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕ рд╕реНрдерд╛рди рдХреЗ рдирдХреНрд╢реЗ Map<Location, List<Hero>>
рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрд▓рд╛рдХреЗ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд╛рдпрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдЧреА (рд╕рд╛рде рд╣реА рд╡рд┐рдкрд░реАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ - рдЙрд╕ рдЗрд▓рд╛рдХреЗ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд╛рдпрдХ рд╕реНрдерд┐рдд рд╣реИ)ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдорд╛рд░реНрдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ Location
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ equals()
рдФрд░ hashCode()
, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред рд╣рдо рдЗрд╕ рдкрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд╖реЗрддреНрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ рдФрд░ рдирд╛рдпрдХ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВредрдирд╛рдпрдХ рдХреЗ рд╣рд╛рде рдХреА рдЬрд╛рдБрдЪредрдЦреЗрд▓ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдирд╛рдпрдХреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЪреЗрдХ (рдЬреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╣рд╛рде рд╕реЗ рдХреНрдпреВрдмреНрд╕ рд▓реЗрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдлреЗрдВрдХрддреЗ рд╣реИрдВ (рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ), рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдореЗрдХрд┐рдд рдХрд░реЗрдВ рдпрджрд┐ рдХрдИ рдХреНрдпреВрдмреНрд╕ рд╣реИрдВ (рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдзрд┐рдХрддрдо / рдиреНрдпреВрдирддрдо, рдФрд╕рдд, рдЖрджрд┐), рдЙрдиреНрд╣реЗрдВ рдлреЗрдВрдХ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдПрдХ рдФрд░ рдШрди (рдПрдХ рдЬрд┐рд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмреИрдЧ рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░, рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирд╛рдпрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЙрд╕рдХреЗ рд╣рд╛рде рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреВрдмреНрд╕ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ HandFilter
ред interface HandFilter { fun test(hand: Hand): Boolean }
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдпрдХ рдХреЗ рд╣рд╛рде (рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ Hand
) рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЪреЗрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ true
рд╣реИрдВ false
ред рдЦреЗрд▓ рдХреЗ рд╣рдорд╛рд░реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрджрд┐ рдиреАрд▓рд╛, рд╣рд░рд╛, рдмреИрдВрдЧрдиреА рдпрд╛ рдкреАрд▓рд╛ рдШрди рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдпрдХ рдХреЗ рд╣рд╛рде рдореЗрдВ рдПрдХ рд╣реА рд░рдВрдЧ рдХрд╛ рдШрди рд╣реИ рдпрд╛ рдирд╣реАрдВред class SingleDieHandFilter(private vararg val types: Die.Type) : HandFilter { override fun test(hand: Hand) = (0 until hand.dieCount).mapNotNull { hand.dieAt(it) }.any { it.type in types } || (Die.Type.ALLY in types && hand.allyDieCount > 0) }
рд╣рд╛рдБ, рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛редрд╕рдХреНрд░рд┐рдп / рдЪрдпрдирд┐рдд рдЖрдЗрдЯрдоредрдЕрдм рдЬрдм рд╣рдордиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдпрдХ рдХрд╛ рд╣рд╛рде рдЙрдкрдпреБрдХреНрдд рд╣реИ, рддреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡рд╣ рдЙрд╕ рдкрд╛рд╕реЗ (рдпрд╛ рдХреНрдпреВрдмреНрд╕) рдХреЛ рдЪреБрдиреЗ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд╣ рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрдкрдпреБрдХреНрдд рдкрджреЛрдВ (рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрдпреВрдмреНрд╕ рд╣реИрдВ) рдХреЛ рдЙрдЬрд╛рдЧрд░ (рд╣рд╛рдЗрд▓рд╛рдЗрдЯ) рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЪрдпрдирд┐рдд рдХреНрдпреВрдмреНрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрди рджреЛрдиреЛрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рдЙрдкрдпреБрдХреНрдд рд╣реИ HandMask
, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреВрд░реНрдгрд╛рдВрдХ (рдЪрдпрдирд┐рдд рдкрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИред class HandMask { private val positions = mutableSetOf<Int>() private val allyPositions = mutableSetOf<Int>() val positionCount get() = positions.size val allyPositionCount get() = allyPositions.size fun addPosition(position: Int) = positions.add(position) fun removePosition(position: Int) = positions.remove(position) fun addAllyPosition(position: Int) = allyPositions.add(position) fun removeAllyPosition(position: Int) = allyPositions.remove(position) fun checkPosition(position: Int) = position in positions fun checkAllyPosition(position: Int) = position in allyPositions fun switchPosition(position: Int) { if (!removePosition(position)) { addPosition(position) } } fun switchAllyPosition(position: Int) { if (!removeAllyPosition(position)) { addAllyPosition(position) } } fun clear() { positions.clear() allyPositions.clear() } }
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд╣рд╛рде рдореЗрдВ рд╕рдлреЗрдж рдХреНрдпреВрдмреНрд╕ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ "рд╕рд░рд▓" рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдХреИрд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реВрдВ? рдЗрд╕ рдореВрд░реНрдЦрддрд╛ рдХреЗ рдХрд╛рд░рдг, рдЖрдкрдХреЛ рджреЛ рд╕реЗрдЯреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рддрд░реАрдХреЗ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╕рдлреЗрдж рдХреНрдпреВрдмреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рд╕реМ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ - рдпрд╛ рдХреБрдЫ рдФрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ) - рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВредрд╡реИрд╕реЗ, рдвреЗрд░ ( PileMask
) рд╕реЗ рдХреНрдпреВрдмреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИредрд╣рд╛рде рд╕реЗ рдХреНрдпреВрдмреНрд╕ рдХреА рдкрд╕рдВрджредрд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ "рд╣рд╛рдЗрд▓рд╛рдЗрдЯ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреВрдмреНрд╕ рдЪреБрдирдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕ "рд╣рд╛рдЗрд▓рд╛рдЗрдЯ" рдХреЛ рдмрджрд▓рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣реА рд╣реИ, рдпрджрд┐ рдХрд┐рд╕реА рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЕрдкрдиреЗ рд╣рд╛рде рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдорд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЗрд╕ рдорд░ рдХреЛ рдЪреБрдирддреЗ рд╕рдордп, рдЕрдиреНрдп рд╕рднреА рдкрджреЛрдВ рдХреЛ рджреБрд░реНрдЧрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рдХреНрд╖реНрдп рдХреА рдкреВрд░реНрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЪрдпрдирд┐рдд рдХреНрдпреВрдмреНрд╕ рдПрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдард┐рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд░реНрдЧ рдХреЗ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред abstract class HandMaskRule(val hand: Hand) { abstract fun checkMask(mask: HandMask): Boolean abstract fun isPositionActive(mask: HandMask, position: Int): Boolean abstract fun isAllyPositionActive(mask: HandMask, position: Int): Boolean fun getCheckedDice(mask: HandMask): List<Die> { return ((0 until hand.dieCount).filter(mask::checkPosition).map(hand::dieAt)) .plus((0 until hand.allyDieCount).filter(mask::checkAllyPosition).map(hand::allyDieAt)) .filterNotNull() } }
рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рддрд░реНрдХ, рдореИрдВ рд╕рдордЭреВрдВрдЧрд╛ рдФрд░ рдорд╛рдл рдХрд░ рджреВрдВрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдФрд░ рдлрд┐рд░ рднреА рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрд╢рд╛ рд╣рд╛рде (рд╡рд╕реНрддреБ Hand
) рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдПрдХ рдореБрдЦреМрдЯрд╛ ( HandMask
) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ , рдЬреЛ рдЪрдпрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ (рдХреМрди рд╕реЗ рдкрдж рдЦрд┐рд▓рд╛рдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдЬреЛ рдирд╣реАрдВ рд╣реИрдВ)ред рд╡рд┐рдзрд┐ checkMask()
рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рдЪрдпрдирд┐рдд рдХреНрдпреВрдмреНрд╕ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рд╡рд┐рдзрд┐ isPositionActive()
рдХрд╣рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдШрди рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЪрдпрдирд┐рдд рдПрдХ рдШрди рдХреЛ рд╣рдЯрд╛ рджреЗрдВ)ред isAllyPositionActive()
рд╕рдлреЗрдж рдкрд╛рд╕рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рд╕рдорд╛рди рд╣реИ (рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдмреЗрд╡рдХреВрдл рд╣реВрдВ)ред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐getCheckedDice()
рдпрд╣ рдмрд╕ рдорд╛рд╕реНрдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╣рд╛рде рд╕реЗ рд╕рднреА рдХреНрдпреВрдмреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ - рдпрд╣ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдореЗрдЬ рдкрд░ рдлреЗрдВрдХ рджреЗрдВ рдФрд░ рдордЬрд╝реЗрджрд╛рд░ рджрд╕реНрддрдХ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдмрд┐рдЦреЗрд░рддреЗ рд╣реИрдВредрд╣рдореЗрдВ рдЗрд╕ рд╕рд╛рд░ рд╡рд░реНрдЧ (рдЖрд╢реНрдЪрд░реНрдп, рдЖрд╢реНрдЪрд░реНрдп!) рдХреЗ рджреЛ рдЕрд╣рд╕рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирдпрд╛ рдХреНрдпреВрдм (рд╕рдлреЗрдж рдирд╣реАрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪреЗрдХ рдореЗрдВ рдХрд┐рд╕реА рднреА рдиреАрд▓реЗ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред class StatDieAcquireHandMaskRule(hand: Hand, private val requiredType: Die.Type) : HandMaskRule(hand) { private fun checkedDieCount(mask: HandMask) = (0 until hand.dieCount) .filter(mask::checkPosition) .mapNotNull(hand::dieAt) .count { it.type === requiredType } override fun checkMask(mask: HandMask) = (mask.allyPositionCount == 0 && checkedDieCount(mask) == 1) override fun isPositionActive(mask: HandMask, position: Int) = with(hand.dieAt(position)) { when { mask.checkPosition(position) -> true this == null -> false this.type === Die.Type.DIVINE -> true this.type === requiredType && checkedDieCount(mask) < 1 -> true else -> false } } override fun isAllyPositionActive(mask: HandMask, position: Int) = false }
. . . (capacity), ( ). , ( , ). .
class DiscardExtraDiceHandMaskRule(hand: Hand) : HandMaskRule(hand) { private val minDiceToDiscard = if (hand.dieCount > hand.capacity) min(hand.dieCount - hand.woundCount, hand.dieCount - hand.capacity) else 0 private val maxDiceToDiscard = hand.dieCount - hand.woundCount override fun checkMask(mask: HandMask) = (mask.positionCount in minDiceToDiscard..maxDiceToDiscard) && (mask.allyPositionCount in 0..hand.allyDieCount) override fun isPositionActive(mask: HandMask, position: Int) = when { mask.checkPosition(position) -> true hand.dieAt(position) == null -> false hand.dieAt(position)!!.type == Die.Type.WOUND -> false mask.positionCount < maxDiceToDiscard -> true else -> false } override fun isAllyPositionActive(mask: HandMask, position: Int) = hand.allyDieAt(position) != null }
Nezhdanchik: Hand
рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЕрдЪрд╛рдирдХ рдЙрд╕ рд╡рд░реНрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рдЬреЛ woundCount
рдкрд╣рд▓реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рдереАред рдЖрдк рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рдпрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдЙрд╕реА рд╕рдордп рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВредрдкрд╛рд╕рд┐рдВрдЧ рдЪреЗрдХредрдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдорд┐рд▓ рдЧрдпрд╛ред рдЬрдм рдкрд╛рд╕рд╛ рд╣рд╛рде рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдлреЗрдВрдХрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпреВрдм рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░, рдЗрд╕рдХреЗ рд╕рдВрд╢реЛрдзрдХ, рдЗрд╕рдХреЗ рдлреЗрдВрдХрдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдоред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреНрдпреВрдм рдХреЛ рдмреИрдЧ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд░реЛрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрдИ рдкрд╛рд╕рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЪрд▓реЛ рдкрд╛рд╕рд╛ рд╕реЗ рдЕрдореВрд░реНрдд рд╣реИ рдФрд░ рдпреБрджреНрдз рдХреЗ рдореИрджрд╛рди рдкрд░ рд╕реИрдирд┐рдХреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдУрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджреБрд╢реНрдорди рд╣реИ - рд╡рд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдордЬрдмреВрдд рдФрд░ рдХреНрд░реВрд░ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдПрдХ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рддрд╛рдХрдд рдореЗрдВ, рд▓реЗрдХрд┐рди рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рдеред рд▓рдбрд╝рд╛рдИ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЫреЛрдЯреА рдЭрдбрд╝рдк рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд┐рдЬреЗрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рджреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЕрдкрдиреА рд╕рд╛рдорд╛рдиреНрдп рд▓рдбрд╝рд╛рдИ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред class DieBattleCheck(val method: Method, opponent: DiePair? = null) { enum class Method { SUM, AVG_UP, AVG_DOWN, MAX, MIN } private inner class Wrap(val pair: DiePair, var roll: Int) private infix fun DiePair.with(roll: Int) = Wrap(this, roll) private val opponent: Wrap? = opponent?.with(0) private val heroics = ArrayList<Wrap>() var isRolled = false var result: Int? = null val heroPairCount get() = heroics.size fun getOpponentPair() = opponent?.pair fun getOpponentResult() = when { isRolled -> opponent?.roll ?: 0 else -> throw IllegalStateException("Not rolled yet") } fun addHeroPair(pair: DiePair) { if (method == Method.SUM && heroics.size > 0) { pair.modifier = 0 } heroics.add(pair with 0) } fun addHeroPair(die: Die, modifier: Int) = addHeroPair(DiePair(die, modifier)) fun clearHeroPairs() = heroics.clear() fun getHeroPairAt(index: Int) = heroics[index].pair fun getHeroResultAt(index: Int) = when { isRolled -> when { (index in 0 until heroics.size) -> heroics[index].roll else -> 0 } else -> throw IllegalStateException("Not rolled yet") } fun roll() { fun roll(wrap: Wrap) { wrap.roll = wrap.pair.die.roll() } isRolled = true opponent?.let { roll(it) } heroics.forEach { roll(it) } } fun calculateResult() { if (!isRolled) { throw IllegalStateException("Not rolled yet") } val opponentResult = opponent?.let { it.roll + it.pair.modifier } ?: 0 val stats = heroics.map { it.roll + it.pair.modifier } val heroResult = when (method) { DieBattleCheck.Method.SUM -> stats.sum() DieBattleCheck.Method.AVG_UP -> ceil(stats.average()).toInt() DieBattleCheck.Method.AVG_DOWN -> floor(stats.average()).toInt() DieBattleCheck.Method.MAX -> stats.max() ?: 0 DieBattleCheck.Method.MIN -> stats.min() ?: 0 } result = heroResult - opponentResult } }
рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпреВрдм рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ DiePair
ред рд▓рдЧрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдШрди рдФрд░ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдлреЗрдВрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдШрди рд╕реНрд╡рдпрдВ рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕реЗ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдХреЛ рдПрдХ рдЖрд╡рд░рдг ( Wrap
) рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ ред рдЗрдиреНрдлрд┐рдХреНрд╕ рд╡рд┐рдзрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ with
, рд╣реЗрд╣редрдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХрддреНрд░реАрдХрд░рдг рд╡рд┐рдзрд┐ (рдЖрдВрддрд░рд┐рдХ рдЧрдгрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг Method
) рдФрд░ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА (рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реАрд░реЛ рдХреНрдпреВрдмреНрд╕ рдХреА рд╕реВрдЪреА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЬреЛрдбрд╝реЗ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдлреЗрдВрдХрддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо (рдпрджрд┐ рдХреЛрдИ рд╣реЛ)редрд╡рд┐рдзрд┐roll()
рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпреВрдм рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддрдереНрдп рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ isRolled
ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлреЗрдВрдХ рдХрд╛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рддреБрд░рдВрдд рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рд╣реИ calculateResult()
, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рд▓рд┐рдЦрдирд╛ рд╣реИ result
ред рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдПрдХ рдирд╛рдЯрдХреАрдп рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдПред рд╡рд┐рдзрд┐ roll()
рдХрдИ рдмрд╛рд░ рдЪрд▓рд╛рдИ рдЬрд╛рдПрдЧреА, рд╣рд░ рдмрд╛рд░ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдЪреЗрд╣рд░реЗ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ)ред рдФрд░ рдХреЗрд╡рд▓ рдЬрдм рдХреНрдпреВрдмреНрд╕ рдЯреЗрдмрд▓ рдкрд░ рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рднрд╛рдЧреНрдп рдХреЛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо (рдирд╛рдпрдХ рдХреЗ рдХреНрдпреВрдмреНрд╕ рдФрд░ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреЗ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░) рд╕реАрдЦрддреЗ рд╣реИрдВ ред рддрдирд╛рд╡ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ 0 рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдПрдХ рд╕рдлрд▓ рдкрд╛рд╕ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛редрдЦреЗрд▓ рдЗрдВрдЬрди рдХреА рд╕реНрдерд┐рддрд┐редрдкрд░рд┐рд╖реНрдХреГрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫрд╛рдВрдЯрд╛ рдЧрдпрд╛, рдЕрдм рдЪреАрдЬреЗрдВ рд╕рд░рд▓ рд╣реИрдВред рдпрд╣ рдХрд╣рдирд╛ рдПрдХ рдорд╣рд╛рди рдЦреЛрдЬ рдирд╣реАрдВ рд╣реЛрдЧреА рдХрд┐ рд╣рдореЗрдВ рдЦреЗрд▓ рдЗрдВрдЬрди рдХреЗ рд╡рд░реНрддрдорд╛рди "рдкреНрд░рдЧрддрд┐" рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рдЪрд░рдг рдпрд╛ рдЪрд░рдг рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рд╕реНрдерд┐рдд рд╣реИред рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧрдгрдирд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред enum class GamePhase { SCENARIO_START, HERO_TURN_START, HERO_TURN_END, LOCATION_BEFORE_EXPLORATION, LOCATION_ENCOUNTER_STAT, LOCATION_ENCOUNTER_DIVINE, LOCATION_AFTER_EXPLORATION, GAME_LOSS }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдФрд░ рднреА рдЪрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЧреЗрдо рдЗрдВрдЬрди рдХреЗ рдЪрд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ changePhaseX()
, рдЬрд╣рд╛рдВ X
рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рд╕реЗ рдореВрд▓реНрдп рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, рдЗрдВрдЬрди рдХреЗ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдЪрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рдиреЛрдВ рддрдХ рдХрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХредрдкреЛрд╕реНрдЯредрдЦреЗрд▓ рдЗрдВрдЬрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдЕрдиреНрдпрдерд╛ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЙрд╕рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдФрд░ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред enum class StatusMessage { EMPTY, CHOOSE_DICE_PERFORM_CHECK, END_OF_TURN_DISCARD_EXTRA, END_OF_TURN_DISCARD_OPTIONAL, CHOOSE_ACTION_BEFORE_EXPLORATION, CHOOSE_ACTION_AFTER_EXPLORATION, ENCOUNTER_PHYSICAL, ENCOUNTER_SOMATIC, ENCOUNTER_MENTAL, ENCOUNTER_VERBAL, ENCOUNTER_DIVINE, DIE_ACQUIRE_SUCCESS, DIE_ACQUIRE_FAILURE, GAME_LOSS_OUT_OF_TIME }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЗрд╕ рдЧрдгрдирд╛ рдХреЗ рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд╛рда рд▓рд╛рдЗрди рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЫреЛрдбрд╝рдХрд░ EMPTY
- рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рд╣реИ), рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╕реАрдЦреЗрдВрдЧреЗредрдХреНрд░рд┐рдпрд╛редрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЧреЗрдо рдЗрдВрдЬрди рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╕рд░рд▓ рд╕рдВрджреЗрд╢ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬреЛ рд╡рд╣ рдЗрд╕ рд╕рдордп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ (рд╢реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛, рдЗрд╕ рдХрджрдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ - рдпрд╣ рд╕рдм рдЕрдЪреНрдЫрд╛ рд╣реИ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред class Action( val type: Type, var isEnabled: Boolean = true, val data: Int = 0 ) { enum class Type { NONE,
рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЧрдгрди Type
рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред isEnabled
рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдлрд┐рд▓рд╣рд╛рд▓ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдРрд╕рд╛ рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ)ред рд╕рдВрдкрддреНрддрд┐ data
(рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ) рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ рдЬреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдпрд╛ рд╕реВрдЪреА рд╕реЗ рдЪрдпрдирд┐рдд рдЖрдЗрдЯрдо рдХреА рд╕рдВрдЦреНрдпрд╛) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИредKlasAction
рдЦреЗрд▓ рдЗрдВрдЬрди рдФрд░ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рд╕рд┐рд╕реНрдЯрдо (рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ) рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рд╣реИред рдЪреВрдВрдХрд┐ рдЕрдХреНрд╕рд░ рдХрдИ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ (рдЕрдиреНрдпрдерд╛, рдлрд┐рд░ рдХреНрдпреЛрдВ рдЪреБрдиреЗрдВ?), рдЙрдиреНрд╣реЗрдВ рд╕рдореВрд╣реЛрдВ (рд╕реВрдЪрд┐рдпреЛрдВ) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдорд╛рдирдХ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред class ActionList : Iterable<Action> { private val actions = mutableListOf<Action>() val size get() = actions.size fun add(action: Action): ActionList { actions.add(action) return this } fun add(type: Action.Type, enabled: Boolean = true): ActionList { add(Action(type, enabled)) return this } fun addAll(actions: ActionList): ActionList { actions.forEach { add(it) } return this } fun remove(type: Action.Type): ActionList { actions.removeIf { it.type == type } return this } operator fun get(index: Int) = actions[index] operator fun get(type: Action.Type) = actions.find { it.type == type } override fun iterator(): Iterator<Action> = ActionListIterator() private inner class ActionListIterator : Iterator<Action> { private var position = -1 override fun hasNext() = (actions.size > position + 1) override fun next() = actions[++position] } companion object { val EMPTY get() = ActionList() } }
рд╡рд░реНрдЧ рдореЗрдВ рд╕реВрдЪреА рд╕реЗ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЬрдВрдЬреАрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд╕рд╛рде рд╣реА рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдзреНрдпрд╛рди рджреЗрдВ "рдЕрдзрд┐рднрд╛рд░" get()
- рд╡рд░реНрдЧ рдмреНрд░реИрдХреЗрдЯ рдСрдкрд░реЗрдЯрд░ рд╣рдорд╛рд░реА рд╕реВрдЪреА рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди Iterator
рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рдЧрд▓ рдЧрдВрджрдЧреА рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдзрд╛рд░рд╛ рдЬреЛрдбрд╝рддреЛрдбрд╝ (рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдПрдПрдЪрдП) рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред рдЦрд╛рд▓реА рд╕реВрдЪреА рдЬрд▓реНрджреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдИрдПрдордкреАрдЯреАрд╡рд╛рдИ рдореВрд▓реНрдп рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрд╕реНрдХреНрд░реАрдиредрдЕрдВрдд рдореЗрдВ, рдПрдХ рдЕрдиреНрдп рд╕реВрдЪреА рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ ... рдЖрдк рдореБрдЭреЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдЭрдкрдХрд╛рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╕рд┐рд░ рдореЗрдЬ рдкрд░ рдорд╛рд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рдордЭреЛ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИред enum class GameScreen { HERO_TURN_START, LOCATION_INTERIOR, GAME_LOSS }
, . тАж .
┬л┬╗ ┬л┬╗.тАФ (). , , . - . , .
,
GameRenderer
, рд╕реНрдХреНрд░реАрди рдкрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреНрд░рд╛рдлрд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрджрд┐ рд╕реЗ рдЕрдореВрд░реНрдд рд╣реИрдВред рд╣рдо рдмрд╕ рдХрдорд╛рдВрдб рднреЗрдЬрддреЗ рд╣реИрдВ: "рдореБрдЭреЗ рдпрд╣ рдбреНрд░рд╛ рдХрд░реЗрдВ" - рдФрд░ рдЖрдк рдореЗрдВ рд╕реЗ рдЬреЛ рд▓реЛрдЧ рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реА рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рд╡реЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рднреАрддрд░ рдЕрдкрдирд╛ рддрд░реАрдХрд╛ рд╣реИред interface GameRenderer { fun drawHeroTurnStart(hero: Hero) fun drawLocationInteriorScreen( location: Location, heroesAtLocation: List<Hero>, timer: Int, currentHero: Hero, battleCheck: DieBattleCheck?, encounteredDie: DiePair?, pickedDice: HandMask, activePositions: HandMask, statusMessage: StatusMessage, actions: ActionList ) fun drawGameLoss(message: StatusMessage) }
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╕рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдКрдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИредрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - GameInteractor
(рд╣рд╛рдВ, рд╡рд░реНрддрдиреА-рдЬрд╛рдВрдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╢рдмреНрдж рдкрд░ рдЬреЛрд░ рджреЗрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ ...)ред рдЙрдирдХреЗ рддрд░реАрдХреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗ: рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рд╕реВрдЪреА рд╕реЗ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рд╣рд╛рде рд╕реЗ рдХреНрдпреВрдмреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдмрд╕ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рджрдмрд╛рдПрдВ, рдЖрджрд┐ред рдпрд╣ рддреБрд░рдВрдд рдиреЛрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрдирдкреБрдЯ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ (рдЧреЗрдо рд╕реНрдЯреЗрдк-рдмрд╛рдп-рд╕реНрдЯреЗрдк рд╣реИ), рдЕрд░реНрдерд╛рдд, рдЧреЗрдо рд▓реВрдк рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рддрдм рддрдХ рдирд┐рд▓рдВрдмрд┐рдд рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдз рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред interface GameInteractor{ fun anyInput() fun pickAction(list: ActionList): Action fun pickDiceFromHand(activePositions: HandMask, actions: ActionList): Action }
рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ред рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рд╛рде рд╕реЗ рдХреНрдпреВрдмреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ HandMask
- рд╕рдХреНрд░рд┐рдп рдкрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рд╡рд┐рдзрд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЪрдпрдирд┐рдд рд╕реНрдерд┐рддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ HAND_POSITION
(рдпрд╛ HAND_ALLY_POSITION
, рдПрдордбреАрдП) рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓реМрдЯрд╛рдПрдЧреА data
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CONFIRM
рдпрд╛ CANCEL
) рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ ActionList
ред рдЗрдирдкреБрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдХреНрд╖реЗрддреНрд░ рдРрд╕реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ isEnabled
рдХреЛ рд╕реЗрдЯ false
рдФрд░ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИредрдЦреЗрд▓ рдЗрдВрдЬрди рд╡рд░реНрдЧредрд╣рдордиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА, рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрдиред рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБGame
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдпрд╣ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд▓реЛрдЧреЛрдВ рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред class Game( private val renderer: GameRenderer, private val interactor: GameInteractor, private val scenario: Scenario, private val locations: List<Location>, private val heroes: List<Hero>) { private var timer = 0 private var currentHeroIndex = -1 private lateinit var currentHero: Hero private lateinit var currentLocation: Location private val deterrentPile = Pile() private var encounteredDie: DiePair? = null private var battleCheck: DieBattleCheck? = null private val activeHandPositions = HandMask() private val pickedHandPositions = HandMask() private var phase: GamePhase = GamePhase.SCENARIO_START private var screen = GameScreen.SCENARIO_INTRO private var statusMessage = StatusMessage.EMPTY private var actions: ActionList = ActionList.EMPTY fun start() { if (heroes.isEmpty()) throw IllegalStateException("Heroes list is empty!") if (locations.isEmpty()) throw IllegalStateException("Location list is empty!") heroes.forEach { it.isAlive = true } timer = scenario.initialTimer
рд╡рд┐рдзрд┐ start()
- рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБред рдпрд╣рд╛рдБ рдЪрд░реЛрдВ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд╛рдпрдХреЛрдВ рдХреЛ рддреМрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рдереЛрдВ рдХреЛ рдХреНрдпреВрдмреНрд╕ рд╕реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рддрд░рдл рд╕реЗ рдХреИрдорд░реЛрдВ рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯрд░ рдЪрдордХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдЪрдХреНрд░ рдХрд┐рд╕реА рднреА рдорд┐рдирдЯ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд░реЛрдХрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдзрд┐ drawInitialHand()
рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреА рд╣реИ (рд╣рдо drawOfType()
рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ Bag
, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рде рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЦреБрдж рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╡рд┐рдзрд┐ рдХреЗ refillHeroHand()
рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ (рддрд░реНрдХ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ redrawScreen
): рддреЗрдЬ рдФрд░ рд╢рд╛рдВрдд (рдЬрдм рдЖрдкрдХреЛ рдЦреЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рднреА рдирд╛рдпрдХреЛрдВ рдХреЗ рд╣рд╛рдереЛрдВ рдХреЛ рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ), рдФрд░ рдЬреЛрд░ рд╕реЗ рдкреИрдереЛрд╕ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛, рдЬрдм рдЗрд╕ рдХрджрдо рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдмреИрдЧ рд╕реЗ рдХреНрдпреВрдмреНрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рд╛рде рдХреЛ рд╕рд╣реА рдЖрдХрд╛рд░ рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВредрдирд╛рдо рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛changePhase
, - рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рд╡реЗ рд╡рд░реНрддрдорд╛рди рдЧреЗрдо рдЪрд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧреЗрдо рдЪрд░ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВред рдпрд╣рд╛рдВ, рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдИ рдЧрдИ рд╣реИ, actions
рдЬрд╣рд╛рдВ рдЗрд╕ рдЪрд░рдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк рдореЗрдВрдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд┐ pickDiceFromHand()
рд╣рд╛рде рд╕реЗ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдЪрдпрди рдореЗрдВ рд▓рдЧреА рд╣реБрдИ рд╣реИред HandMaskRule
рдЪрдпрди рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдпрд╣рд╛рдВ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ ред рдпрд╣ рдЪрдпрди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ ( allowCancel
), рд╕рд╛рде рд╣реА рдПрдХ рдлрд╝рдВрдХреНрд╢рди onEachLoop
рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рд╣рд░ рдмрд╛рд░ рдЪрдпрдирд┐рдд рдХреНрдпреВрдмреНрд╕ рдХреА рд╕реВрдЪреА рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕реНрдХреНрд░реАрди redraw)ред рдЗрд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдХреНрдпреВрдмреНрд╕ рдХреЛ рд╣рд╛рде рд╕реЗ collectPickedDice()
рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ collectPickedAllyDice()
редрдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд┐performStatDieAcquireCheck()
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдирдП рдШрди рдХреЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдпрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЗрдВрджреНрд░реАрдп рднреВрдорд┐рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рднрд╛рдИ рдЬрд╛рддреА рд╣реИ DieBattleCheck
ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдЪрдпрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ pickDiceFromHand()
(рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ "рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ" рдХреА рд╕реВрдЪреА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ DieBattleCheck
)ред рдЪрдпрдирд┐рдд рдХреНрдпреВрдмреНрд╕ рдХреЛ рд╣рд╛рде рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ "рд░реЛрд▓" рд╣реЛрддрд╛ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдбрд╛рдИ рдЕрдкрдиреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ (рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЖрда рдмрд╛рд░), рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рд╕рдлрд▓ рд░реЛрд▓ рдкрд░, рдПрдХ рдирдпрд╛ рдирд╛рдпрдХ рдирд╛рдпрдХ рдХреЗ рд╣рд╛рде рдореЗрдВ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХреНрдпреВрдмреНрд╕ рдпрд╛ рддреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдпрджрд┐ рд╡реЗ рдиреАрд▓реЗ рд╣реИрдВ), рдпрд╛ рддреНрдпрд╛рдЧ рджрд┐рдП рдЧрдП рд╣реИрдВ (рдпрджрд┐ shouldDiscard = true
), рдпрд╛ рдмреИрдЧ рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ (рдпрджрд┐ shouldDiscard = false
)редрдореБрдЦреНрдп рд╡рд┐рдзрд┐processCycle()
рдПрдХ рдЕрдирдВрдд рд▓реВрдк рд╣реЛрддрд╛ рд╣реИ (рдореИрдВ рдмреЗрд╣реЛрд╢реА рдХреЗ рдмрд┐рдирд╛ рдкреВрдЫрддрд╛ рд╣реВрдВ) рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд╣рд▓реЗ рдЦреАрдВрдЪреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рднреА рдЖрдЧрд╛рдореА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред рд╡рд┐рдзрд┐ drawScreen()
рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ GameRenderer
(рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ screen
) рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ , рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреА рд╣реИредрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд░реНрдЧ рдХрдИ рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: checkLocationCanBeExplored()
, checkHeroCanAttemptStatCheck()
рдФрд░ checkHeroCanAcquireDie()
ред рдЙрдирдХреЗ рдирд╛рдо рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдФрд░ рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЙрд▓ рднреА рд╣реИрдВ Audio
, рдЬреЛ рдПрдХ рд▓рд╛рд▓ рд▓рд╣рд░рджрд╛рд░ рд░реЗрдЦрд╛ рджреНрд╡рд╛рд░рд╛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рд╣реИрдВред рд╕рдордп рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ - рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗредрдХрд┐рд╕реЗ рдХреБрдЫ рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдпрд╣рд╛рдБ рдПрдХ рдЖрд░реЗрдЦ рд╣реИ (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП): рдмрд╕ рдЗрддрдирд╛ рд╣реА, рдЦреЗрд▓ рддреИрдпрд╛рд░ рд╣реИ (рд╣реЗрд╣реЗ)ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рдереАрдВ, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗредрдЪрд░рдг рдиреМред рдкреНрд░рджрд░реНрд╢рди рдЫрд╡рд┐
рддреЛ рд╣рдо рдЖрдЬ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдореБрдЦреНрдп рд╡рд┐рд╖рдп рдкрд░ рдЖрддреЗ рд╣реИрдВ - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЧреНрд░рд╛рдлрд┐рдХ рдШрдЯрдХред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ GameRenderer
рдФрд░ рдЙрд╕рдХреЗ рддреАрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ , рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рдЯреАрдо рдореЗрдВ рдЕрднреА рднреА рдХреЛрдИ рдкреНрд░рддрд┐рднрд╛рд╢рд╛рд▓реА рдХрд▓рд╛рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЫрджреНрдо рд╡рд┐рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЦреБрдж рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдордЭрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдХреНрдпрд╛ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рддреАрди рд╕реНрдХреНрд░реАрди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:рд╕реНрдХреНрд░реАрди 1. рдкреНрд▓реЗрдпрд░ рдЯрд░реНрди рдЖрдИрдбреА рд╕реНрдХреНрд░реАрди 2. рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╡рд░реНрддрдорд╛рди рдирд╛рдпрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдХреНрд░реАрди 3. рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рд╛рдирд┐ рд╕рдВрджреЗрд╢ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдордд рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдорд╣рд╕реВрд╕ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддреБрдд рдЫрд╡рд┐рдпрд╛рдВ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ prinltn()
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рдореИрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдордирдорд╛рдиреЗ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреВрджрдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧреЛрдВ рдореЗрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЪрд┐рдк рдФрд░ рдбреЗрд▓ ANSI рдХреЛрдбрд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рднрд╛рдЧрддреЗ рд╣реИрдВ ред рд╡рд░реНрдгреЛрдВ рдХреЗ рд╡рд┐рдЪрд┐рддреНрд░ рдХреНрд░рдореЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рднреЗрдЬрдХрд░, рдЖрдк рдХреЛрдИ рдХрдо рд╡рд┐рдЪрд┐рддреНрд░ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╛рда / рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ рдмрджрд▓рдирд╛, рд╡рд░реНрдгреЛрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛, рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдмреЗрд╢рдХ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреЗ рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдкреАрдЫреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫрд┐рдкрд╛рдПрдВрдЧреЗред рдФрд░ рд╣рдо рдХрдХреНрд╖рд╛ рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ - рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕реНрдорд╛рд░реНрдЯ рд▓реЛрдЧреЛрдВ рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рдпрд╛ред рд╣рдореЗрдВ рдмрд╕ рдХреБрдЫ рд╣рд▓реНрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Jansi : <dependency> <groupId>org.fusesource.jansi</groupId> <artifactId>jansi</artifactId> <version>1.17.1</version> <scope>compile</scope> </dependency>
рдФрд░ рдЖрдк рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ Ansi
(рд╕реНрдерд┐рд░ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд Ansi.ansi()
) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЬрдВрдЬреАрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ StringBuilder
'a' рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рд╣рдо рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдВрдЧреЗ:a()
- рд╡рд░реНрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;cursor()
- рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд░реНрд╕рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;eraseLine()
- рдЬреИрд╕реЗ рдХрд┐ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИ;eraseScreen()
- рдЗрд╕реА рддрд░рд╣;fg(), bg(), fgBright(), bgBright()
- рдкрд╛рда рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ - рд╣рдо рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ, рдЕрдзрд┐рдХ рд╕реБрдЦрдж рдмрдирд╛ рджреЗрдВрдЧреЗ;reset()
- рд╕реЗрдЯ рд░рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ, рдЖрджрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЖрдЗрдП ConsoleRenderer
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рдо рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: abstract class ConsoleRenderer() { protected lateinit var ansi: Ansi init { AnsiConsole.systemInstall() clearScreen() resetAnsi() } private fun resetAnsi() { ansi = Ansi.ansi() } fun clearScreen() { print(Ansi.ansi().eraseScreen(Ansi.Erase.ALL).cursor(1, 1)) } protected fun render() { print(ansi.toString()) resetAnsi() } }
рд╡рд┐рдзрд┐ resetAnsi()
рдПрдХ рдирдИ (рдЦрд╛рд▓реА) рд╡рд╕реНрддреБ рдмрдирд╛рддреА рд╣реИ Ansi
, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдб (рдЪрд╛рд▓, рдЖрдЙрдЯрдкреБрдЯ, рдЖрджрд┐) рд╕реЗ рднрд░реА рдЬрд╛рдПрдЧреАред рднрд░рдиреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдЙрддреНрдкрдиреНрди рд╡рд╕реНрддреБ рдХреЛ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдореБрджреНрд░рдг рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ render()
, рдФрд░ рдЪрд░ рдХреЛ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрднреА рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛? рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЛрдВ рд╕реЗ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗредрдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХрд╛ рдорд╛рдирдХ рдХрдВрд╕реЛрд▓ рдЖрдХрд╛рд░ рдореЗрдВ 80x24 рд╣реИред рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЛ рджреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдиреЛрдЯ рдХрд░рддреЗ рд╣реИрдВ CONSOLE_WIDTH
рдФрд░ CONSOLE_HEIGHT
ред рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд░рдмрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ (рдЬреИрд╕реЗ рд╡реЗрдм рдкрд░)ред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдкрд╣рд▓рд╛ рд╕рдордиреНрд╡рдп рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рд╕реНрддрдВрдн рд╣реИред рдпрд╣ рд╕рдм рдЬрд╛рдирддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВdrawHorizontalLine()
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдПред protected fun drawHorizontalLine(offsetY: Int, filler: Char) { ansi.cursor(offsetY, 1) (1..CONSOLE_WIDTH).forEach { ansi.a(filler) }
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдорд╛рдВрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ a()
рдпрд╛ cursor()
рдХрд┐рд╕реА рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ Ansi
рдХрдорд╛рдВрдб рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ ред рдЬрдм рдЗрди рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рддрднреА рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рджреЗрдЦреЗрдВрдЧреЗредрд╢рд╛рд╕реНрддреНрд░реАрдп рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ for
рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмреАрдЪ рдХреЛрдИ рдмреБрдирд┐рдпрд╛рджреА рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ - ClosedRange
рдФрд░ forEach{}
рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЖрдкрдХреЗ рд╕рд┐рд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛ рдХреЗ рд╕рд╛рде рдореВрд░реНрдЦ рдмрдирд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛, рдмрд╕ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рдПрдХ рдмрдВрджрд░ рд╣реВрдВ рдЬреЛ рд╕рдм рдХреБрдЫ рдирдпрд╛ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрдордХрджрд╛рд░ рдХреЛрд╖реНрдардХ рдПрдХ рдирдИ рд░реЗрдЦрд╛ рд╕реЗ рд▓рд┐рдкрдЯрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдб рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рджрд┐рдЦрддрд╛ рд╣реИредрд╣рдо рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ drawBlankLine()
рдЬреЛ рдХрд┐ рдЬреИрд╕рд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИdrawHorizontalLine(offsetY, ' ')
, рдХреЗрд╡рд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рдеред рдХрднреА-рдХрднреА рд╣рдореЗрдВ рд▓рд╛рдЗрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд (рдлреНрд░реЗрдо, рд╣рд╛рдБ) рдкрд░ рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд░реЗрдЦрд╛ рдЫреЛрдбрд╝ рджреЗрдВред рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: protected fun drawBlankLine(offsetY: Int, drawBorders: Boolean = true) { ansi.cursor(offsetY, 1) if (drawBorders) { ansi.a('тФВ') (2 until CONSOLE_WIDTH).forEach { ansi.a(' ') } ansi.a('тФВ') } else { ansi.eraseLine(Ansi.Erase.ALL) } }
рдХреИрд╕реЗ, рдЖрдкрдиреЗ рдЫрджреНрдо рд╡рд┐рдЬреНрдЮрд╛рди рд╕реЗ рдлрд╝реНрд░реЗрдо рдХреЛ рдХрднреА рдирд╣реАрдВ рдЦреАрдВрдЪрд╛? рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Alt рдХреБрдВрдЬреА рджрдмрд╛рдП рд░рдЦреЗрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреАрдкреИрдб рдкрд░ рд╡рд░реНрдг рдХреЛрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВред рддреЛ рдЬрд╛рдиреЗ рджреЛред рдХрд┐рд╕реА рднреА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ ASCII рдХреЛрдб рд╕рдорд╛рди рд╣реИрдВ, рдпрд╣рд╛рдБ рдиреНрдпреВрдирддрдо рд╕рдЬреНрдЬрди рд╕реЗрдЯ рд╣реИ:рдФрд░ рдлрд┐рд░, Minecraft рдХреА рддрд░рд╣, рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдХреЗрд╡рд▓ рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ рдХреА рд╕реАрдорд╛рдУрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рдФрд░ рд╕реНрдХреНрд░реАрди рдХрд╛ рдЖрдХрд╛рд░ред protected fun drawCenteredCaption(offsetY: Int, text: String, color: Color, drawBorders: Boolean = true) { val center = (CONSOLE_WIDTH - text.length) / 2 ansi.cursor(offsetY, 1) ansi.a(if (drawBorders) 'тФВ' else ' ') (2 until center).forEach { ansi.a(' ') } ansi.color(color).a(text).reset() (text.length + center until CONSOLE_WIDTH).forEach { ansi.a(' ') } ansi.a(if (drawBorders) 'тФВ' else ' ') }
рдЪрд▓реЛ рдлреВрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдХрдХреНрд╖рд╛ Ansi
рдореЗрдВ Color
рдЖрда рдкреНрд░рд╛рдердорд┐рдХ рд░рдВрдЧреЛрдВ (рдХрд╛рд▓рд╛, рдиреАрд▓рд╛, рд╣рд░рд╛, рд╕рд┐рдпрд╛рди, рд▓рд╛рд▓, рдмреИрдВрдЧрдиреА, рдкреАрд▓рд╛, рдЧреНрд░реЗ) рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ , рдЬрд┐рдиреНрд╣реЗрдВ fg()/bg()
рдЕрдВрдзреЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╛ fgBright()/bgBright()
рдкреНрд░рдХрд╛рд╢ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░рдВрдЧ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рд╡реИрд╕реЗ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ - рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ (рд░рдВрдЧ рдФрд░ рдЪрдордХ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ (рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреНрдпреВрдмреНрд╕ рдФрд░ рдирд╛рдпрдХреЛрдВ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдк-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд░рдВрдЧ) рдХреА рд╕реВрдЪреА рдмрдирд╛рдПрдВрдЧреЗ: protected enum class Color { BLACK, DARK_BLUE, DARK_GREEN, DARK_CYAN, DARK_RED, DARK_MAGENTA, DARK_YELLOW, LIGHT_GRAY, DARK_GRAY, LIGHT_BLUE, LIGHT_GREEN, LIGHT_CYAN, LIGHT_RED, LIGHT_MAGENTA, LIGHT_YELLOW, WHITE } protected fun Ansi.color(color: Color?): Ansi = when (color) { Color.BLACK -> fgBlack() Color.DARK_BLUE -> fgBlue() Color.DARK_GREEN -> fgGreen() Color.DARK_CYAN -> fgCyan() Color.DARK_RED -> fgRed() Color.DARK_MAGENTA -> fgMagenta() Color.DARK_YELLOW -> fgYellow() Color.LIGHT_GRAY -> fg(Ansi.Color.WHITE) Color.DARK_GRAY -> fgBrightBlack() Color.LIGHT_BLUE -> fgBrightBlue() Color.LIGHT_GREEN -> fgBrightGreen() Color.LIGHT_CYAN -> fgBrightCyan() Color.LIGHT_RED -> fgBrightRed() Color.LIGHT_MAGENTA -> fgBrightMagenta() Color.LIGHT_YELLOW -> fgBrightYellow() Color.WHITE -> fgBright(Ansi.Color.WHITE) else -> this } protected fun Ansi.background(color: Color?): Ansi = when (color) { Color.BLACK -> ansi.bg(Ansi.Color.BLACK) Color.DARK_BLUE -> ansi.bg(Ansi.Color.BLUE) Color.DARK_GREEN -> ansi.bgGreen() Color.DARK_CYAN -> ansi.bg(Ansi.Color.CYAN) Color.DARK_RED -> ansi.bgRed() Color.DARK_MAGENTA -> ansi.bgMagenta() Color.DARK_YELLOW -> ansi.bgYellow() Color.LIGHT_GRAY -> ansi.bg(Ansi.Color.WHITE) Color.DARK_GRAY -> ansi.bgBright(Ansi.Color.BLACK) Color.LIGHT_BLUE -> ansi.bgBright(Ansi.Color.BLUE) Color.LIGHT_GREEN -> ansi.bgBrightGreen() Color.LIGHT_CYAN -> ansi.bgBright(Ansi.Color.CYAN) Color.LIGHT_RED -> ansi.bgBrightRed() Color.LIGHT_MAGENTA -> ansi.bgBright(Ansi.Color.MAGENTA) Color.LIGHT_YELLOW -> ansi.bgBrightYellow() Color.WHITE -> ansi.bgBright(Ansi.Color.WHITE) else -> this } protected val dieColors = mapOf( Die.Type.PHYSICAL to Color.LIGHT_BLUE, Die.Type.SOMATIC to Color.LIGHT_GREEN, Die.Type.MENTAL to Color.LIGHT_MAGENTA, Die.Type.VERBAL to Color.LIGHT_YELLOW, Die.Type.DIVINE to Color.LIGHT_CYAN, Die.Type.WOUND to Color.DARK_GRAY, Die.Type.ENEMY to Color.DARK_RED, Die.Type.VILLAIN to Color.LIGHT_RED, Die.Type.OBSTACLE to Color.DARK_YELLOW, Die.Type.ALLY to Color.WHITE ) protected val heroColors = mapOf( Hero.Type.BRAWLER to Color.LIGHT_BLUE, Hero.Type.HUNTER to Color.LIGHT_GREEN )
рдЕрдм, 16 рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд▓рдмреНрдз рд░рдВрдЧ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдПрдХрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ рд▓рд┐рдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдПрдХ рдФрд░ рдмрд╛рдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдБ:рдкрд╛рда рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ?"рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдВ - рдЗрд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ... "рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ... рдареАрдХ рд╣реИ, рд╣рд╛рдБред рд╣рдо рд╕рд╣реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рддрдВрддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ java.util.ResourceBundle
рдЬреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ .properties
ред рдпрд╣рд╛рдБ рд╣рдо рдРрд╕реА рдлрд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: # Game status messages choose_dice_perform_check=Choose dice to perform check: end_of_turn_discard_extra=END OF TURN: Discard extra dice: end_of_turn_discard_optional=END OF TURN: Discard any dice, if needed: choose_action_before_exploration=Choose your action: choose_action_after_exploration=Already explored this turn. Choose what to do now: encounter_physical=Encountered PHYSICAL die. Need to pass respective check or lose this die. encounter_somatic=Encountered SOMATIC die. Need to pass respective check or lose this die. encounter_mental=Encountered MENTAL die. Need to pass respective check or lose this die. encounter_verbal=Encountered VERBAL die. Need to pass respective check or lose this die. encounter_divine=Encountered DIVINE die. Can be acquired automatically (no checks needed): die_acquire_success=You have acquired the die! die_acquire_failure=You have failed to acquire the die. game_loss_out_of_time=You ran out of time # Die types physical=PHYSICAL somatic=SOMATIC mental=MENTAL verbal=VERBAL divine=DIVINE ally=ALLY wound=WOUND enemy=ENEMY villain=VILLAIN obstacle=OBSTACLE # Hero types and descriptions brawler=Brawler hunter=Hunter # Various labels avg=avg bag=Bag bag_size=Bag size class=Class closed=Closed discard=Discard empty=Empty encountered=Encountered fail=Fail hand=Hand heros_turn=%s's turn max=max min=min perform_check=Perform check: pile=Pile received_new_die=Received new die result=Result success=Success sum=sum time=Time total=Total # Action names and descriptions action_confirm_key=ENTER action_confirm_name=Confirm action_cancel_key=ESC action_cancel_name=Cancel action_explore_location_key=E action_explore_location_name=xplore action_finish_turn_key=F action_finish_turn_name=inish action_hide_key=H action_hide_name=ide action_discard_key=D action_discard_name=iscard action_acquire_key=A action_acquire_name=cquire action_leave_key=L action_leave_name=eave action_forfeit_key=F action_forfeit_name=orfeit
рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА-рдорд╛рди рдпреБрдЧреНрдо рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рд╡рд░реНрдг рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ =
ред рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд╣реАрдВ рднреА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рд╡рд░реНрдЧрдкрде рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкрд╛рда рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░ рди рдХреЗрд╡рд▓ рдкреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд╣ рдХреБрдВрдЬреА рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрдмрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИредрд╣рдо рдЕрдореВрд░реНрдд рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рд╕реЗ (рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рд░ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ) рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред interface StringLoader { fun loadString(key: String): String }
рдХреБрдВрдЬреА рдЗрдирдкреБрдЯ рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреА рд╣реИ, рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реЗрдЦрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╕рд░рд▓ рд╣реИ (рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рдд рд╣реИ src/main/resources/text/strings.properties
)ред class PropertiesStringLoader() : StringLoader { private val properties = ResourceBundle.getBundle("text.strings") override fun loadString(key: String) = properties.getString(key) ?: "" }
рдЕрдм drawStatusMessage()
рд╕реНрдХреНрд░реАрди рдкрд░ рдЦреЗрд▓ рдЗрдВрдЬрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ ( StatusMessage
) рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ drawActionList()
рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ ( ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ ActionList
ред рд╕рд╛рде рд╣реА рдЕрдиреНрдп рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬреЛ рдХреЗрд╡рд▓ рдЖрддреНрдорд╛ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИредрдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ, рдЗрд╕рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ ... рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкреЙрдЗрд▓рд░ рд╣реИ abstract class ConsoleRenderer(private val strings: StringLoader) { protected lateinit var ansi: Ansi init { AnsiConsole.systemInstall() clearScreen() resetAnsi() } protected fun loadString(key: String) = strings.loadString(key) private fun resetAnsi() { ansi = Ansi.ansi() } fun clearScreen() { print(Ansi.ansi().eraseScreen(Ansi.Erase.ALL).cursor(1, 1)) } protected fun render() { ansi.cursor(CONSOLE_HEIGHT, CONSOLE_WIDTH) System.out.print(ansi.toString()) resetAnsi() } protected fun drawBigNumber(offsetX: Int, offsetY: Int, number: Int): Unit = with(ansi) { var currentX = offsetX cursor(offsetY, currentX) val text = number.toString() text.forEach { when (it) { '0' -> { cursor(offsetY, currentX) a(" тЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a("тЦИ тЦИ ") cursor(offsetY + 2, currentX) a("тЦИ тЦИ ") cursor(offsetY + 3, currentX) a("тЦИ тЦИ ") cursor(offsetY + 4, currentX) a(" тЦИтЦИтЦИ ") } '1' -> { cursor(offsetY, currentX) a(" тЦИ ") cursor(offsetY + 1, currentX) a(" тЦИтЦИ ") cursor(offsetY + 2, currentX) a("тЦИ тЦИ ") cursor(offsetY + 3, currentX) a(" тЦИ ") cursor(offsetY + 4, currentX) a("тЦИтЦИтЦИтЦИтЦИ ") } '2' -> { cursor(offsetY, currentX) a(" тЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a("тЦИ тЦИ ") cursor(offsetY + 2, currentX) a(" тЦИ ") cursor(offsetY + 3, currentX) a(" тЦИ ") cursor(offsetY + 4, currentX) a("тЦИтЦИтЦИтЦИтЦИ ") } '3' -> { cursor(offsetY, currentX) a("тЦИтЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a(" тЦИ ") cursor(offsetY + 2, currentX) a(" тЦИтЦИ ") cursor(offsetY + 3, currentX) a(" тЦИ ") cursor(offsetY + 4, currentX) a("тЦИтЦИтЦИтЦИ ") } '4' -> { cursor(offsetY, currentX) a(" тЦИ ") cursor(offsetY + 1, currentX) a(" тЦИтЦИ ") cursor(offsetY + 2, currentX) a(" тЦИ тЦИ ") cursor(offsetY + 3, currentX) a("тЦИтЦИтЦИтЦИтЦИ ") cursor(offsetY + 4, currentX) a(" тЦИ ") } '5' -> { cursor(offsetY, currentX) a("тЦИтЦИтЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a("тЦИ ") cursor(offsetY + 2, currentX) a("тЦИтЦИтЦИтЦИ ") cursor(offsetY + 3, currentX) a(" тЦИ ") cursor(offsetY + 4, currentX) a("тЦИтЦИтЦИтЦИ ") } '6' -> { cursor(offsetY, currentX) a(" тЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a("тЦИ ") cursor(offsetY + 2, currentX) a("тЦИтЦИтЦИтЦИ ") cursor(offsetY + 3, currentX) a("тЦИ тЦИ ") cursor(offsetY + 4, currentX) a(" тЦИтЦИтЦИ ") } '7' -> { cursor(offsetY, currentX) a("тЦИтЦИтЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a(" тЦИ ") cursor(offsetY + 2, currentX) a(" тЦИ ") cursor(offsetY + 3, currentX) a(" тЦИ ") cursor(offsetY + 4, currentX) a(" тЦИ ") } '8' -> { cursor(offsetY, currentX) a(" тЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a("тЦИ тЦИ ") cursor(offsetY + 2, currentX) a(" тЦИтЦИтЦИ ") cursor(offsetY + 3, currentX) a("тЦИ тЦИ ") cursor(offsetY + 4, currentX) a(" тЦИтЦИтЦИ ") } '9' -> { cursor(offsetY, currentX) a(" тЦИтЦИтЦИ ") cursor(offsetY + 1, currentX) a("тЦИ тЦИ ") cursor(offsetY + 2, currentX) a(" тЦИтЦИтЦИтЦИ ") cursor(offsetY + 3, currentX) a(" тЦИ ") cursor(offsetY + 4, currentX) a(" тЦИтЦИтЦИ ") } } currentX += 6 } } protected fun drawHorizontalLine(offsetY: Int, filler: Char) { ansi.cursor(offsetY, 1) (1..CONSOLE_WIDTH).forEach { ansi.a(filler) } } protected fun drawBlankLine(offsetY: Int, drawBorders: Boolean = true) { ansi.cursor(offsetY, 1) if (drawBorders) { ansi.a('тФВ') (2 until CONSOLE_WIDTH).forEach { ansi.a(' ') } ansi.a('тФВ') } else { ansi.eraseLine(Ansi.Erase.ALL) } } protected fun drawCenteredCaption(offsetY: Int, text: String, color: Color, drawBorders: Boolean = true) { val center = (CONSOLE_WIDTH - text.length) / 2 ansi.cursor(offsetY, 1) ansi.a(if (drawBorders) 'тФВ' else ' ') (2 until center).forEach { ansi.a(' ') } ansi.color(color).a(text).reset() (text.length + center until CONSOLE_WIDTH).forEach { ansi.a(' ') } ansi.a(if (drawBorders) 'тФВ' else ' ') } protected fun drawStatusMessage(offsetY: Int, message: StatusMessage, drawBorders: Boolean = true) {
рд╣рдордиреЗ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рдХрд┐рдпрд╛, рдЖрдк рдкреВрдЫреЗрдВ? рд╣рд╛рдВ, рдЗрд╕ рдЕрджреНрднреБрдд рд╡рд░реНрдЧ рд╕реЗ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП GameRenderer
редрд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛: override fun drawGameLoss(message: StatusMessage) { val centerY = CONSOLE_HEIGHT / 2 (1 until centerY).forEach { drawBlankLine(it, false) } val data = loadString(message.toString().toLowerCase()).toUpperCase() drawCenteredCaption(centerY, data, LIGHT_RED, false) (centerY + 1..CONSOLE_HEIGHT).forEach { drawBlankLine(it, false) } render() }
рдЕрд▓реМрдХрд┐рдХ рдХреБрдЫ рднреА рдирд╣реАрдВ, data
рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдЦреАрдВрдЪреА рдЧрдИ рд╕рд┐рд░реНрдл рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рд▓рд╛рдЗрди ( drawCenteredCaption()
)ред рд╢реЗрд╖ рдХреЛрдб рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╢реЗрд╖ рд╕реНрдХреНрд░реАрди рдХреЛ рднрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдХреЛрдИ рдкреВрдЫреЗрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░ clearScreen()
, рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ , рдпрд╣ рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд╕реНрдХреНрд░реАрди рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рд╡рд╛рдВрдЫрд┐рдд рдкрд╛рда рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВред рдХрд╛рд╢, рдпрд╣ рдПрдХ рдЖрд▓рд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдХрд╛рд░рдг рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╕реНрдХреНрд░реАрди рдкрд░ рдХреБрдЫ рдкрджреЛрдВ рдХреЛ рджреЛ рдмрд╛рд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реНрдХреНрд░реАрди рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЦреАрдВрдЪреА рдЬрд╛рддреА рд╣реИ (рдПрдирд┐рдореЗрд╢рди рдХреЗ рджреМрд░рд╛рди)ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдХреЗрд╡рд▓ рд╕рд╣реА рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЦреАрдВрдЪрдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреВрд░реЗ рдХреЛ рднрд░рдирд╛ рд╣реИрдЦрд╛рд▓реА рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдХреА (рддрд╛рдХрд┐ рдЕрдиреНрдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рдЙрд╕ рдкрд░ рди рд░рд╣реЗрдВ)ред рдФрд░ рдпрд╣ рдХрд╛рд░реНрдп рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИредрдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИ: override fun drawHeroTurnStart(hero: Hero) { val centerY = (CONSOLE_HEIGHT - 5) / 2 (1 until centerY).forEach { drawBlankLine(it, false) } ansi.color(heroColors[hero.type]) drawHorizontalLine(centerY, 'тФА') drawHorizontalLine(centerY + 4, 'тФА') ansi.reset() ansi.cursor(centerY + 1, 1).eraseLine() ansi.cursor(centerY + 3, 1).eraseLine() ansi.cursor(centerY + 2, 1) val text = String.format(loadString("heros_turn"), hero.name.toUpperCase()) val index = text.indexOf(hero.name.toUpperCase()) val center = (CONSOLE_WIDTH - text.length) / 2 ansi.cursor(centerY + 2, center) ansi.eraseLine(Ansi.Erase.BACKWARD) ansi.a(text.substring(0, index)) ansi.color(heroColors[hero.type]).a(hero.name.toUpperCase()).reset() ansi.a(text.substring(index + hero.name.length)) ansi.eraseLine(Ansi.Erase.FORWARD) (centerY + 5..CONSOLE_HEIGHT).forEach { drawBlankLine(it, false) } render() }
рдпрд╣рд╛рдВ, рдХреЗрдВрджреНрд░рд┐рдд рдкрд╛рда рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛ рдХреНрд╖реИрддрд┐рдЬ рд░реЗрдЦрд╛рдПрдВ рднреА рд╣реИрдВ (рдКрдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗрдЦреЗрдВ)ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЗрдВрджреНрд░ рдЕрдХреНрд╖рд░ рджреЛ рд░рдВрдЧреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕реНрдХреВрд▓ рдореЗрдВ рдЧрдгрд┐рдд рд╕реАрдЦрдирд╛ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реИредрдЦреИрд░, рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬрд╛рдирдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ drawLocationInteriorScreen()
ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ рдЕрдзрд┐рдХ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдХреНрд░рдо рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреА рд╕рд╛рдордЧреНрд░реА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧреА рдФрд░ рдЗрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдкреБрди: рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдХрднреА-рдХрднреА рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде)ред рдЦреИрд░, рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдКрдкрд░ рджреА рдЧрдИ рд╕реНрдХреНрд░реАрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рддреАрди рдФрд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:1. рдмреИрдЧ рд╕реЗ рд╣рдЯрд╛рдП рдЧрдП рдХреНрдпреВрдм рдХреЗ рд╕рд╛рде рдмреИрдардХ 2. рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╛ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ 3. рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЗ рд▓рд┐рдП рдореЗрд░реА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рд╣реИ: рд╕рднреА рдХреЛрдб рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдЕрд▓рдЧ рди рдХрд░реЗрдВред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рддреЛрдбрд╝реЗрдВ (рднрд▓реЗ рд╣реА рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛)ред рдЦреИрд░, "рд░рдмрд░" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛редрдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреА рдЖрдВрдЦреЛрдВ рдореЗрдВ рдЭреБрдирдЭреБрдиреА рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЭрдкрдХреА рд▓реЗрдВ - рдпрд╣ рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП class ConsoleGameRenderer(loader: StringLoader) : ConsoleRenderer(loader), GameRenderer { private fun drawLocationTopPanel(location: Location, heroesAtLocation: List<Hero>, currentHero: Hero, timer: Int) { val closedString = loadString("closed").toLowerCase() val timeString = loadString("time") val locationName = location.name.toString().toUpperCase() val separatorX1 = locationName.length + if (location.isOpen) { 6 + if (location.bag.size >= 10) 2 else 1 } else { closedString.length + 7 } val separatorX2 = CONSOLE_WIDTH - timeString.length - 6 - if (timer >= 10) 1 else 0
рдЗрд╕ рд╕рднреА рдХреЛрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдЫреЛрдЯреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрдИрдбреАрдИ рдХрдВрд╕реЛрд▓ рдПрдПрдирдПрд╕рдЖрдИ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдХреНрд░рдо рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рдереА)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдПрдирдПрд╕рдЖрдИ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рдирд╣реАрдВ рд╣реИ - рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ 10 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдорд╛рдирдХ cmd.exe рд╣рдореЗрдВ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдкреНрд░рджрд░реНрд╢рди (рдФрд░ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЬреЛ рд╣рдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ) рдХреЗ рд╕рд╛рде рдЦреБрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ PowerShell рдиреЗ рддреБрд░рдВрдд рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдирд╣реАрдВ рд╕реАрдЦрд╛ (рд╡рд░реНрддрдорд╛рди рдорд╛рдВрдЧ рдХреЗ рдмрд╛рд╡рдЬреВрдж)ред рдпрджрд┐ рдЖрдк рдЕрд╢реБрдн рд╣реИрдВ, рддреЛ рдирд┐рд░рд╛рд╢ рдордд рд╣реЛ - рд╣рдореЗрд╢рд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрддреЗ рд╣реИрдВ ( рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП )ред рдФрд░ рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВредрдЪрд░рдг рджрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ
рд╕реНрдХреНрд░реАрди рдкрд░ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЕрднреА рднреА рдЖрдзреА рд▓рдбрд╝рд╛рдИ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рднреА рдЙрддрдирд╛ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдпрд╣ рдХрд╛рд░реНрдп, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдкрд┐рдЫрд▓реЗ рд╕рднреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдмрд╛рддреЗрдВ рдкрд╣рд▓реЗредрдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ GameInteractor
ред рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рддреАрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рдиред рдЦреЗрд▓ рдЗрдВрдЬрди рдХреЛ рддрдм рддрдХ рдирд┐рд▓рдВрдмрд┐рдд рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдПрдХ рдХреБрдВрдЬреА рджрдмрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдорд╛рдирдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдХреНрд╖рдорддрд╛ Reader
, Scanner
, Console
рдирд╣реАрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЗрди рд╕рдмрд╕реЗ рдЕрд╣рдо рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ: рд╣рдо рдкреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдкреНрд░рддреНрдпреЗрдХ рдЖрджреЗрд╢ рдХреЗ рдмрд╛рдж ENTERред рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдПKeyListener
рд▓реЗрдХрд┐рди, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╕рдХрд░ рд╕реНрд╡рд┐рдВрдЧрд┐рдВрдЧ рдврд╛рдВрдЪреЗ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рд╕рднреА рдЧреНрд░рд╛рдлрд┐рдХ рдЯрд┐рдирд╕реЗрд▓ рдХреЗ рдмрд┐рдирд╛ рд╣реИредрдХреНрдпрд╛ рдХрд░реЗрдВ?
рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдФрд░ рдЗрд╕ рдмрд╛рд░ рдЙрдирдХрд╛ рдХрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЗрд╢реА рдХреЛрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ "рдЕрд▓рд╡рд┐рджрд╛, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо" ... рдпрд╛ рдирд╣реАрдВ? рдХрд╛рд╢, рдореИрдВ рдЕрднреА рддрдХ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдХрд┐ рдПрдХ рд╣рд▓реНрдХреЗ, рдордВрдЪ-рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕ рдмреАрдЪ, рдЖрдЗрдП рд░рд╛рдХреНрд╖рд╕ рдЬреЗрд▓рд╛рдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ , рдЬреЛ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ (рдХрдВрд╕реЛрд▓ рдореЗрдВ) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рд╛рд░рд╡реЗрд╕реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдВ, рдЗрд╕рдХрд╛ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд╣рд╛рдВ, рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рд▓рд┐рдирдХреНрд╕ / рдпреВрдирд┐рдХреНрд╕ (рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рджрд╛рди рдХрд░рдХреЗ) рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╣рд╛рдБ, рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдкрд░ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢, рд╣рдо рдПрдХ рд╕реМ рд╕рд╛рд▓ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдПрдХ рдЫреЛрдЯрд╛, рдЦрд░рд╛рдм рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рдо рдХрд╛ рд╣рдо рдЕрдм рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред <dependency> <groupId>jline</groupId> <artifactId>jline</artifactId> <version>2.14.6</version> <scope>compile</scope> </dependency>
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рддреАрд╕рд░реЗ, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛, рдЬрд╣рд╛рдВ ConsoleReader
рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рд╣реИ readCharacter()
ред рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ, рдпрд╣ рд╡рд┐рдзрд┐ рдХреАрдмреЛрд░реНрдб рдкрд░ рджрдмрд╛рдП рдЧрдП рд╡рд░реНрдг рдХрд╛ рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЬрдмрдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП)ред рдмрд╛рдХреА рдПрдХ рддрдХрдиреАрдХреА рдорд╛рдорд▓рд╛ рд╣реИ: рдкреНрд░рддреАрдХреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ ( Action.Type
) рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░, рдПрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рджреВрд╕рд░реЗ рдХреЛ рд▓реМрдЯрд╛рдПрдВред"рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреАрдмреЛрд░реНрдб рдХреА рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╡рд░реНрдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХрдИ рдЪрд╛рдмрд┐рдпрд╛рдБ рджреЛ, рддреАрди, рдЪрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рднрд╛рдЧрдиреЗ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд░рд╣реЗрдВ? тАЭрдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрдирдкреБрдЯ рдХрд╛рд░реНрдп рдЬрдЯрд┐рд▓ рд╣реИ рдпрджрд┐ рд╣рдо "рдЧреИрд░-рдЪрд░рд┐рддреНрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ" рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рддреАрд░, рдПрдл-рдХреА, рд╣реЛрдо, рдЗрдВрд╕рд░реНрдЯ, PgUp / Dn, рдПрдВрдб, рдбрд┐рд▓реАрдЯ, рд╕рдВрдЦреНрдпрд╛-рдкреИрдб рдФрд░ рдЕрдиреНрдпред рд▓реЗрдХрд┐рди рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рдЖрдЗрдП ConsoleInteractor
рдЖрд╡рд╢реНрдпрдХ рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ ред abstract class ConsoleInteractor { private val reader = ConsoleReader() private val mapper = mapOf( CONFIRM to 13.toChar(), CANCEL to 27.toChar(), EXPLORE_LOCATION to 'e', FINISH_TURN to 'f', ACQUIRE to 'a', LEAVE to 'l', FORFEIT to 'f', HIDE to 'h', DISCARD to 'd', ) protected fun read() = reader.readCharacter().toChar() protected open fun getIndexForKey(key: Char) = "1234567890abcdefghijklmnopqrstuvw".indexOf(key) }
рдирдХреНрд╢рд╛ mapper
рдФрд░ рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ read()
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЙрди getIndexForKey()
рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдБ рд╣рдореЗрдВ рдХрд┐рд╕реА рд╕реВрдЪреА рдпрд╛ рдХреНрдпреВрдмреНрд╕ рд╕реЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ GameInteractor
редрд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдб: class ConsoleGameInteractor : ConsoleInteractor(), GameInteractor { override fun anyInput() { read() } override fun pickAction(list: ActionList): Action { while (true) { val key = read() list .filter(Action::isEnabled) .find { mapper[it.type] == key } ?.let { return it } } } override fun pickDiceFromHand(activePositions: HandMask, actions: ActionList) : Action { while (true) { val key = read() actions.forEach { if (mapper[it.type] == key && it.isEnabled) return it } when (key) { in '1'..'9' -> { val index = key - '1' if (activePositions.checkPosition(index)) { return Action(HAND_POSITION, data = index) } } '0' -> { if (activePositions.checkPosition(9)) { return Action(HAND_POSITION, data = 9) } } in 'a'..'f' -> { val allyIndex = key - 'a' if (activePositions.checkAllyPosition(allyIndex)) { return Action(HAND_ALLY_POSITION, data = allyIndex) } } } } } }
рд╣рдорд╛рд░реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╡рд┐рдирдореНрд░ рдФрд░ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ рддрд╛рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЕрдкрд░реНрдпрд╛рдкреНрдд рдмрдХрд╡рд╛рд╕реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рди рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╡реЗ рд╕реНрд╡рдпрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЪрдпрдирд┐рдд рдХреНрд░рд┐рдпрд╛ рд╕рдХреНрд░рд┐рдп рд╣реИ, рдФрд░ рдЪрдпрдирд┐рдд рд╣рд╛рде рдХреА рд╕реНрдерд┐рддрд┐ рд╡реИрдз рдХреЗ рд╕реЗрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕рднреА рдЕрдкрдиреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирдореНрд░ рд░рд╣реЗрдВредрдЧреНрдпрд╛рд░рд╣ рдХрджрдоред рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЧреАрдд
рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рдзреНрд╡рдирд┐ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЧреЗрдо рдЦреЗрд▓рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╡рд░ рдХреЗ рдиреАрдЪреЗ рдПрдХ рдЯреИрдмрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдЬрдмрдХрд┐ рдШрд░ рдкрд░ рдХреЛрдИ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ), рддреЛ рдЖрдк рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рддрдирд╛ рдЦреЛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдЖрдзрд╛ рдЦреЗрд▓ рдЦреЗрд▓рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдзреНрд╡рдирд┐ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрдИ рдЦреЗрд▓реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдХрдИ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░рд┐рд╡рд░реНрд╕ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдХреЛрдИ рдЖрд╡рд╛рдЬрд╝ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдпрд╛ рд╡реЗ рдЗрддрдиреА рджрдпрдиреАрдп рд╣реИрдВ рдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛)ред рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рдЙрдЪреНрдЪ рдпреЛрдЧреНрдпрддрд╛ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдбрд╝реЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдЦреЗрд▓ рдореЗрдВ рдСрдбрд┐рдпреЛ рдШрдЯрдХ (рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ) рд╣реЛрдирд╛ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗред рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ, рдзреНрд╡рдирд┐ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,рдЬрдм рд╕рдордп рдФрд░ рдореВрдб рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред, тАФ , . , . , . , . , , тАФ , тАФ , . , : , , тАФ , . , тАФ , тАФ . ? , . , ( , , ).
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛, рдЕрдм рдЕрднреНрдпрд╛рд╕ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ: рдЬрд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЧреЗрдо рдлрд╛рдЗрд▓реЗрдВ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП? рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдмрджрд╕реВрд░рдд рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреБрд░рд╛рдиреЗ рдорд╛рдЗрдХреНрд░реЛрдлреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдлреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЗрдВрдЯрд░рдиреЗрдЯ рд╡реАрдбрд┐рдпреЛ рд╕реЗ рднрд░рд╛ рд╣реИ рдХрд┐ рдЕрдирд╛рдирд╛рд╕ рдХреЗ рд╢реАрд░реНрд╖ рдХреЛ рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВ рдпрд╛ рдПрдХ рдмреВрдЯ рдХреЗ рд╕рд╛рде рдмрд░реНрдл рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рдХреБрдЪрд▓ рд╣рдбреНрдбрд┐рдпреЛрдВ рдФрд░ рдПрдХ рдЦрд╕реНрддрд╛ рд░реАрдврд╝ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрддрд┐рдпрдерд╛рд░реНрдерд╡рд╛рдж рдХреЗ рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рджреЗрд╢реА рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреА рдЖрд╡рд╛рдЬрд╝ рдпрд╛ рд░рд╕реЛрдИ рдХреЗ рдмрд░реНрддрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рдВрдЧреАрдд рд╡рд╛рджреНрдпрдпрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ - рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдлрд▓ рд╡рд╛рд▓реЗ - рдЬрд╣рд╛рдВ рдпрд╣ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдпрд╛ рдЖрдк freesound.org рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВрдЬрд╣рд╛рдБ рд╕реМ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдерд╛ред рдХреЗрд╡рд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдХрдИ рд▓реЗрдЦрдХ рдЕрдкрдиреА рдЬрд╝реЛрд░ рдХреА рдЦрд╛рдБрд╕реА рдпрд╛ рдлрд░реНрд╢ рдкрд░ рдлреЗрдВрдХреЗ рдЧрдП рд╕рд┐рдХреНрдХреЛрдВ рдХреА рдСрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВ - рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореВрд▓ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рднреБрдЧрддрд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╛ рдЕрдкрдиреЗ рд░рдЪрдирд╛рддреНрдордХ рдЫрджреНрдо рдирд╛рдо (рдХрднреА-рдХрднреА рдмрд╣реБрдд рд╡рд┐рдЪрд┐рддреНрд░) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдордЬрджреВрд░реЛрдВ рдХреЗ рдлрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВредрдЕрдкрдиреА рдкрд╕рдВрдж рдХреА рдлрд╛рдЗрд▓реЗрдВ рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдХрд╣реАрдВ рд░рдЦ рджреЗрдВред рдЙрдирдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред enum class Sound { TURN_START,
рдЪреВрдВрдХрд┐ рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ: interface SoundPlayer { fun play(sound: Sound) }
рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддрд░рд╣ GameRenderer
рдФрд░ GameInteractor
, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Game
ред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: class MuteSoundPlayer : SoundPlayer { override fun play(sound: Sound) {
рдмрд╛рдж рдореЗрдВ, рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рд╕рдВрдЧреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВредрдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рддрд░рд╣, рдпрд╣ рдЦреЗрд▓ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реА рддрд░рд╣, рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЦреЗрд▓ рдХреЛ рдЕрдиреБрдкрдпреБрдХреНрдд рд╕рдВрдЧреАрдд рдХреЗ рд╕рд╛рде рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдзреНрд╡рдирд┐рдпреЛрдВ рдХреА рддрд░рд╣, рд╕рдВрдЧреАрдд рд╡рд┐рдиреАрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрдирд╛ (рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдХреЛрдИ рдХрд▓рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ (рдЖрд╢рд╛ рди рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдШрд╛рдд рд▓рдЧрд╛рдП рдФрд░ рдирд┐рд░реНрджрдпрддрд╛ рд╕реЗ рдорд╛рд░ рдбрд╛рд▓рд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд╛рдпрдХ, рдЕрдЧрд░ рдЙрд╕рдХреА рддреНрд░рд╛рд╕рдж рдореГрддреНрдпреБ рдХрд╛ рджреГрд╢реНрдп рдмрдЪреНрдЪреЛрдВ рдХреЗ рдЧреАрдд рдХреЗ рдордЬрд╝реЗрджрд╛рд░ рд╕рдВрдЧреАрдд рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛)ред рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд▓реЛрдЧ рдРрд╕реЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ (рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ), рд▓реЗрдХрд┐рди рд╣рдо, рдЧреЗрдордмрд┐рд▓рд┐рдВрдЧ рдЬреАрдирд┐рдпрд╕ рдХреЗ рд╢реБрд░реБрдЖрддреА рдХреЗ рд░реВрдк рдореЗрдВ, рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╣реАрдВ рдкрд░ рдЬрд╛рдПрдВfreemusicarchive.org рдпрд╛ soundcloud.com (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ YouTube) рдФрд░ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдХреБрдЫ рдвреВрдВрдвреЗрдВред рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рд╡реЗрд╢ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░рд╛рдЧ рдХреЗ рдмрд┐рдирд╛ рд╢рд╛рдВрдд, рдЪрд┐рдХрдирд╛ рд╕рдВрдЧреАрдд, рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкрд░ рдбрдмрд▓ рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирд┐: рд╢реБрд▓реНрдХ рд╕рдВрдЧреАрдд рдХрднреА-рдХрднреА рдкреНрд░рддрд┐рднрд╛рд╢рд╛рд▓реА рд╕рдВрдЧреАрддрдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд▓рд╛рдпрдХ рд╣реИрдВ, рдпрджрд┐ рдореМрджреНрд░рд┐рдХ рдЗрдирд╛рдо рдирд╣реАрдВ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдорд╛рдиреНрдпрддрд╛редрдЖрдЗрдП рдПрдХ рдФрд░ рдЧрдгрдирд╛ рдмрдирд╛рдПрдВ: enum class Music { SCENARIO_MUSIC_1, SCENARIO_MUSIC_2, SCENARIO_MUSIC_3, }
рдЗрд╕реА рддрд░рд╣, рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЗрд╕рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред interface MusicPlayer { fun play(music: Music) fun stop() } class MuteMusicPlayer : MusicPlayer { override fun play(music: Music) {
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛ рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдПрдХ рдкреНрд▓реЗрдмреИрдХ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рднреА рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЗ (рд░реЛрдХреЗрдВ / рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ, рд░рд┐рд╡рд╛рдЗрдВрдб, рдЖрджрд┐) рдХрд╛рдо рдореЗрдВ рдЖрдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдпреЗ рджреЛрдиреЛрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВредрд╣рд░ рдмрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдЦрд┐рд▓рд╛рдбрд╝реА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рдордп рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ ekzepmlyar рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рднреА рдПрдХ рдЕрд▓рдЧ рд╡рд╕реНрддреБ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЧреАрдд рддрд░реАрдХреЛрдВ рдЦреЗрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджреНрдпрдо рд╣реЛрдЧрд╛ рдПрдХ рдЕрдХреЗрд▓реЗ (рд╕рд┐рдВрдЧрд▓рдЯрди)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрд┐рдореНрдореЗрджрд╛рд░ рдСрдбрд┐рдпреЛ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рд╣рдореЗрд╢рд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдмреИрдХ рд╕рд┐рд╕реНрдЯрдо рдХреНрд▓рд╛рд╕ рдЖрд░реЗрдЦ рдХреНрд▓рд╛рд╕ Audio
рд╣рдорд╛рд░рд╛ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИред рдпрд╣ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рдирдпрд╛ рдореБрдЦреМрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ ... рд╡реИрд╕реЗ, рдпрд╣рд╛рдБ рдореБрдЦреМрдЯрд╛ (рдореБрдЦреМрдЯрд╛) рд╣реИ - рдПрдХ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЗрди рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдмрд╛рд░-рдмрд╛рд░ рд╡рд░реНрдгрд┐рдд (рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде)ред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреАрдЫреЗ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рдЪреАрдЦреЗрдВ рд╕реБрдирддреЗ рд╣реБрдП, рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬреНрдЮрд╛рдд рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдордЭрд╛рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реВрдВред рдХреЛрдб рд╣реИ: object Audio { private var soundPlayer: SoundPlayer = MuteSoundPlayer() private var musicPlayer: MusicPlayer = MuteMusicPlayer() fun init(soundPlayer: SoundPlayer, musicPlayer: MusicPlayer) { this.soundPlayer = soundPlayer this.musicPlayer = musicPlayer } fun playSound(sound: Sound) = this.soundPlayer.play(sound) fun playMusic(music: Music) = this.musicPlayer.play(music) fun stopMusic() = this.musicPlayer.stop() }
рдпрд╣ init()
рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣реАрдВ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ) рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдорд░ рдЬрд╛рдПрдЧрд╛ - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрд╡рд╣ рд╕рдм рд╣реИред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд▓реЗрдмреИрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдорд╛рд░реНрдЯ рд▓реЛрдЧ рдХрд╣рддреЗ рд╣реИрдВ, рдирдореВрдиреЗ рд╣реИрдВ ), рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд░реНрдЧ AudioSystem
рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ Clip
ред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ (рдЬреЛ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рд╕рдкреИрде рдореЗрдВ рд╣реИ, рдпрд╛рдж рд╣реИ?) рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? import javax.sound.sampled.AudioSystem class BasicSoundPlayer : SoundPlayer { private fun pathToFile(sound: Sound) = "/sound/${sound.toString().toLowerCase()}.wav" override fun play(sound: Sound) { val url = javaClass.getResource(pathToFile(sound)) val audioIn = AudioSystem.getAudioInputStream(url) val clip = AudioSystem.getClip() clip.open(audioIn) clip.start() } }
open()
IOException
( - тАФ - ),
try-catch
, , .
┬л , ...┬╗. , (, mp3) Java , ( ). ,
JLayer . :
<dependencies> <dependency> <groupId>com.googlecode.soundlibs</groupId> <artifactId>jlayer</artifactId> <version>1.0.1.4</version> <scope>compile</scope> </dependency> </dependencies>
.
class BasicMusicPlayer : MusicPlayer { private var currentMusic: Music? = null private var thread: PlayerThread? = null private fun pathToFile(music: Music) = "/music/${music.toString().toLowerCase()}.mp3" override fun play(music: Music) { if (currentMusic == music) { return } currentMusic = music thread?.finish() Thread.yield() thread = PlayerThread(pathToFile(music)) thread?.start() } override fun stop() { currentMusic = null thread?.finish() }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд▓реЗрдмреИрдХ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддреА рд╣реИ, рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдореБрдЦреНрдп рд╕реНрдЯреНрд░реАрдо рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб ( PlayerThread
) рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП , рдФрд░ рдЗрд╕реЗ "рд╡реИрдХрд▓реНрдкрд┐рдХ" (рдбреЗрдореЙрди) рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдЬрд▓реНрджреА рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗред рджреВрд╕рд░реЗ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд▓реЗрдЗрдВрдЧ рдореНрдпреВрдЬрд┐рдХ рдлрд╝рд╛рдЗрд▓ ( currentMusic
) рдХреА рдкрд╣рдЪрд╛рди рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛрдб рдореЗрдВ рд╣реЛрддреА рд╣реИ ред рдпрджрд┐ рдХреЛрдИ рджреВрд╕рд░рд╛ рдХрдорд╛рдВрдб рдЕрдЪрд╛рдирдХ рдЗрд╕реЗ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдкреНрд▓реЗрдмреИрдХ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рддреАрд╕рд░рд╛, рд╕рдВрдЧреАрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рдЗрд╕рдХрд╛ рдкреНрд▓реЗрдмреИрдХ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ - рдФрд░ рддрдм рддрдХ рдЬрдм рддрдХ рдХрд┐ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреНрд░реАрдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПfinish()
(рдпрд╛ рдЬрдм рддрдХ рдЕрдиреНрдп рдзрд╛рдЧреЗ рдкреВрд░реЗ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЪреМрдерд╛, рдпрджреНрдпрдкрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЭрдВрдбреЗ рдФрд░ рдЖрджреЗрд╢реЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдмрдЧ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЕрдЪрд╛рдирдХ рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореЗрдореЛрд░реА рд▓реАрдХ рдХреА рдУрд░ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдиреБрд╡рдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЪрдордХрддрд╛ рд╣реИ рддрд╛рдЬрдЧреА рдФрд░ рдкрд╡рд┐рддреНрд░рддрд╛ред рдЗрд╕реЗ рд▓реЗрдВ рдФрд░ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрдЪрд░рдг рдмрд╛рд░рд╣ред рд╕реНрдерд╛рдиреАрдпрдХрд░рдг
рд╣рдорд╛рд░рд╛ рдЦреЗрд▓ рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЗрд╕реЗ рдирд╣реАрдВ рдЦреЗрд▓реЗрдЧрд╛ред рдХреНрдпреЛрдВ?
"рдХреЛрдИ рд░реВрд╕реА рдирд╣реАрдВ рд╣реИ! .. рдХреЛрдИ рд░реВрд╕реА рдирд╣реАрдВ рд╣реИ! .. рд░реВрд╕реА рднрд╛рд╖рд╛ рдЬреЛрдбрд╝реЗрдВ! .. рдХреБрддреНрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд!"рд╕реНрдЯреЛрд░ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдХрд┐рд╕реА рднреА рджрд┐рд▓рдЪрд╕реНрдк рдХрд╣рд╛рдиреА рдЧреЗрдо (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЛрдмрд╛рдЗрд▓) рдХрд╛ рдкреГрд╖реНрда рдЦреЛрд▓реЗрдВ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдкрдврд╝реЗрдВред рдХреНрдпрд╛ рд╡реЗ рдЕрджреНрднреБрдд, рд╣рд╛рде рд╕реЗ рддреИрдпрд╛рд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗ? рдпрд╛ рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рдзреНрд╡рдирд┐ рдкрд░ рдЕрдЪрдВрднрд╛? рдпрд╛ рдПрдХ рд░реЛрдорд╛рдВрдЪрдХ рдХрд╣рд╛рдиреА рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рдорд┐рдирдЯ рд╕реЗ рдирд╢реЗ рдХреА рд▓рдд рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдВрдд рддрдХ рдЬрд╛рдиреЗ рдирд╣реАрдВ рджреЗрддреА рд╣реИ?рдирд╣реАрдВред
рдЕрд╕рдВрддреБрд╖реНрдЯ "рдЦрд┐рд▓рд╛рдбрд╝реА" рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рджреЗрдЧрд╛ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдЦреЗрд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкреИрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдФрд░ рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдПред рд╣рд╛рдВ, рдЖрдк рдЕрдкрдиреА рдЙрддреНрдХреГрд╖реНрдЯ рдХреГрддрд┐ рдХреЛ рд╕рднреА 95 рд╡рд┐рд╢реНрд╡ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдПред рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ, рдЬрд┐рдирдХреЗ рд╡рд╛рд╣рдХ рдЬреЛрд░ рд╕реЗ рдЪрд┐рд▓реНрд▓рд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИ! рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ?
рдорд╣реАрдиреЛрдВ рдХреА рдореЗрд╣рдирдд, рд▓рдВрдмреА рдиреАрдВрдж рдХреА рд░рд╛рддреЗрдВ, рд▓рдЧрд╛рддрд╛рд░ рдирд░реНрд╡рд╕ рдмреНрд░реЗрдХрдбрд╛рдЙрди - рдпрд╣ рд╕рдм рдкреВрдВрдЫ рдХреЗ рдиреАрдЪреЗ рдПрдХ рд╣рдореНрд╕рдЯрд░ рд╣реИред рдЖрдкрдиреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЦреЛ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрддреЛ рдЖрдЧреЗ рд╕реЛрдЪрд┐рдпреЗред рдЕрдкрдиреЗ рд▓рдХреНрд╖рд┐рдд рджрд░реНрд╢рдХреЛрдВ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВ, рдХрдИ рдкреНрд░рдореБрдЦ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЕрдиреБрд╡рд╛рдж рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЖрджреЗрд╢ рджреЗрдВ ... рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░реЗрдВ рдЬреЛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рд╡рд┐рд╖рдпрдЧрдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ (рдореБрдЭрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрд╢рд┐рдпрд╛рд░)ред рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рддрдХрдиреАрдХреА рдкрдХреНрд╖ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рдж рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рджрд░реНрдж рд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПредрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╛рдж рд░рдЦреЗрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдереЗ String
? рдЕрдм рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рднрд╛рд╖рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЙрди рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднреА рдЕрдиреБрд╡рд╛рдж рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдирдХреА рдЖрдк рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣: class TestEnemyTemplate : EnemyTemplate { override val name = "Test enemy" override val description = "Some enemy standing in your way." override val nameLocalizations = mapOf( "ru" to " -", "ar" to "╪и╪╣╪╢ ╪з┘Д╪╣╪п┘И", "iw" to "╫Р╫Щ╫Ц╫Ф ╫Р╫Х╫Щ╫С", "zh" to "ф╕Аф║ЫцХ╡ф║║", "ua" to "╤Ц " ) override val descriptionLocalizations = mapOf( "ru" to " - .", "ar" to "┘И╪╡┘Б ╪з┘Д╪╣╪п┘И", "iw" to "╫к╫Щ╫Р╫Х╫и ╫Ф╫Р╫Х╫Щ╫С", "zh" to "ф╕Аф║ЫцХ╡ф║║чЪДцППш┐░", "ua" to " ╤Ч ╤Ц ." ) override val traits = listOf<Trait>() }
рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╣рдореЗрд╢рд╛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрддрд┐рдо рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ, рдореИрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдирд╣реАрдВ рдлреИрд▓рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред class LocalizedString(defaultValue: String, localizations: Map<String, String>) { private val default: String = defaultValue private val values: Map<String, String> = localizations.toMap() operator fun get(lang: String) = values.getOrDefault(lang, default) override fun equals(other: Any?) = when { this === other -> true other !is LocalizedString -> false else -> default == other.default } override fun hashCode(): Int { return default.hashCode() } }
рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЬрдирд░реЗрдЯрд░ рдХреЛрдб рдХреЛ рд╕рд╣реА рдХрд░реЗрдВред fun generateEnemy(template: EnemyTemplate) = Enemy().apply { name = LocalizedString(template.name, template.nameLocalizations) description = LocalizedString(template.description, template.descriptionLocalizations) template.traits.forEach { addTrait(it) } }
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдкрд░рд┐рд╡рд░реНрддрди рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред val language = Locale.getDefault().language val enemyName = enemy.name[language]
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рднрд╛рд╖рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ Locale
рджреЗрд╢ рдФрд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рд╕реНрд╡рднрд╛рд╡ LocalizedString
рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рд╡реИрд╕реЗ рднреА рдЦреБрд╢ рд╣реИрдВредрд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕рдореЗрдВ ResourceBundle
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрдВрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдХреЗрд╡рд▓ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓реЗрдВ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдЙрдирдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред # Game status messages choose_dice_perform_check= : end_of_turn_discard_extra= : : end_of_turn_discard_optional= : : choose_action_before_exploration=, : choose_action_after_exploration= . ? encounter_physical= . . encounter_somatic= . . encounter_mental= . . encounter_verbal= . . encounter_divine= . : die_acquire_success= ! die_acquire_failure= . game_loss_out_of_time= # Die types physical= somatic= mental= verbal= divine= ally= wound= enemy= villain= obstacle= # Hero types and descriptions brawler= hunter= # Various labels avg= bag= bag_size= class= closed= discard= empty= encountered= fail= hand= heros_turn= %s max= min= perform_check= : pile= received_new_die= result= success= sum= time= total= # Action names and descriptions action_confirm_key=ENTER action_confirm_name= action_cancel_key=ESC action_cancel_name= action_explore_location_key=E action_explore_location_name= action_finish_turn_key=F action_finish_turn_name= action_hide_key=H action_bag_name= action_discard_key=D action_discard_name= action_acquire_key=A action_acquire_name= action_leave_key=L action_leave_name= action_forfeit_key=F action_forfeit_name=
: , . ( ), , -, , -, , . , тАФ - , (, , , тАФ ).
class PropertiesStringLoader(locale: Locale) : StringLoader { private val properties = ResourceBundle.getBundle("text.strings", locale) override fun loadString(key: String) = properties.getString(key) ?: "" }
ред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, ResourceBundle
рд╡рд╣ рдЦреБрдж рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд▓реЛрдХреЗрд▓ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╡рд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рд╡рд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рд╛рдЗрд▓ ( string.properties
) рд▓реЗрдЧрд╛ ред рдФрд░ рд╕рдм рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ ...рдЕрд╣рд╛! рд╡рд╣рд╛рдБ рдпрд╣ рдерд╛!, Unicode
.properties
Java 9. ISO-8859-1 тАФ
ResourceBundle
. , , тАФ . Unicode- тАФ , , :
'\uXXXX'
. , , Java
native2ascii , . :
# Game status messages choose_dice_perform_check=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: end_of_turn_discard_extra=\u041a\u041e\u041d\u0415\u0426 \u0425\u041e\u0414\u0410: \u0421\u0431\u0440\u043e\u0441\u044c\u0442\u0435 \u043b\u0438\u0448\u043d\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438: end_of_turn_discard_optional=\u041a\u041e\u041d\u0415\u0426 \u0425\u041e\u0414\u0410: \u0421\u0431\u0440\u043e\u0441\u044c\u0442\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e: choose_action_before_exploration=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c: choose_action_after_exploration=\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435? encounter_physical=\u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d \u0424\u0418\u0417\u0418\u0427\u0415\u0421\u041a\u0418\u0419 \u043a\u0443\u0431\u0438\u043a. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443. encounter_somatic=\u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d \u0421\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u0418\u0419 \u043a\u0443\u0431\u0438\u043a. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443. encounter_mental=\u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d \u041c\u0415\u041d\u0422\u0410\u041b\u042c\u041d\u042b\u0419 \u043a\u0443\u0431\u0438\u043a. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443. encounter_verbal=\u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d \u0412\u0415\u0420\u0411\u0410\u041b\u042c\u041d\u042b\u0419 \u043a\u0443\u0431\u0438\u043a. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443. encounter_divine=\u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d \u0411\u041e\u0416\u0415\u0421\u0422\u0412\u0415\u041d\u041d\u042b\u0419 \u043a\u0443\u0431\u0438\u043a. \u041c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: die_acquire_success=\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043a\u0443\u0431\u0438\u043a! die_acquire_failure=\u0412\u0430\u043c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0443\u0431\u0438\u043a. game_loss_out_of_time=\u0423 \u0432\u0430\u0441 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0435\u043c\u044f
. тАФ . тАФ . , IDE ( ) ┬л ┬╗, тАФ - ( ), IDE, .
, .
getBundle()
, , ,
ResourceBundle.Control
тАФ - .
class PropertiesStringLoader(locale: Locale) : StringLoader { private val properties = ResourceBundle.getBundle( "text.strings", locale, Utf8ResourceBundleControl()) override fun loadString(key: String) = properties.getString(key) ?: "" }
, , :
class Utf8ResourceBundleControl : ResourceBundle.Control() { @Throws(IllegalAccessException::class, InstantiationException::class, IOException::class) override fun newBundle(baseName: String, locale: Locale, format: String, loader: ClassLoader, reload: Boolean): ResourceBundle? { val bundleName = toBundleName(baseName, locale) return when (format) { "java.class" -> super.newBundle(baseName, locale, format, loader, reload) "java.properties" -> with((if ("://" in bundleName) null else toResourceName(bundleName, "properties")) ?: return null) { when { reload -> reload(this, loader) else -> loader.getResourceAsStream(this) }?.let { stream -> InputStreamReader(stream, "UTF-8").use { r -> PropertyResourceBundle(r) } } } else -> throw IllegalArgumentException("Unknown format: $format") } } @Throws(IOException::class) private fun reload(resourceName: String, classLoader: ClassLoader): InputStream { classLoader.getResource(resourceName)?.let { url -> url.openConnection().let { connection -> connection.useCaches = false return connection.getInputStream() } } throw IOException("Unable to load data!") } }
, тАж , ( ) тАФ ( Kotlin ). тАФ ,
.properties
UTF-8 - .
рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ - рдХреЗрд╡рд▓ JRE рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рднрд╛рд╖рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ: java -Duser.language=ru -jar path_to_project\Dice\target\dice-1.0-jar-with-dependencies.jar
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВ, Windows (cmd.exe) 437 ( DOSLatinUS), тАФ . , UTF-8 , :
chcp 65001
Java , , . :
java -Dfile.encoding=UTF-8 -Duser.language=ru -jar path_to_project\Dice\target\dice-1.0-jar-with-dependencies.jar
, , Unicode- (, Lucida Console)
рд╣рдорд╛рд░реЗ рд╕рднреА рд░реЛрдорд╛рдВрдЪрдХ рдХрд╛рд░рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЧрд░реНрд╡ рд╕реЗ рдЖрдо рдЬрдирддрд╛ рдХреЗ рд╕рд╛рдордиреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛрд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: "рд╣рдо рдХреБрддреНрддреЗ рдирд╣реАрдВ рд╣реИрдВ!"рдирд╕реНрд▓реАрдп рдЖрд╕реНрдерд╛ рд╡рд┐рдХрд▓реНрдк рдФрд░ рд╡рд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдЪрд░рдг рддреЗрд░рд╣ рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛
рдЪреМрдХрд╕ рдкрд╛рдардХреЛрдВ рдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХрднреА рднреА рдЙрдирдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд▓реМрдЯрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдХреМрди рд╕реА рдХрдХреНрд╖рд╛ рд╕реНрдерд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдирдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред рддреАрд╕рд░рд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╕рд░рд▓ рдФрд░ рд╕рд╕реНрддрд╛ рд╣реИ (рдФрд░ рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрддрд┐рд╣рд╛рд╕ рдирд╣реАрдВ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рд╕реЗрд╕, рдкреИрдХреЗрдЬ, рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЪрд░ рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ - рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ (рдЖрдк рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦреЗрдВ) , рд╣реИ рдирд╛?)редрдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдмрдЪрд╛ рд╣реБрдЖ рд╣реИ, рд╡рд╣ рд╣реИ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, main()
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛ рд▓реА рд╣реИ , рдЕрдм рд╣рдо рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рднрд░ рджреЗрдВрдЧреЗред рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЗрд▓рд╛рдХреЗ;
- рдирд╛рдпрдХреЛрдВ;
- рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
GameInteractor
; - рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
GameRenderer
рдФрд░ StringLoader
; - рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
SoundPlayer
рдФрд░ MusicPlayer
; - рд╡рд░реНрдЧ рд╡рд╕реНрддреБ
Game
; - рд╢реИрдореНрдкреЗрди рдХреА рдПрдХ рдмреЛрддрд▓ред
рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!
fun main(args: Array<String>) { Audio.init(BasicSoundPlayer(), BasicMusicPlayer()) val loader = PropertiesStringLoader(Locale.getDefault()) val renderer = ConsoleGameRenderer(loader) val interactor = ConsoleGameInteractor() val template = TestScenarioTemplate() val scenario = generateScenario(template, 1) val locations = generateLocations(template, 1, heroes.size) val heroes = listOf( generateHero(Hero.Type.BRAWLER, "Brawler"), generateHero(Hero.Type.HUNTER, "Hunter") ) val game = Game(renderer, interactor, scenario, locations, heroes) game.start() }
рд╣рдо рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ рддреБрдо рдЬрд╛рдУредрдЪрд░рдг рдЪреМрджрд╣ред рдЦреЗрд▓ рд╕рдВрддреБрд▓рди
рдЙрдореНрдореНрдореНрдотАжрдЪрд░рдг рдкрдВрджреНрд░рд╣ред рдкрд░реАрдХреНрд╖рдг
рдЕрдм рдЬрдм рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдереЛрдХ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ ..."рдХреИрд╕реЗ? рдЕрднреА рдЕрднреА? рд╣рд╛рдБ, рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдереЗ, рдФрд░ рдлрд┐рд░ рдХреЛрдб! "рдХрдИ рдкрд╛рдардХреЛрдВ рдиреЗ рдареАрдХ рд╣реА рдиреЛрдЯрд┐рд╕ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб ( рдЯреАрдбреАрдбреА) рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПрдФрд░ рдЕрдиреНрдп рдлреИрд╢рдиреЗрдмрд▓ рддрд░реАрдХреЗ)ред рджреВрд╕рд░реЛрдВ рдХреЛ рдирд╛рд░рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдореВрд░реНрдЦ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рдХрдо рд╕реЗ рдХрдо рд╡реЗ рдХреБрдЫ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВ, рдЕрдиреНрдпрдерд╛ рд╕рднреА рдкреНрд░реЗрд░рдгрд╛ рдЦреЛ рдЬрд╛рдПрдЧреАред рдПрдХ рдФрд░ рдпреБрдЧрд▓ рдмреЗрд╕рдмреЛрд░реНрдб рдореЗрдВ рдЧреИрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдЧрд╛ рдФрд░ рд╕рдордпрдмрджреНрдз рд░реВрдк рд╕реЗ рдХрд╣реЗрдЧрд╛: "рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ - рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" ... рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмреВрдЯ рдХреЗ рд╕рд╛рде рдЪреЗрд╣рд░реЗ рдореЗрдВ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдкреАрдЫреЗ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рд╡реИрдЪрд╛рд░рд┐рдХ рдЯрдХрд░рд╛рд╡ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ (рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рднрд░реЗ рд╣реБрдП рд╣реИрдВ), рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реВрдВред рд╣рд╛рдВ, рдкрд░реАрдХреНрд╖рдг рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдХреЛрдб рдореЗрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рдмрджрд▓рддреЗ рд╣реИрдВ рдпрд╛ рдЬрдЯрд┐рд▓ рдЧрдгрдирд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ), рд╣рд╛рдВ, рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╕рднреА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдмрд╛рд╣рд░реА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рд╣рд╛рдБ, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдЗрд╕рдХреЗ рдХрдИ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдХрдо рд╕реЗ рдХрдо рдкрд╛рдВрдЪ рдХрд╛ рдирд╛рдо рдерд╛),рдФрд░ рд╣рд╛рдВ, рд╣рдо рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдорд╛рд░рд╛ рд▓реЗрдЦ рдХреБрдЫ рдФрд░ рд╣реИред: ( ) . , . , ( ), , . ,
Renderer
тАФ . , .
, . . : , . , . , :
public class DieGeneratorTest { @Test public void testGetMaxLevel() { assertEquals("Max level should be 3", 3, DieGeneratorKt.getMaxLevel()); } @Test public void testDieGenerationSize() { DieTypeFilter filter = new SingleDieTypeFilter(Die.Type.ALLY); List<? extends List<Integer>> allowedSizes = Arrays.asList( null, Arrays.asList(4, 6, 8), Arrays.asList(4, 6, 8, 10), Arrays.asList(6, 8, 10, 12) ); IntStream.rangeClosed(1, 3).forEach(level -> { for (int i = 0; i < 10; i++) { int size = DieGeneratorKt.generateDie(filter, level).getSize(); assertTrue("Incorrect level of die generated: " + size, allowedSizes.get(level).contains(size)); assertTrue("Incorrect die size: " + size, size >= 4); assertTrue("Incorrect die size: " + size, size <= 12); assertTrue("Incorrect die size: " + size, size % 2 == 0); } }); } @Test public void testDieGenerationType() { List<Die.Type> allowedTypes1 = Arrays.asList(Die.Type.PHYSICAL); List<Die.Type> allowedTypes2 = Arrays.asList(Die.Type.PHYSICAL, Die.Type.SOMATIC, Die.Type.MENTAL, Die.Type.VERBAL); List<Die.Type> allowedTypes3 = Arrays.asList(Die.Type.ALLY, Die.Type.VILLAIN, Die.Type.ENEMY); for (int i = 0; i < 10; i++) { Die.Type type1 = DieGeneratorKt.generateDie(new SingleDieTypeFilter(Die.Type.PHYSICAL), 1).getType(); assertTrue("Incorrect die type: " + type1, allowedTypes1.contains(type1)); Die.Type type2 = DieGeneratorKt.generateDie(new StatsDieTypeFilter(), 1).getType(); assertTrue("Incorrect die type: " + type2, allowedTypes2.contains(type2)); Die.Type type3 = DieGeneratorKt.generateDie(new MultipleDieTypeFilter(Die.Type.ALLY, Die.Type.VILLAIN, Die.Type.ENEMY), 1).getType(); assertTrue("Incorrect die type: " + type3, allowedTypes3.contains(type3)); } } }
рдпрд╛ рддреЛ:
public class BagGeneratorTest { @Test public void testGenerateBag() { BagTemplate template1 = new BagTemplate(); template1.addPlan(0, 10, new SingleDieTypeFilter(Die.Type.PHYSICAL)); template1.addPlan(5, 5, new SingleDieTypeFilter(Die.Type.SOMATIC)); template1.setFixedDieCount(null); BagTemplate template2 = new BagTemplate(); template2.addPlan(10, 10, new SingleDieTypeFilter(Die.Type.DIVINE)); template2.setFixedDieCount(5); BagTemplate template3 = new BagTemplate(); template3.addPlan(10, 10, new SingleDieTypeFilter(Die.Type.ALLY)); template3.setFixedDieCount(50); for (int i = 0; i < 10; i++) { Bag bag1 = BagGeneratorKt.generateBag(template1, 1); assertTrue("Incorrect bag size: " + bag1.getSize(), bag1.getSize() >= 5 && bag1.getSize() <= 15); assertEquals("Incorrect number of SOMATIC dice", 5, bag1.examine().stream().filter(d -> d.getType() == Die.Type.SOMATIC).count()); Bag bag2 = BagGeneratorKt.generateBag(template2, 1); assertEquals("Incorrect bag size", 5, bag2.getSize()); Bag bag3 = BagGeneratorKt.generateBag(template3, 1); assertEquals("Incorrect bag size", 50, bag3.getSize()); List<Die.Type> dieTypes3 = bag3.examine().stream().map(Die::getType).distinct().collect(Collectors.toList()); assertEquals("Incorrect die types", 1, dieTypes3.size()); assertEquals("Incorrect die types", Die.Type.ALLY, dieTypes3.get(0)); } } }
рдпрд╛ рдЗрд╕ рддрд░рд╣ рднреА: public class LocationGeneratorTest { private void testLocationGeneration(String name, LocationTemplate template) { System.out.println("Template: " + template.getName()); assertEquals("Incorrect template type", name, template.getName()); IntStream.rangeClosed(1, 3).forEach(level -> { Location location = LocationGeneratorKt.generateLocation(template, level); assertEquals("Incorrect location type", name, location.getName().get("")); assertTrue("Location not open by default", location.isOpen()); int closingDifficulty = location.getClosingDifficulty(); assertTrue("Closing difficulty too small", closingDifficulty > 0); assertEquals("Incorrect closing difficulty", closingDifficulty, template.getBasicClosingDifficulty() + level * 2); Bag bag = location.getBag(); assertNotNull("Bag is null", bag); assertTrue("Bag is empty", location.getBag().getSize() > 0); Deck<Enemy> enemies = location.getEnemies(); assertNotNull("Enemies are null", enemies); assertEquals("Incorrect enemy threat count", enemies.getSize(), template.getEnemyCardsCount()); if (bag.drawOfType(Die.Type.ENEMY) != null) { assertTrue("Enemy cards not specified", enemies.getSize() > 0); } Deck<Obstacle> obstacles = location.getObstacles(); assertNotNull("Obstacles are null", obstacles); assertEquals("Incorrect obstacle threat count", obstacles.getSize(), template.getObstacleCardsCount()); List<SpecialRule> specialRules = location.getSpecialRules(); assertNotNull("SpecialRules are null", specialRules); }); } @Test public void testGenerateLocation() { testLocationGeneration("Test Location", new TestLocationTemplate()); testLocationGeneration("Test Location 2", new TestLocationTemplate2()); } }
"рд░реЛрдХреЛ, рд░реЛрдХреЛ, рд░реЛрдХреЛ!" рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдЬрд╛рд╡рд╛ ??? "рдЖрдкрдХреЛ рдорд┐рд▓ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЬрдирд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдмреЗрд╢рдХ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрд╛рдо рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рднреВрд▓ рдЬрд╛рдПрдВрдЧреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХреНрд╖рдг рд╕реЗред рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднреВрд▓ рдЧрдП рдХрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рдФрд░ рдЕрдЧрд░ рдЕрдЪрд╛рдирдХ рдПрдХ рджрд┐рди рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдлрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рдПрдХрддреНрд░рд┐рдд рд╣реЛрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░рдг рдЬрд╛рдиреЗрдВрдЧреЗ: рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдмрджрд▓ рдЧрдИ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдкреБрд░рд╛рдиреЗ рдкрд░реАрдХреНрд╖рдг рдЕрдм рдЙрдиреНрд╣реЗрдВ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЖрдкрдиреЗ рдХреНрдпрд╛ рд╕реЛрдЪрд╛ рдерд╛?)редрдФрд░ рдПрдХ рдмрд╛рддред рдХреНрд▓рд╛рд╕ рдпрд╛рдж рд╣реИHandMaskRule
? , - , (, ┬л , , тАФ , , тАФ ┬╗ тАФ ?). ? тАж . , , ( ), , , , . ? ? ? - ? . тАФ , . тАж , :
public class TripleDieHandMaskRuleTest { private Hand hand; @Before public void init() { hand = new Hand(10); hand.addDie(new Die(Die.Type.PHYSICAL, 4));
рдпрд╣ рдердХрд╛ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрддрдирд╛ рдирд╣реАрдВ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдЖрдк рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗ (рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдФрд░ рднреА рдордЬреЗрджрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг (рдФрд░ рдХреБрдЫ рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ) рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдЪрд╛рдирдХ рд╢рд╛рдВрдд рдФрд░ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗред рдЕрдм, рдХреЛрдИ рднреА рдЫреЛрдЯрд╛ рдЯрд╛рдЗрдкреЛ рдЖрдкрдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЦрд░рд╛рдм рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ рдЬреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдХрд░рдХреЗ, рдзреАрд░реЗ-рдзреАрд░реЗ, рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╣рдорд╕реЗ рдЧрд▓рддреА рд╣реЛ рдЧрдИред рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реНрдерд╛рди рдЦреЛрдЬреЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред рддрдм рддрдХ рджреЛрд╣рд░рд╛рдПрдВред class TripleDieHandMaskRule( hand: Hand, types1: Array<Die.Type>, types2: Array<Die.Type>, types3: Array<Die.Type>) : HandMaskRule(hand) { private val types1 = types1.toSet() private val types2 = types2.toSet() private val types3 = types3.toSet() override fun checkMask(mask: HandMask): Boolean { if (mask.positionCount + mask.allyPositionCount != 3) { return false } return getCheckedDice(mask).asSequence() .filter { it.type in types1 } .any { d1 -> getCheckedDice(mask) .filter { d2 -> d2 !== d1 } .filter { it.type in types2 } .any { d2 -> getCheckedDice(mask) .filter { d3 -> d3 !== d1 } .filter { d3 -> d3 !== d2 } .any { it.type in types3 } } } } override fun isPositionActive(mask: HandMask, position: Int): Boolean { if (mask.checkPosition(position)) { return true } val die = hand.dieAt(position) ?: return false return when (mask.positionCount + mask.allyPositionCount) { 0 -> die.type in types1 || die.type in types2 || die.type in types3 1 -> with(getCheckedDice(mask).first()) { (this.type in types1 && (die.type in types2 || die.type in types3)) || (this.type in types2 && (die.type in types1 || die.type in types3)) || (this.type in types3 && (die.type in types1 || die.type in types2)) } 2-> with(getCheckedDice(mask)) { val d1 = this[0] val d2 = this[1] (d1.type in types1 && d2.type in types2 && die.type in types3) || (d2.type in types1 && d1.type in types2 && die.type in types3) || (d1.type in types1 && d2.type in types3 && die.type in types2) || (d2.type in types1 && d1.type in types3 && die.type in types2) || (d1.type in types2 && d2.type in types3 && die.type in types1) || (d2.type in types2 && d1.type in types3 && die.type in types1) } 3 -> false else -> false } } override fun isAllyPositionActive(mask: HandMask, position: Int): Boolean { if (mask.checkAllyPosition(position)) { return true } if (hand.allyDieAt(position) == null) { return false } return when (mask.positionCount + mask.allyPositionCount) { 0 -> ALLY in types1 || ALLY in types2 || ALLY in types3 1 -> with(getCheckedDice(mask).first()) { (this.type in types1 && (ALLY in types2 || ALLY in types3)) || (this.type in types2 && (ALLY in types1 || ALLY in types3)) || (this.type in types3 && (ALLY in types1 || ALLY in types2)) } 2-> with(getCheckedDice(mask)) { val d1 = this[0] val d2 = this[1] (d1.type in types1 && d2.type in types2 && ALLY in types3) || (d2.type in types1 && d1.type in types2 && ALLY in types3) || (d1.type in types1 && d2.type in types3 && ALLY in types2) || (d2.type in types1 && d1.type in types3 && ALLY in types2) || (d1.type in types2 && d2.type in types3 && ALLY in types1) || (d2.type in types2 && d1.type in types3 && ALLY in types1) } 3 -> false else -> false } } }
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдФрд░ рдореБрдЭреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдореИрдВ рдЗрд╕ рдХрдХреНрд╖рд╛ рдХреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рдерд╛ред"рдФрд░ рдореИрдВ <...> рднреА <...> рдмрд╣реБрдд <...> рдЦреБрд╢реА <...> рд╣реВрдВред рдЕрдВрджрд░ рдЬрд╛рдУ! <...> рд╡рд╛рдкрд╕! <...> рдЕрдВрддрд░ рдореЗрдВ! "рдЪрд░рдг рд╕реЛрд▓рд╣ред рдкреНрд░рддрд┐рд░реВрдкрдХрддрд╛
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдкрд░рд┐рдкрдХреНрд╡ рдмрдЪреНрдЪреЗ рдЕрдкрдиреЗ рдЬреАрд╡рди рднрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рд╢рд░рдг рдореЗрдВ рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рдЙрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдЗрддрдиреЗ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛ рдЧрдП рдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдЫрдд рдХреЗ рдиреАрдЪреЗ рдХреНрд░реИрдореНрдк рд╣реЛ рдЧрдПред рдЙрдиреНрд╣реЗрдВ рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИредрд╣рдо рдПрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддреАрди рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЕрдм рддрдХ рдмрдирд╛рдИ рдЧрдИ рд╕рднреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рддреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:- рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛: рдореЙрдбреНрдпреВрд▓, рдЦреЗрд▓ рдЗрдВрдЬрди, рдХрдиреЗрдХреНрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ( рдХреЛрд░ );
- рдкрд░рд┐рджреГрд╢реНрдп, рдЗрд▓рд╛рдХреЗ, рджреБрд╢реНрдордиреЛрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ - рддрдерд╛рдХрдерд┐рдд "рд╕рд╛рд╣рд╕рд┐рдХ" ( рд╕рд╛рд╣рд╕рд┐рдХ ) рдХреЗ рдШрдЯрдХ ;
- рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди: рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди ( cli )ред
рдЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдВрддрддрдГ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд░реЗрдЦ рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:рд╢реЛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреА рддрд░рд╣, рд╣рдорд╛рд░реЗ рдЖрдЬ рдХреЗ рдирд╛рдпрдХ рдкреВрд░реА рддрд╛рдХрдд рд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдФрд░ рд╣рдореЗрдВ рдмрд╕ рдЖрдкрд╕ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдХреЛрд░рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╢реБрджреНрдз рдЗрдВрдЬрди рд╣реИред рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ - рдХреЗрд╡рд▓ рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдХреЛрд░, рдмрдиреЗ рд░рд╣реЗред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЕрдм рд▓реЙрдиреНрдЪрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреА рднреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдорд╛рд╡реЗрди рднрдВрдбрд╛рд░ (рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ) рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдлрд╝рд╛рдЗрд▓ pom.xml
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.company</groupId> <artifactId>dice-core</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit-dep</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <kotlin.version>1.3.20</kotlin.version> <kotlin.compiler.incremental>true</kotlin.compiler.incremental> </properties> </project>
рдЕрдм рд╕реЗ рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ: mvn -f "path_to_project/DiceCore/pom.xml" install
Cli рдкрд░рд┐рдпреЛрдЬрдирд╛рдпрд╣рд╛рдВ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ - рдпрд╣ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдЧрд╛ред рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдВрдЧреА (рдпрджрд┐ рд╣рдо рдЕрдЪрд╛рдирдХ рдХреЙрдлреА рдирд┐рд░реНрдорд╛рддрд╛ рдкрд░ рдЧреЗрдо рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВ)ред рд╣рдо рддреБрд░рдВрдд рд╕рдВрд╕рд╛рдзрди (рд▓рд╛рдЗрдиреЗрдВ, рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ, рдЖрджрд┐) рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛рдлрд╝рд╛рдЗрд▓ рдореЗрдВ pom.xml
рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛рдПрдЧреА: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.company</groupId> <artifactId>dice-cli</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> <dependency> <groupId>my.company</groupId> <artifactId>dice-core</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.fusesource.jansi</groupId> <artifactId>jansi</artifactId> <version>1.17.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>jline</groupId> <artifactId>jline</artifactId> <version>2.14.6</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.googlecode.soundlibs</groupId> <artifactId>jlayer</artifactId> <version>1.0.1.4</version> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>my.company.dice.MainKt</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <kotlin.version>1.3.20</kotlin.version> <kotlin.compiler.incremental>true</kotlin.compiler.incremental> </properties> </project>
рд╣рдордиреЗ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЗрдЦ рд▓реА рд╣реИ - рд╣рдордиреЗ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИредрд░реЛрдорд╛рдВрдЪрдЦреИрд░, рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдо рдкреНрд▓реЙрдЯ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдп, рдЗрд▓рд╛рдХреЗ, рджреБрд╢реНрдорди рдФрд░ рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдХреА рдЕрдиреНрдп рдЕрдиреЛрдЦреА рд╡рд╕реНрддреБрдПрдВ рдЬреЛ рдЖрдкрдХреА рдХрдВрдкрдиреА рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рд╡рд┐рднрд╛рдЧ рдХреЗ рдХрд░реНрдордЪрд╛рд░реА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реА рдЦреБрдж рдХреА рдмреАрдорд╛рд░ рдХрд▓реНрдкрдирд╛ - рд╣рдо рдЕрднреА рднреА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдЧреЗрдо рдбрд┐рдЬрд╛рдЗрдирд░ рд╣реИрдВ)ред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд╕реЗрдЯ (рд░реЛрдорд╛рдВрдЪ) рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВ (рдмреЛрд░реНрдб рдФрд░ рд╡реАрдбрд┐рдпреЛ рдЧреЗрдо рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрд╣реА рд╣реИ, рдЬрд╛рд░ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ рддрд╛рдХрд┐ рдЧреЗрдо рдЗрдВрдЬрди рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╕рднреА рд░реЛрдорд╛рдВрдЪ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рддрдХрдиреАрдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд╛рд░реА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИредрдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ? рдЦреИрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрд┐ рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд╛рд╡рд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рдВ, рдореБрдЭреЗ рд╣рд░рд╛рдПрдВ рдФрд░ рдореБрдЭреЗ рдбрд╛рдВрдЯреЗрдВ - рдореИрдВ рдпрд╣ foresaw рдХрд░рддрд╛ рд╣реВрдВ)ред рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдкрдпреБрдХреНрдд рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ (рдЬрд╛рд╡рд╛ 6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдЖрдк * - рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб ) рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред java -classpath "path_to_project/DiceCli/target/adventures/*" -jar path_to_project/DiceCli/target/dice-1.0-jar-with-dependencies.jar
тАЬрдореВрд░реНрдЦ, рдпрд╛ рдХреНрдпрд╛? -Jar рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, -classpath рд╕реНрд╡рд┐рдЪ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ! "рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЬрд╛рд░ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рдкрд╛рде рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП META-INF/MANIFEST.MF
(рдЕрдиреБрднрд╛рдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - Claspath:
)ред рдпрд╣ рдареАрдХ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдкреНрд▓рдЧрдЗрдиреНрд╕ рднреА рд╣реИрдВ ( рдорд╛рд╡реЗрди-рдХрдВрдкрд╛рдЗрд▓рд░-рдкреНрд▓рдЧрдЗрди рдпрд╛, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм, рдорд╛рд╡реЗрди-рдЕрд╕реЗрдВрдмрд▓реА-рдкреНрд▓рдЧрдЗрди )ред рд▓реЗрдХрд┐рди рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ, рдПрд▓рд╛рд╕ рдореЗрдВ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░ рдЬрд╛рд░-рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдпрд╣реА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирдирд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИредрдФрд░ рд╡реИрд╕реЗ рднреА, рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗред рдлреЛрд▓реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПadventures/
рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░реЛрдорд╛рдВрдЪ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╡реЗ рд╕рднреА рдЧреЗрдо рдЗрдВрдЬрди рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рдереЗред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬрд╛рд╡рд╛ рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╡реЗрджрди рд╕реЗ рдкрд░реЗ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рд╕реНрд╡рддрдВрддреНрд░ рд░реЛрдорд╛рдВрдЪ рдлреИрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдкрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреМрди рд╕рд╛? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ - рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕реНрдорд╛рд░реНрдЯ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВредрдЗрд╕ рдмреАрдЪ, рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯреА (рдпрд╛ рдмрдбрд╝реА, рдЖрдк рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдЪрд╛рд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдирд╛рдо рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдХреНрд▓рд╛рд╕рдкреИрде рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ: @ECHO OFF call "path_to_maven\mvn.bat" -f "path_to_project\DiceCore\pom.xml" install call "path_to_maven\mvn.bat" -f "path_to_project\DiceCli\pom.xml" package call "path_to_maven\mvn.bat" -f "path_to_project\TestAdventure\pom.xml" package mkdir path_to_project\DiceCli\target\adventures copy "path_to_project\TestAdventure\target\test-adventure-1.0.jar" path_to_project\DiceCli\target\adventures\ chcp 65001 cd path_to_project\DiceCli\target\ java -Dfile.encoding=UTF-8 -cp "dice-cli-1.0-jar-with-dependencies.jar;adventures\*" my.company.dice.MainKt pause
рдФрд░ рдпреВрдирд┐рдХреНрд╕ рдкрд░:
рдФрд░ рдпрд╣рд╛рдБ рдЪрд╛рд▓ рд╣реИред рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, -jar
рд╣рдо рдХреНрд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕рдХреЗ рднреАрддрд░ рдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ MainKt
ред рд╕рд╛рде рд╣реА рдпрд╣рд╛рдБ рд╣рдо рдлреЛрд▓реНрдбрд░ рд╕реЗ рд╕рднреА рдЖрд░реНрдХрд╛рдЗрд╡ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ adventures/
редрдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЯреЗрдврд╝рд╛ рдлреИрд╕рд▓рд╛ рд╣реИ - рдореИрдВ рдЦреБрдж рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдзрдиреНрдпрд╡рд╛рджред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕реБрдЭрд╛рдПрдВред рдХреГрдкрдпрд╛ ред (р▓ея╣Пр▓е)рдЪрд░рдг рд╕рддреНрд░рд╣ред рдХрд╣рд╛рдиреА
рдЧрд╛рдиреЗ рдХреЗ рдмреЛрд▓редрд╣рдорд╛рд░рд╛ рд▓реЗрдЦ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рддрдХрдиреАрдХреА рдкрдХреНрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЗрдо рдХреЗрд╡рд▓ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛрдб рдирд╣реАрдВ рд╣реИрдВред рдпреЗ рджрд┐рд▓рдЪрд╕реНрдк рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЬреАрд╡рдВрдд рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд░реЛрдорд╛рдВрдЪрдХ рджреБрдирд┐рдпрд╛ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рд╕рд╛рде рдбреБрдмрдХреА рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдРрд╕реА рдкреНрд░рддреНрдпреЗрдХ рджреБрдирд┐рдпрд╛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрдИ рдЖрдк рдЕрднреА рднреА рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рджреБрдирд┐рдпрд╛ рдХреЛ рдЧрд░реНрдо рднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдЗрд╕реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдПрдВредрдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд╛рдЗрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧреЗрдо рд╢реИрд▓реА (рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдЧреЗрдорд░реНрд╕, рд░рд╛рдЗрдЯ?) рдХреЗ рдХрдерд╛ рдШрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХ рдХреА рддрд░рд╣, рдХрд╣рд╛рдиреА рдореЗрдВ рдПрдХ рдЖрдВрдЦ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рдирд╛рдпрдХреЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ), рд╡рд┐рдХрд╛рд╕, рджреЛ рдпрд╛ рддреАрди рджрд┐рд▓рдЪрд╕реНрдк рдореЛрдбрд╝, рдПрдХ рдЪрд░рдореЛрддреНрдХрд░реНрд╖ (рдХрдерд╛рдирдХ рдХрд╛ рд╕рдмрд╕реЗ рддреАрд╡реНрд░ рдХреНрд╖рдг, рдЬрдм рдкрд╛рдардХ рдЙрддреНрддреЗрдЬрдирд╛ рдореЗрдВ рдЬрдо рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рдВрд╕ рд▓реЗрдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ) рдФрд░ рдЗрдирдХрд╛рд░ ( рдХреМрди рд╕реА рдШрдЯрдирд╛рдПрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдкрдиреЗ рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрддреА рд╣реИрдВ)ред рд╕рдордЭ рд╕реЗ рдмрдЪреЗрдВ, рддрд╛рд░реНрдХрд┐рдХ рдЖрдзрд╛рд░рд╣реАрдирддрд╛ рдФрд░ рд╕рд╛рдЬрд┐рд╢ рдХреЗ рдЫреЗрдж - рд╕рднреА рд╢реБрд░реВ рдХреА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПредрдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╣рдорд╛рд░реА рдХрд╣рд╛рдиреА рджреВрд╕рд░реЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ - рдкрдХреНрд╖ рд╕реЗ рдПрдХ рдирд┐рд╖реНрдкрдХреНрд╖ рджреЗрдЦреЛ рдмрд╣реБрдд рдмрд╛рд░ рдХрд┐рдП рдЧрдП рджреЛрд╖реЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдордп рдкрд░ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИредрдЦреЗрд▓ рдХреА рд╕рд╛рдЬрд┐рд╢, , . , : ( ) ( ), . , .
тАФ , . , , .
, , - . , , , , . .
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЯреЛрд▓реНрдХрд┐рди рдирд╣реАрдВ рд╣реВрдВ, рдореИрдВрдиреЗ рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рднреАред рдЙрд╕реА рд╕рдордп, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЦреБрдж рдХреЛ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╣реАрдВ рднреА рд╡рд░реНрдгрд┐рдд рджреБрдирд┐рдпрд╛ рдХреЗ рддрдХрдиреАрдХреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕реНрддрд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛: рд╕рд╛рдордВрддреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдФрд░ рдЖрдзреБрдирд┐рдХ рд▓реЛрдХрддрд╛рдВрддреНрд░рд┐рдХ рд╕рдВрд╕реНрдерд╛рдПрдВ, рджреБрд╖реНрдЯ рдЕрддреНрдпрд╛рдЪрд╛рд░реА рдФрд░ рд╕рдВрдЧрдард┐рдд рдЖрдкрд░рд╛рдзрд┐рдХ рд╕рдореВрд╣, рдЙрдЪреНрдЪрддрдо рд▓рдХреНрд╖реНрдп рдФрд░ рднреЛрдЬ рдореЗрдВ рдЬреАрд╡рд┐рдд, рдмрд╕ рдореЗрдВ рд╕рд╡рд╛рд░реА рдФрд░ рдЭрдЧрдбрд╝реЗ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд░реНрдг рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╢реВрдЯ рд╣реЛрддреЗ рд╣реИрдВ: рдзрдиреБрд╖ / рдХреНрд░реЙрд╕рдмреЛ рд╕реЗ, рдпрд╛ рдЕрд╕реЙрд▓реНрдЯ рд░рд╛рдЗрдлрд▓ рд╕реЗред рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬрд╛рджреВ рдХреА рдПрдХ рдЭрд▓рдХ рд╣реИ (рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕рд╛рдорд░рд┐рдХ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдордкреНрд▓реЗ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ) рдФрд░ рд░рд╣рд╕реНрдпрд╡рд╛рдж рдХреЗ рддрддреНрд╡ (рдмрд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП)редрдореИрдВ рдкреНрд▓реЙрдЯ рдХреНрд▓рд┐рдЪ рдФрд░ рдлрдВрддрд╛рд╕реА рдЙрдкрднреЛрдХреНрддрд╛ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рджреВрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдпреЗ рд╕рднреА рдХрд▓реНрдкрд┐рдд рдмреМрдиреЗ, рдбреНрд░реЗрдЧрди, рдмреНрд▓реИрдХ рд▓реЙрд░реНрдбреНрд╕ рдФрд░ рдкреВрд░реНрдг рд╡рд┐рд╢реНрд╡ рдмреБрд░рд╛рдИ (рд╕рд╛рде рд╣реА: рдЪрдпрдирд┐рдд рдирд╛рдпрдХ, рдкреНрд░рд╛рдЪреАрди рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдВ, рд╕реБрдкрд░-рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ, рдорд╣рд╛рдХрд╛рд╡реНрдп рд▓рдбрд╝рд╛рдИ ... рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреБрдирд┐рдпрд╛ рдХреЛ рдЬреАрд╡рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдорд┐рд▓реЗ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЫреЛрдЯреА рд╕реА рднреА) рдХреА рдЕрдкрдиреА рдХрд╣рд╛рдиреА рдФрд░ рдкреНрд░реЗрд░рдгрд╛ рдереА, рдХрд┐ рдЦреЗрд▓ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЗ рддрддреНрд╡ рджреБрдирд┐рдпрд╛ рдХреЗ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдХрд┐ рдирд╛рдпрдХреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╣реБрдЖ, рдХрд┐ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╣реА рдЙрдЪрд┐рдд рдереАред ... рдФрд░ рдЗрд╕реА рддрд░рд╣ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдЗрдЪреНрдЫрд╛ рдиреЗ рдПрдХ рдХреНрд░реВрд░ рдордЬрд╛рдХ рдЦреЗрд▓рд╛, рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рдзреАрдорд╛ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЧреЗрдорд┐рдВрдЧ рд╕рдореНрдореЗрд▓рдиреЛрдВ рд╕реЗ рдкреНрд░рд╕реНрдерд╛рди рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдлрд┐рд░ рднреА, рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рд╕реЗ рд╕рдВрддреБрд╖реНрдЯрд┐ рдЕрдзрд┐рдХ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдЖрджреЗрд╢ рдирд┐рдХрд▓рд╛редрдЗрд╕ рд╕рдмрдХреЗ рд╕рд╛рде рдореИрдВ рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджрд┐рд▓рдЪрд╕реНрдк рдХрдерд╛рдирдХ рдЗрддрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдЦреЗрд▓ рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛: рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЦрд┐рд▓рд╛рдбрд╝реА рдЗрд╕рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВрдЧреЗ, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ рд╡реЗ рдмрд╕ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВрдЧреЗред рдФрд░ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрд╕рд╛рд╣реА рд╣реИрдВ рд╡реЗ рдЖрдкрдХреЗ рдЦреЗрд▓ рдХреЛ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЛ рднреА рдорд╛рдл рдХрд░ рджреЗрдВрдЧреЗ, рдмрд╕ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд╣рд╛рдиреА рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИредрдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
рдЖрдЧреЗ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдФрд░ рдЧреЗрдо рдбрд┐рдЬрд╝рд╛рдЗрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ ред рдЕрдм рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ, рд╕реНрдерд╛рдиреЛрдВ, рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЛрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ - рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд░рд╛рдм рд╣реИред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЕрдХреЗрд▓реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмрдзрд╛рдИ рджреЗрддрд╛ рд╣реВрдВ - рдЖрдк рдЙрд╕ рдордВрдЪ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦреЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рджреМрдбрд╝рддреА рд╣реИрдВред рдмрдбрд╝реЗ рдПрдПрдП рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд▓реЛрдЧ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд╛рдЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреИрд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рдЙрдирдХреЗ рдкрд╛рд╕ рдмрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдЯрд╣рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╕реЛрдиреЗ рдХреЗ рд▓рд┐рдП - рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдЪрд┐рдд рдЕрдиреБрднрд╡ рдФрд░ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреАредрдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдпрд╣рд╛рдВ рд╣реИрдВ рдФрд░ рд╣рд░ рдХреАрдордд рдкрд░ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВред рд╕рдордп рдХреА рдХрдореА, рдЖрд▓рд╕реНрдп, рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░реЗрд░рдгрд╛ рдХреА рдХрдореА - рдХреБрдЫ рд▓рдЧрд╛рддрд╛рд░ рдЖрдкрдХреЛ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░ рджреЗрдЧрд╛ред рдЗрди рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ (рдлрд┐рд░ рд╕реЗ, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ), рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдЕрдкрдиреА рдЦреБрд╢реА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд╢рдХ рд╣рдореЗрдВ рдзрдХреНрдХрд╛ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдХреЛрдИ рднреА рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордп рд╕реАрдорд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдорд╛рдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЬрд▓реНрджрдмрд╛рдЬреА рдХреЗ рдмрд┐рдирд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ "рд░реЛрдбрдореИрдк" рдмрдирд╛рдПрдВ, рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВ рдФрд░ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╛рд╣рд╕ рд╣реИ) рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рдирд┐рдд рд╢рдмреНрджред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдиреЛрдЯрдмреБрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЖрдк рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдЗрд╕рдореЗрдВ рдЙрдардиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд┐рдЦреЗрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЪрд╛рдирдХ рд░рд╛рдд рдХреЗ рдмреАрдЪ рдореЗрдВ рдЬрд╛рдЧрдирд╛)редрдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ ) рдпрд╛ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдгред рдкреНрд░рд▓реЗрдЦрди рд╢реБрд░реВ рдХрд░реЗрдВ: рджреЛрдиреЛрдВ рдмрд╛рд╣рд░реА, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ ( рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдХреА ), рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рд╢рд╛рд▓ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП, рдФрд░ рдЖрдВрддрд░рд┐рдХ, рдЦреБрдж рдХреЗ рд▓рд┐рдП (рдореИрдВ рд▓рд┐рдВрдХ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛) - рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдПрдХ рдорд╣реАрдиреЗ рдХреЗ рдмреНрд░реЗрдХ рдХреЗ рдмрд╛рдж рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдкрдиреЗ рдЦреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗрдВ, рдмрд╕ рдЦреЗрд▓ рдХреЛ рд▓рд┐рдЦрдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред рдореИрдВрдиреЗ рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреЗрддрд╛ - рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдЕрдкрдиреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреА рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред"рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЖрдк рдЦреЗрд▓ рд╕рдВрддреБрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?"рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рддреБрд░рдВрдд рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рд╕рд╣реА рдЧреЗрдо рдмрдирд╛рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЕрдЪреНрдЫрд╛ рд╣реИ - рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛, рдЖрдкрдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдпрд╛ рдирд┐рд░рд╛рд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдЧрд╛: "рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?"ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╣ рдХрдИ рдЕрдиреНрдп рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореБрдЦреНрдп рдПрдХ рд╣реИ, рд╢рд╛рдпрдж: "рдХреНрдпрд╛ рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдореЗрдВ рдореЗрд░рд╛ рдЦреЗрд▓ рдЦреЗрд▓рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛?" рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд▓реЗрдЦ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдлрд┐рд░ рд╕реЗ) рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЦреЗрд▓ рдордзреНрдпрдо рд░реВрдк рд╕реЗ рдХрдард┐рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЦреЗрд▓ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЪреБрдиреМрддреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЬрдЯрд┐рд▓рддрд╛ рдирд┐рд╖реЗрдзрд╛рддреНрдордХ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдХрдЯреНрдЯрд░ рдХрдЯреНрдЯрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдпрд╛ рдРрд╕реЗ рд▓реЛрдЧ рдЬреЛ рдХрд┐рд╕реА рдХреЛ рдХреБрдЫ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЦреЗрд▓ рджрд░реНрд╢рдХреЛрдВ рд╕реЗ рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред рдЦреЗрд▓ рдХрд╛рдлреА рд╡рд┐рд╡рд┐рдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ - рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ,рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд▓реЗред рдкрд╛рд╕рд┐рдВрдЧ рдХреА рдПрдХ рд░рдгрдиреАрддрд┐ рдмрд╛рдХреА рдкрд░ рд╣рд╛рд╡реА рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╡реЗ рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ ... рдФрд░ рдЗрд╕реА рддрд░рд╣редрджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЦреЗрд▓ рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмреЛрд░реНрдб рдЧреЗрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ, рдЬрд╣рд╛рдВ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? рдореБрдЭреЗ рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЧрдгрд┐рдд рдорд┐рддреНрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдПрдХ рдЧрдгрд┐рддреАрдп рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рд╣реИ, рддреЛ рд╡реЗ рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рд╣рдо рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ), рддреЛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЦреЗрд▓рдиреЗ рдХреЗ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВредред рдкрд╣рд▓реЗ рдЧреЗрдо рдЦреБрдж рдЦреЗрд▓рд┐рдПред рдЬрдм рдЖрдк рдердХ рдЬрд╛рддреЗ рд╣реИрдВ - рдЕрдкрдиреА рдкрддреНрдиреА рдХреЛ рдЦреЗрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдВред рддрд▓рд╛рдХ рдХреЗ рдмрд╛рдж, рд╕рдбрд╝рдХ рдкрд░ рдЕрдиреНрдп рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ, рджреЛрд╕реНрддреЛрдВ, рдкрд░рд┐рдЪрд┐рддреЛрдВ, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВред рдЬрдм рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреЗрд▓реЗ рд░рд╣ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред рд▓реЛрдЧ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ, рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ: "рдЖрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛!"ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЗ рд╕рдкрдиреЗ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрд╕рдВрдж рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЛ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд╣рд╛рдпрддрд╛ рд╕рдореВрд╣ рдорд┐рд▓реЗрдЧрд╛ (рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рд▓реЗрдЦ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛ рд╣реИ?) (рд╣реЗрд╣реЗ)редрдПрдХ рддрд░рдл рдордЬрд╛рдХ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рд╣рдорд╛рд░реА рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ ... рдЖрдк рд╕рднреА рд╕рдлрд▓ рд╣реЛрдВред рдФрд░ рдкрдврд╝реЗрдВ (рдХрд┐рд╕рдиреЗ рд╕реЛрдЪрд╛ рд╣реЛрдЧрд╛!) - рдЧреЗрдо рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рд╣рдордиреЗ рдЬрд┐рди рдореБрджреНрджреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИ, рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЗрдЦ рдФрд░ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдпрд╣рд╛рдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреНрд░рд╣ рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ)ред рдЕрдкрдиреЗ рдЗрдВрдкреНрд░реЗрд╢рди рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ, рдордВрдЪреЛрдВ рдкрд░ рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВ - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрдЭреЗ рдмреЗрд╣рддрд░ рдФрд░ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЖрд▓рд╕реА рдордд рдмрдиреЛ рдФрд░ рдЖрдк рд╕рдлрд▓ рд╣реЛрдВрдЧреЗредрдЗрд╕ рдЖрд╢рд╛рд╡рд╛рджреА рдиреЛрдЯ рдкрд░, рдореБрдЭреЗ рдЖрдкрдХреА рдЫреБрдЯреНрдЯреА рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВ!"рдИ! рдЬреЛ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ? рдЕрдм рдпрд╣ рд╕рдм рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рдкрд░ рдХреИрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдХреНрдпрд╛ рдореИрдВрдиреЗ рд╡реНрдпрд░реНрде рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА, рдпрд╛ рдХреНрдпрд╛? "рдЙрдкрд╕рдВрд╣рд╛рд░ред рдПрдВрдбреНрд░реЙрдпрдб
рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЧреЗрдо рдЗрдВрдЬрди рдХреЗ рдПрдХреАрдХрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдХреНрд╖рд╛ рдХреЛ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдВ Game
рдФрд░ рдПрдХ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд░рд▓ рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ MainMenu
ред рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдореЗрдиреВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╣рд▓реА рдХрдХреНрд╖рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рддрдЪреАрдд рдХрд░ рд░рд╣рд╛ рд╣реИредрдХрдВрд╕реЛрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдПрдХ рдХрдХреНрд╖рд╛ рдХреА рддрд░рд╣ Game
, рдпрд╣ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рд╕реНрдХреНрд░реАрди рдЦреАрдВрдЪреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рдЖрджреЗрд╢ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдпрд╣рд╛рдБ рдХреЛрдИ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпреЗ рдЖрджреЗрд╢ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╣реИрдВред рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЪреАрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - "рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ"редрдореБрдЦреНрдп рдореЗрдиреВ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╡рд┐рдзрд┐ рдЪрд╛рд░реНрдЯ рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛? рдЙрд╕ рдФрд░ рднрд╛рд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдХреЛрдб рднреА рдкрд░рд┐рдорд╛рдг рд╕рд░рд▓ рдХрд╛ рдПрдХ рдЖрджреЗрд╢ рд╣реИред class MainMenu( private val renderer: MenuRenderer, private val interactor: MenuInteractor ) { private var actions = ActionList.EMPTY fun start() { Audio.playMusic(Music.MENU_MAIN) actions = ActionList() actions.add(Action.Type.NEW_ADVENTURE) actions.add(Action.Type.CONTINUE_ADVENTURE, false) actions.add(Action.Type.MANUAL, false) actions.add(Action.Type.EXIT) processCycle() } private fun processCycle() { while (true) { renderer.drawMainMenu(actions) when (interactor.pickAction(actions).type) { Action.Type.NEW_ADVENTURE -> TODO() Action.Type.CONTINUE_ADVENTURE -> TODO() Action.Type.MANUAL -> TODO() Action.Type.EXIT -> { Audio.stopMusic() Audio.playSound(Sound.LEAVE) renderer.clearScreen() Thread.sleep(500) return } else -> throw AssertionError("Should not happen") } } } }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ MenuRenderer
рдФрд░ MenuInteractor
рдЬреЛ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред interface MenuRenderer: Renderer { fun drawMainMenu(actions: ActionList) } interface Interactor { fun anyInput() fun pickAction(list: ActionList): Action }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдмрд╕ рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╣рдо Cli рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ (рдЗрд╕реЗ Droid рдХрд╣рддреЗ рд╣реИрдВ ), Core Project рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП ред рдЪрд▓реЛ рдХрд░рддреЗ рд╣реИрдВредрд░рди рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ (рдЖрдорддреМрд░ рдкрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ), рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ, рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдорд╛рдирдХ рдЯрд┐рдирд╕реЗрд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдорд░реНрдерди рдЫреЛрдбрд╝ рджреЗрдВред рд╣рдо рдХреЛрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ , рдЬреЛ рд╣рдорд╛рд░реА рдорд╢реАрди рдХреЗ рд╕реНрдерд╛рдиреАрдп рдорд╛рд╡реЗрди рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { applicationId "my.company.dice" minSdkVersion 14 targetSdkVersion 28 versionCode 1 versionName "1.0" } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "my.company:dice-core:1.0" }
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рднреА рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рджреЗрдЦреЗрдЧрд╛ - рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрдерд╛рдиреАрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (mavenLocal) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред buildscript { ext.kotlin_version = '1.3.20' repositories { google() jcenter() mavenLocal() } dependencies { classpath 'com.android.tools.build:gradle:3.3.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() jcenter() mavenLocal() } }
, , тАФ . , , :
SoundPlayer
,
MusicPlayer
,
MenuInteractor
(
GameInteractor
),
MenuRenderer
(
GameRenderer
)
StringLoader
, , . , .
(, , ) Android тАФ
Canvas
. -
View
- рдпрд╣ рд╣рдорд╛рд░рд╛ "рдХреИрдирд╡рд╛рд╕" рд╣реЛрдЧрд╛ред рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреАрдмреЛрд░реНрдб рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рдХрдорд╛рдВрдб рдХрд╛ рдЗрдирдкреБрдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╣реА рд╡рд╛рд░рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ View
- рдЗрд╕ рддрд░рд╣, рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЧреЗрдо рдЗрдВрдЬрди рдХреЗ рдмреАрдЪ рдордзреНрдпрд╕реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ (рд╕рд┐рд╕реНрдЯрдо рдХрдВрд╕реЛрд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рдордзреНрдпрд╕реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рдорд╛рдиредрдЖрдЗрдП рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдореЗрдВ рд▓рд┐рдЦреЗрдВред <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.company.dice"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".ui.MainActivity" android:screenOrientation="sensorLandscape" android:configChanges="orientation|keyboardHidden|screenSize"> <intent-filter> <category android:name="android.intent.category.LAUNCHER"/> <action android:name="android.intent.action.MAIN"/> </intent-filter> </activity> </application> </manifest>
рд╣рдо рдкрд░рд┐рджреГрд╢реНрдп рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ - рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЦреЗрд▓реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕реЗ рдореБрдЦреНрдп рд╡рд┐рд╖рдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред <resources> <style name="AppTheme" parent="android:Theme.Black.NoTitleBar.Fullscreen"/> </resources>
рдФрд░ рдЬрдм рд╕реЗ рд╣рдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реБрдП рд╣реИрдВ, рд╣рдо рдХреНрд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВ: <resources> <string name="action_new_adventure_key">N</string> <string name="action_new_adventure_name">ew adventure</string> <string name="action_continue_adventure_key">C</string> <string name="action_continue_adventure_name">ontinue adventure</string> <string name="action_manual_key">M</string> <string name="action_manual_name">anual</string> <string name="action_exit_key">X</string> <string name="action_exit_name">Exit</string> </resources>
рд╕рд╛рде рд╣реА рдореБрдЦреНрдп рдореЗрдиреВ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдзреНрд╡рдирд┐рдпреЛрдВ рдФрд░ рд╕рдВрдЧреАрдд рдХреА рдлрд╛рдЗрд▓реЗрдВ (рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА) /assets/sound/leave.wav
, /assets/music/menu_main.mp3
рдХреНрд░рдорд╢рдГ рдЙрдиреНрд╣реЗрдВ рдЕрдВрджрд░ рд░рдЦрдХрд░ редрдЬрдм рд╣рдордиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЫрдВрдЯрдиреА рдХреА, рддреЛ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░рдиреЗ рдХрд╛ рд╕рдордп рдерд╛ (рд╣рд╛рдБ, рдлрд┐рд░ рд╕реЗ)ред рдХрдВрд╕реЛрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдЕрдкрдиреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИрдВредрдХрдХреНрд╖рд╛ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрд░реЗрдЦ рд░реБрдХреЛ, рдмреЗрд╣реЛрд╢ рдордд рдХрд░реЛ, рдЕрдм рдореИрдВ рд╕рдм рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛редрд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рд╢рд╛рдпрдж, рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдПрдХ рдХреЗ рд╕рд╛рде - рд╡рд░реНрдЧ DiceSurface
- рдмрд╣реБрдд рд╡рд╛рд░рд┐рд╕ View
рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ SurfaceView
- рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ GlSurfaceView
- рдФрд░ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╛рд░реА-рдЖрдзрд╛рд░рд┐рдд рдЧреЗрдо рд╣реИ, рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдЦрд░рд╛рдм рд╣реИ) , рдЬрд┐рд╕реЗ рдЬрдЯрд┐рд▓ рдЧреНрд░рд╛рдлрд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)ред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреА: рдЫрд╡рд┐ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдХреНрд▓рд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реИрдВред рдЖрдЗрдП рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВредрдЬрдм рд╣рдо рдХрдВрд╕реЛрд▓ рдкрд░ рдкреЗрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рд░реЗрдВрдбрд░рд░ рдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрдорд╛рдВрдб рднреЗрдЬреЗ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рдИред рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рд╡рд┐рдкрд░реАрдд рд╣реИ - рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рд╡реНрдпреВ рджреНрд╡рд╛рд░рд╛ рд╣реА рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕рдордп рддрдХ рд╡рд┐рдзрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА onDraw()
рд╣реИ, рдЙрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛, рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди drawMainMenu()
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ MainMenu
? рдХреНрдпрд╛ рд╡рд╣ рдЕрдм рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?рдЖрдЗрдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдорджрдж рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдХрдХреНрд╖рд╛ DiceSurface
рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛ instructions
- рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдб рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП onDraw()
ред рд░реЗрдВрдбрд░рд░, рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рдХреЛ рдПрдХ рд░рдгрдиреАрддрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: typealias RenderInstructions = (Canvas, Paint) -> Unit class DiceSurface(context: Context) : View(context) { private var instructions: RenderInstructions = { _, _ -> } private val paint = Paint().apply { color = Color.YELLOW style = Paint.Style.STROKE isAntiAlias = true } fun updateInstructions(instructions: RenderInstructions) { this.instructions = instructions this.postInvalidate() } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) canvas.drawColor(Color.BLACK)
рдпрд╣реА рд╣реИ, рд╕рднреА рдЪрд┐рддреНрд░рдордп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрднреА рднреА рд░реЗрдВрдбрд░рд░ рд╡рд░реНрдЧ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рд╕реАрдзреЗ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ instructions
- рдЖрдк рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдзрд┐ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдЯрд▓рд┐рди рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИредрдЕрдм рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╣реБрдИ: рдЬрдм рд╣рдордиреЗ рдХрдВрд╕реЛрд▓ (рдХреАрдмреЛрд░реНрдб) рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛, рддрдм рддрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдЪрдХреНрд░) рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЬрдм рддрдХ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдХреБрдВрдЬреА рджрдмрд╛рдП рдирд╣реАрдВред рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рд╛рде, рдРрд╕реА рдЪрд╛рд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА - рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд▓реВрдкрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдХрд╛рдо рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд░реАрдХреЗ рдЕрднреА рднреА рдЗрдВрдЬрди рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рд╡реНрдпреВ рдЬрд▓реНрдж рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╡реЗ рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВредрдПрдХ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ BlockingQueue
ред рдХрдХреНрд╖рд╛ DroidMenuInteractor
рд╡рд┐рдзрд┐ рдХрд╣реЗрдЧрд╛take()
, рдЬреЛ рдЦреЗрд▓ рдХреА рдзрд╛рд░рд╛ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджреЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдХрддрд╛рд░ (рдкрд░рд┐рдЪрд┐рдд рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг Action
) рдХрддрд╛рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рди рджреЗрдВ ред DiceSurface
, рдмрджрд▓реЗ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд▓рд┐рдХ (рдорд╛рдирдХ onTouchEvent()
рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ View
) рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдЧрд╛ , рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ offer()
ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: class DiceSurface(context: Context) : View(context) { private val actionQueue: BlockingQueue<Action> = LinkedBlockingQueue<Action>() fun awaitAction(): Action = actionQueue.take() override fun onTouchEvent(event: MotionEvent): Boolean { if (event.action == MotionEvent.ACTION_UP) { actionQueue.offer(Action(Action.Type.NONE), 200, TimeUnit.MILLISECONDS) } return true } } class DroidMenuInteractor(private val surface: DiceSurface) : Interactor { override fun anyInput() { surface.awaitAction() } override fun pickAction(list: ActionList): Action { while (true) { val type = surface.awaitAction().type list .filter(Action::isEnabled) .find { it.type == type } ?.let { return it } } } }
рдпрд╣реА рд╣реИ, рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ awaitAction()
рдФрд░ рдпрджрд┐ рдХрддрд╛рд░ рдореЗрдВ рдХреБрдЫ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯреАрдореЛрдВ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рд▓рдЧрд╛рддрд╛рд░ рдЪрд▓рддреА рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рдмрд╛рд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдлреНрд░реАрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдЧреЗрдо рдЗрдВрдЬрди рдХрдорд╛рдВрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдирд┐рдореЗрд╢рди рдХреЗ рджреМрд░рд╛рди)ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрддрд╛рд░ рдХреА рдХреНрд╖рдорддрд╛ рдмрдврд╝рд╛рдиреЗ рдФрд░ / рдпрд╛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАредрдмреЗрд╢рдХ, рд╣рдо рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реАред рд╣рдореЗрдВ рджрдмрд╛рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕ рдпрд╛ рдЙрд╕ рдЖрджреЗрд╢ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдмреБрд░реА рдХрд┐рд╕реНрдордд рд╣реИ - рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд┐рд╕ рдЬрдЧрд╣ рдкрд░ рд╕рдХреНрд░рд┐рдп рдмрдЯрди рдЦреАрдВрдЪреЗ рдЧрдП рд╣реИрдВ - рд░реЗрдВрдбрд░рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рдо рдЙрдирдХреА рдмрд╛рддрдЪреАрдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред рд╡рд░реНрдЧ DiceSurface
рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдЧреНрд░рд╣ - рд╕рдХреНрд░рд┐рдп рдЖрдпрддреЛрдВ (рдпрд╛ рдЕрдиреНрдп рдЖрдХреГрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рдЕрдЧрд░ рд╣рдо рдХрднреА рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ) рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдпрддреЛрдВ рдореЗрдВ рдХреЛрдиреЗ рдФрд░ рдмрд╛рдЙрдВрдб рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ Action
ред рд░реЗрдВрдбрд░рд░ рдЗрди рдЖрдпрддреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдЧрд╛, рд╡рд┐рдзрд┐ onTouchEvent()
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧреА рдХрд┐ рдЖрдпрддреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕реА рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ Action
ред private class ActiveRect(val action: Action, left: Float, top: Float, right: Float, bottom: Float) { val rect = RectF(left, top, right, bottom) fun check(x: Float, y: Float, w: Float, h: Float) = rect.contains(x / w, y / h) }
рд╡рд┐рдзрд┐ check()
рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЖрдпрдд рдХреЗ рдЕрдВрджрд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд░реЗрдВрдбрд░рд░ рдХреЗ рдХрд╛рдо рдХреЗ рдЪрд░рдг рдореЗрдВ (рдФрд░ рдпрд╣ рдареАрдХ рдЙрд╕реА рдХреНрд╖рдг рд╣реИ рдЬрдм рдЖрдпрддрд╛рдХрд╛рд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ) рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рднреА рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ 0 рд╕реЗ 1 рддрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдкреЗрдХреНрд╖ рдореВрд▓реНрдпреЛрдВ (рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рдпрд╛ рдКрдВрдЪрд╛рдИ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рджрдмрд╛рдиреЗ рдХреЗ рд╕рдордп рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ - рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдХрд░реЗрдЧрд╛редрд╣рдо рдХрдХреНрд╖рд╛ рдореЗрдВ DiceSurface
рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ , рдЗрд╕реЗ рдмрд╛рд╣рд░ рд╕реЗ (рд░реЗрдВрдбрд░рд░ рдХреА рддрд░рдл рд╕реЗ) рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ ( addRectangle()
рдФрд░ clearRectangles()
) рдЬреЛрдбрд╝реЗрдВрдЧреЗ , рдФрд░ onTouchEvent()
рдЖрдпрддреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред class DiceSurface(context: Context) : View(context) { private val actionQueue: BlockingQueue<Action> = LinkedBlockingQueue<Action>() private val rectangles: MutableSet<ActiveRect> = Collections.newSetFromMap(ConcurrentHashMap<ActiveRect, Boolean>()) private var instructions: RenderInstructions = { _, _ -> } private val paint = Paint().apply { color = Color.YELLOW style = Paint.Style.STROKE isAntiAlias = true } fun updateInstructions(instructions: RenderInstructions) { this.instructions = instructions this.postInvalidate() } fun clearRectangles() { rectangles.clear() } fun addRectangle(action: Action, left: Float, top: Float, right: Float, bottom: Float) { rectangles.add(ActiveRect(action, left, top, right, bottom)) } fun awaitAction(): Action = actionQueue.take() override fun onTouchEvent(event: MotionEvent): Boolean { if (event.action == MotionEvent.ACTION_UP) { with(rectangles.firstOrNull { it.check(event.x, event.y, width.toFloat(), height.toFloat()) }) { if (this != null) { actionQueue.put(action) } else { actionQueue.offer(Action(Action.Type.NONE), 200, TimeUnit.MILLISECONDS) } } } return true } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) canvas.drawColor(Color.BLACK) instructions(canvas, paint) } }
рдЖрдпрддреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдШрдЯрдирд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ ConcurrentModificationException
рдпрджрд┐ рд╕реЗрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╡рд╛рд╣ рджреНрд╡рд╛рд░рд╛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрдЧрд╛)редрд╡рд░реНрдЧ рдХреЛрдб DroidMenuInteractor
рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ DroidMenuRenderer
рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЪрд╛рд░ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВ ActionList
ред рдЙрдиреНрд╣реЗрдВ рд╢реАрд░реНрд╖рдХ DICE рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВред рдЦреИрд░, рдЪрд▓реЛ рд╕рдХреНрд░рд┐рдп рдЖрдпрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред class DroidMenuRenderer ( private val surface: DiceSurface, private val loader: StringLoader ) : MenuRenderer { protected val helper = StringLoadHelper(loader) override fun clearScreen() { surface.clearRectangles() surface.updateInstructions { _, _ -> } } override fun drawMainMenu(actions: ActionList) {
рдпрд╣рд╛рдВ рд╣рдо рдлрд┐рд░ StringLoader
рд╕реЗ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░ рд▓реМрдЯ рдЖрдП StringLoadHelper
(рдЪрд┐рддреНрд░ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдП рдЧрдП)ред рдкрд╣рд▓реЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдирд╛рдо рд╣реИ ResourceStringLoader
рдФрд░ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ) рдЖрд╡реЗрджрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рддрд╛рд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рдВрд╕рд╛рдзрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ - рд╣рдо рдЬрд╛рдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИрдВред class ResourceStringLoader(context: Context) : StringLoader { private val packageName = context.packageName private val resources = context.resources override fun loadString(key: String): String = resources.getString(resources.getIdentifier(key, "string", packageName)) }
рдпрд╣ рдзреНрд╡рдирд┐рдпреЛрдВ рдФрд░ рд╕рдВрдЧреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред Android рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рд╡рд░реНрдЧ рд╣реИ MediaPlayer
рдЬреЛ рдЗрди рдЪреАрдЬреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╕рдВрдЧреАрдд рдмрдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ: class DroidMusicPlayer(private val context: Context): MusicPlayer { private var currentMusic: Music? = null private val player = MediaPlayer() override fun play(music: Music) { if (currentMusic == music) { return } currentMusic = music player.setAudioStreamType(AudioManager.STREAM_MUSIC) val afd = context.assets.openFd("music/${music.toString().toLowerCase()}.mp3") player.setDataSource(afd.fileDescriptor, afd.startOffset, afd.length) player.setOnCompletionListener { it.seekTo(0) it.start() } player.prepare() player.start() } override fun stop() { currentMusic = null player.release() } }
рджреЛ рдЕрдВрдХред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзрд┐ prepare()
рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдмрдбрд╝реЗ рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ (рдмрдлрд░рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг) рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдпрд╛ рддреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ prepareAsync()
рдФрд░ OnPreparedListener
ред рджреВрд╕рд░реА рдмрд╛рдд, рдкреНрд▓реЗрдмреИрдХ рдХреЛ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд▓рд╛рдЗрдл рд╕рд╛рдЗрдХрд▓ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рдЬрдм рдпреВрдЬрд░ рдХрдо рд╕реЗ рдХрдо рдЖрд╡реЗрджрди рдХрд░реЗ рдФрд░ рд░рд┐рдХрд╡рд░ рд╣реЛрдиреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ), рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдР-рдР-рдР ...рдпрд╣ рдзреНрд╡рдирд┐рдпреЛрдВ MediaPlayer
рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИ , рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡реЗ рдХреБрдЫ рдФрд░ рд╕рд░рд▓ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ), рдпрд╣ рдХрд░реЗрдЧрд╛ SoundPool
ред рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдзреНрд╡рдирд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдирдХрд╛ рдкреНрд▓реЗрдмреИрдХ рддреБрд░рдВрдд рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдиреБрдХрд╕рд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдореГрддрд┐ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ (рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд╣рдо рдорд╛рдореВрд▓реА рд╣реИрдВ)ред class DroidSoundPlayer(context: Context) : SoundPlayer { private val soundPool: SoundPool = SoundPool(2, AudioManager.STREAM_MUSIC, 100) private val sounds = mutableMapOf<Sound, Int>() private val rate = 1f private val lock = ReentrantReadWriteLock() init { Thread(SoundLoader(context)).start() } override fun play(sound: Sound) { if (lock.readLock().tryLock()) { try { sounds[sound]?.let { s -> soundPool.play(s, 1f, 1f, 1, 0, rate) } } finally { lock.readLock().unlock() } } } private inner class SoundLoader(private val context: Context) : Runnable { override fun run() { val assets = context.assets lock.writeLock().lock() try { Sound.values().forEach { s -> sounds[s] = soundPool.load( assets.openFd("sound/${s.toString().toLowerCase()}.wav"), 1 ) } } finally { lock.writeLock().unlock() } } } }
рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╕рдордп, рдПрдиреНрдпреВрдорд░реЗрд╢рди рд╕реЗ рд╕рднреА рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ Sound
рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдорд╛рдирдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ReentrantReadWriteLock
редрдЕрдм, рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдЕрдкрдиреЗ рдЕрдВрджрд░ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЕрдВрдзрд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ MainActivity
- рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓ рдЧрдП? рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ MainMenu
(рдФрд░ Game
рдмрд╛рдж рдореЗрдВ) рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Audio.init(DroidSoundPlayer(this), DroidMusicPlayer(this)) val surface = DiceSurface(this) val renderer = DroidMenuRenderer(surface) val interactor = DroidMenuInteractor(surface, ResourceStringLoader(this)) setContentView(surface) Thread { MainMenu(renderer, interactor).start() finish() }.start() } override fun onBackPressed() { } }
рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рд╣реИред
рд╕рднреА рдкреАрдбрд╝рд╛ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рдореБрдЦреНрдп рд╕реНрдХреНрд░реАрди рдмрд╕ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧрддреА рд╣реИ:рдореЛрдмрд╛рдЗрд▓ рд╕реНрдХреНрд░реАрди рдХреА рдкреВрд░реА рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдореБрдЦреНрдп рдореЗрдиреВ рдареАрдХ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧреЗрдЧрд╛ рдЬрдм рдПрдХ рдмреБрджреНрдзрд┐рдорд╛рди рдХрд▓рд╛рдХрд╛рд░ рд╣рдорд╛рд░реЗ рд░реИрдВрдХреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдФрд░ рдЙрд╕рдХреА рдорджрдж рд╕реЗ рдпрд╣ рд╕реНрдХреНрд╡реЗрд▓рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд рд╣реЛрдЧрд╛редрдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХрдИ рд▓реЛрдЧ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕реАрдзреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдареАрдХ рд╣реИ - рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рдардХреЛрдВ рдиреЗ рдЯреИрдм рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЙрди рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдЬреЛ рдлрд┐рд░ рднреА рдЕрд╕рдВрдЧрдд рдмрдХрдмрдХ рдХреА рдЗрд╕ рдзрд╛рд░рд╛ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ - рд╕рдореНрдорд╛рди рдФрд░ рд╕рдореНрдорд╛рди, рдЕрд╕реАрдо рдкреНрдпрд╛рд░ рдФрд░ рдЖрднрд╛рд░ред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рд▓рд┐рдВрдХ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдмрд┐рдирд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рддрдХ (рдпрд╣ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд▓реЗрдЦ рдореЗрдВ рдорд╛рдирд╛ рдЧрдпрд╛ рд╣реИ) рд╕реЗ рдмрд╣реБрдд рдЖрдЧреЗ рдирд┐рдХрд▓ рдЧрдИ рд╣реИ:рдЦреИрд░, рдЕрдЪрд╛рдирдХ, рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реЛрдЧреА, рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдЖрд▓рд╕реНрдп рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВрдЧреЗ, рдпрд╣рд╛рдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ: рд▓рд┐рдВрдХ!рдпрд╣рд╛рдВ, рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рд╛рдВрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдк рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ JavaFX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП OpenJDK (рд░рд╛рдЗрдЯ рдПрдВрдб рд╣реЗрд▓реНрдк) рдХреЗ рд╕рд╛рде рдорд╢реАрдиреЛрдВ рдкрд░ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдлрд╛рдЗрд▓ рдкрде рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд╛рдкрдирд╛ рдорджрдж readme.txt рдлрд╝рд╛рдЗрд▓ (рдЙрди рдпрд╛рдж рд╣реИ?) рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рджреЗрдЦреЗрдВ, рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЪреБрдк рд╣реВрдВредрдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдпрд╛рдВрддреНрд░рд┐рдХреА, рдпрд╛ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рди, рдпрд╛, рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡рд┐рджреНрдпрд╛ рдХреЗ рдЦреЗрд▓, рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рддреБрдо рдЪрд╛рд╣реЛ рдФрд░ рдЕрдЧрд░ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдЯрд┐рдкреНрдкрдгреА, рдкрдЫрддрд╛рд╡рд╛ рдФрд░ рд╕реБрдЭрд╛рд╡ рднреЗрдЬреЗрдВред рдореБрдЭреЗ рдмрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАредрдСрд▓ рдж рдмреЗрд╕реНрдЯред