
рд╕реНрдЯрд╛рд░рдХреНрд░рд╛рдлреНрдЯ: рдмреНрд░реВрдб рд╡реЙрд░ ред рдпрд╣ рдЦреЗрд▓ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ! рдФрд░ рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдЗрддрдирд╛, рдХрд┐ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЗрд╕рдХреЗ рдкреГрд╖реНрда рдХрд╛ рд▓рд┐рдВрдХ рднреА рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред
рдПрдХ рдмрд╛рд░ рд╣реЙрд▓реНрдЯ рдиреЗ рдореБрдЭреЗ рдкреАрдПрдо рднреЗрдЬрд╛ рдФрд░ рд░рд╕реНрдЯ рд╕реАрдЦрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреАред рдХрд┐рд╕реА рднреА рдЖрдо рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣, рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрдирд╛ рдЬреЛ рд╕реНрдЯрд╛рд░рдХреНрд░рд╛рдлреНрдЯ рдХреЗ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдФрд░ рдпреВрдирд┐рдЯреНрд╕ рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдирд╛ рд╣реЛред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдФрд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдФрд░ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдЬрдВрдЧ рдФрд░ рдЗрд╕рдХреЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмреЙрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╕реА, рд╕реА ++, рд░реВрдмреА, рдкрд╛рдпрдерди, рдЖрджрд┐ рд╣реЛред
рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП рджрдХреНрд╖рд┐рдг рдХреЛрд░рд┐рдпрд╛ рдХреЗ рднрдЬрди рдХреЛ рд╕реБрдирдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдпрдХ рд╣реИ:
BWAPI
рдпрд╣ рдЦреЗрд▓ рд▓рдЧрднрдЧ 20 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИред рдФрд░ рдпрд╣ рдЕрднреА рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ ; рдЪреИрдВрдкрд┐рдпрдирд╢рд┐рдк рд╕рдВрдпреБрдХреНрдд рд░рд╛рдЬреНрдп рдЕрдореЗрд░рд┐рдХрд╛ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреА рднреАрдбрд╝ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ 2017 рдореЗрдВ рдЬрд╣рд╛рдВ рдЧреНрд░реИрдВрдб рдорд╛рд╕реНрдЯрд░реНрд╕ рдЬреИрдбреЙрдиреНрдЧ рдмрдирд╛рдо рдмрд┐рд╕реВ рдХреА рд▓рдбрд╝рд╛рдИ рд╣реБрдИ рдереАред рдорд╛рдирд╡ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдореЗрд▓рд▓реЗрд╕ рдорд╢реАрдиреЗрдВ рднреА SC рдХреА рд▓рдбрд╝рд╛рдИ рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рд▓реЗрддреА рд╣реИрдВ! рдФрд░ рдпрд╣ BWAPI рдХреА рд╡рдЬрд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИред рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ ред
рдПрдХ рджрд╢рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ, рдЗрд╕ рдЦреЗрд▓ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмреЙрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рд╕рдореБрджрд╛рдп рд░рд╣рд╛ рд╣реИред рдЙрддреНрд╕рд╛рд╣реА рд▓реЛрдЧ рдмреЙрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдПрдЖрдИ рдФрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВред BWAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдРрд╕реЗ рдореИрдЪреЛрдВ рдХрд╛ рдкреНрд░рд╕рд╛рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЪрд┐рдХреЛрдЯреА рдЪреИрдирд▓ рднреА рд╣реИред
рддреЛ, рдПрдХ рдкреНрд░рд╢рдВрд╕рдХ рдЯреАрдо рдиреЗ рдХрдИ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕реНрдЯрд╛рд░рдХреНрд░рд╛рдлреНрдЯ рдмреИрдХ-рдПрдВрдб рдХреЛ рдЙрд▓рдЯ рджрд┐рдпрд╛ рдФрд░ рд╕реА ++ рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЖрдкрдХреЛ рдмреЙрдЯ рдмрдирд╛рдиреЗ, рдЦреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рджреБрдЦреА рдордиреБрд╖реНрдпреЛрдВ рдкрд░ рд╣рд╛рд╡реА рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рдПрдХ рдШрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЕрдпрд╕реНрдХ, рдлреЛрд░реНрдЬ рдЯреВрд▓реНрд╕ рдХреЛ рдЦрд╛рди рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдПрдХ рдмреЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Rust рдХреА рдкреЗрд╢рдХрд╢ рдХреНрдпрд╛ рд╣реИ?
FFI
рд░реБрд╕реНрдд рд╕реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдлрдПрдлрдЖрдИ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрдВрд╢ рджреЗрддрд╛ рд╣реВрдВред
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддрдбрд╝рдХ-рднрдбрд╝рдХ рд╡рд╛рд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ snappy-ch рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рд╣реИрдВред
рдЪрд▓реЛ рдХрд╛рд░реНрдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
$ cargo new --bin snappy Created binary (application) `snappy` project $ cd snappy snappy$ tree . тФЬтФАтФА Cargo.toml тФФтФАтФА src тФФтФАтФА main.rs 1 directory, 2 files
рдХрд╛рд░реНрдЧреЛ рдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдИ рд╣реИред
Cargo.toml
рд╣рдо libc рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
[dependencies] libc = "0.2"
src/main.rs
рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
extern crate libc;
рдЖрдЗрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:
snappy$ cargo build ... snappy$ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/snappy` max compressed length of a 100 byte buffer: 148
рдЖрдк cargo run
рдХреЗрд╡рд▓ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд░рди рд╕реЗ рдкрд╣рд▓реЗ cargo build
рдХрд╣рддреЗ рд╣реИрдВред рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдФрд░ рдмрд╛рдЗрдирд░реА рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ:
snappy$ ./target/debug/snappy max compressed length of a 100 byte buffer: 148
рдпрджрд┐ рд╕реНрдиреИрдкреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЙрдмрдВрдЯреВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ libsnappy-dev рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
snappy$ ldd target/debug/snappy ... libsnappy.so.1 => /usr/lib/x86_64-linux-gnu/libsnappy.so.1 (0x00007f8de07cf000)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛ рджреНрд╡рд┐рдЖрдзрд╛рд░реА libsnappy рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдФрд░ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ snappy_max_compressed_length
рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИред
рдЬрдВрдЧ-bindgen
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдПрдлрдПрдлрдЖрдИ рдХреЛ рд╕реНрд╡рддрдГ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд░рд╕реНрдЯ рдПрдбрд┐рдХреНрдЯ рдХреЗ рдЯреВрд▓рдмреЙрдХреНрд╕ рдореЗрдВ рд░рд╕реНрдЯ -рдмрд┐рдВрдбрдЧреЗрди рдирд╛рдордХ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рдпрд╣ C (рдФрд░ рдХреБрдЫ C ++) рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП FFI рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред
рд╕реНрдерд╛рдкрдирд╛:
$ cargo install bindgen
рдЬрдВрдЧ-рдмрд┐рдВрджреЗрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ? рд╣рдо C / C ++ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, рд╣рдо рдЙрди рдкрд░ bindgen рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ, рд╡рд╣ рдЙрдЪрд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде Rust рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо C рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ bindgen
рд▓рд┐рдП рдХреНрдпрд╛ bindgen
рдХрд░рддрд╛ рд╣реИ:
$ bindgen /usr/include/snappy-ch | grep -C 1 snappy_max_compressed_length extern "C" { pub fn snappy_max_compressed_length(source_length: usize) -> usize; }
рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ bindgen BWAPI рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЧреИрд░-рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рдЯрди рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди, std :: string in a public API, рдЖрджрд┐)ред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ BWAPI C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред C ++ рдЖрдорддреМрд░ рдкрд░ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдПрдХ рдмрд╛рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдХрдЯреНрдареА рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдЙрд╕реА рд▓рд┐рдВрдХрд░ (рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг) рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рд╣реА рдХрдВрдкрд╛рдЗрд▓рд░ (рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг) рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЗ рд╕рднреА рдХрд╛рд░рдХ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдордВрдЧрд▓рд┐рдВрдЧ , рдЬрд┐рд╕реЗ рдЕрднреА рднреА рдЬреАрдПрдирдпреВ рдЬреАрд╕реАрд╕реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпреЗ рдХрд╛рд░рдХ рдЗрддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдХрд┐ gtest рднреА рдЗрд╕реЗ рджреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ: рдЖрдк рдЙрд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд╕рдорд╛рди рд▓рд┐рдВрдХрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЧрд╛рдЗрд╕реНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред
BWAPI-рд╕реА
C рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд╛ рд▓рд┐рдВрдЧреБрдЖ рдлреНрд░реЗрдВрдХрд╛ рд╣реИред рдпрджрд┐ рдЬрдВрдЧ-рдмрд┐рдВрджрдЧреЗрди рд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕реА рдХреЗ рд▓рд┐рдП BWAPI рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ!
рд╣рд╛рдВ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрдм рддрдХ рдЖрдк BWAPI рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрди рд╕рднреА рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ, рдПрдПрд╕рдПрдо рдХреЛрдб, рдореЗрдореЛрд░реА рдкреИрдЪрд┐рдВрдЧ рдФрд░ рдЕрдиреНрдп "рднрдпрд╛рд╡рд╣рддрд╛" рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдордп рдирд╣реАрдВ рд╣реИред рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореИрдВрдЧрд▓рд┐рдВрдЧ, рд╕реА ++ рдХреЛрдб, рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдВрдмрд░ рдлрдВрдХреНрд╢рди рдХреЛ рд╣рд░рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
C ++ рдореЗрдВ, рджреЛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рд╣рдо рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╕рдВрдХреЗрдд рдФрд░ extern "C"
ред
extern "C" {}
C ++ рдХреЗ рддрд╣рдд C ++ рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ "рдорд╛рд╕реНрдХ" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдмрд┐рдирд╛ рдореЗрдиреНрдпреВрд▓реЗрд╢рди рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╕рдВрдХреЗрдд рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдмрд┐рдирд╛ "рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░" рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реВрдЪрдХ рдФрд░ "рдХреБрдЫ рдкреНрд░рдХрд╛рд░" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ C ++ рдХреЛрдб рд╣реИ:
namespace cpp { struct Foo { int bar; virtual int get_bar() { return this->bar; } }; }
рд╣рдо рдЗрд╕реЗ C рд╣реЗрдбрд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
extern "C" { typedef struct Foo_ Foo; // Opaque pointer to Foo // call cpp::Foo::get_bar int Foo_get_bar(Foo* self); }
рдФрд░ рдпрд╣рд╛рдБ C ++ рднрд╛рдЧ рд╣реИ рдЬреЛ C рд╣реИрдбрд░ рдФрд░ C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреАрдЪ рдХреА рдХрдбрд╝реА рд╣реЛрдЧреА:
int Foo_get_bar(Foo* self) {
рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред BWAPI рдореЗрдВ, рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП typedef struct Position { int x; int y; } Position;
typedef struct Position { int x; int y; } Position;
рдФрд░ Position::get_distance
рдЬреИрд╕реЗ рддрд░реАрдХреЗ Position::get_distance
рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдереАрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдЗрд▓рд╛рдЬ рдХрд░рдирд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, AIModule рд╡рд░реНрдЪреБрдЕрд▓ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде C ++ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рднреА, рдпрд╣рд╛рдБ рд╣реЗрдбрд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ ред
рдЗрд╕рд▓рд┐рдП, рдХрдИ рдорд╣реАрдиреЛрдВ рдХреА рдореЗрд╣рдирдд рдХреЗ рдмрд╛рдж, 554 рддрд░реАрдХреЗ рдФрд░ рдПрдХ рджрд░реНрдЬрди рдХрдХреНрд╖рд╛рдПрдВ, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА BWAPI-C рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ, рдЬреЛ рдЖрдкрдХреЛ рд╕реА рдореЗрдВ рдмреЙрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдЙрдк-рдЙрддреНрдкрд╛рдж рдХреНрд░реЙрд╕-рд╕рдВрдХрд▓рди рдФрд░ рдПрдлрдПрдлрдЖрдИ рдФрд░ рд╕реАрдбреАрдИрд╕реА рдХреЙрд▓ рд╕рдореНрдореЗрд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереАред
рдпрджрд┐ рдЖрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╕реА рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдкреАрдЖрдИ рд▓рд┐рдЦреЗрдВред
BWAPI-C рдХреА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрдХ рд╕рдВрднрд╡ рдПрдХреАрдХрд░рдг рд╣реИред Python
, Ruby
, Rust
, PHP
, Java
рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧ рд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрд┐рдВрдХ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрд╡рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреА рдорджрдж рд╕реЗ рдПрдХ рдмреЙрдЯ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
C рдореЗрдВ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛
рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ Starcraft рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдЧрдарди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдмреЙрдЯреНрд╕ 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдореЙрдбреНрдпреВрд▓ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯред рдЖрдЗрдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рдореЙрдбреНрдпреВрд▓ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдореЙрдбреНрдпреВрд▓ рдХреЛ 2 рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: newAIModule
рдФрд░ gameInit
ред
gameInit
рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╡рд░реНрддрдорд╛рди рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реВрдЪрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ BWAPI рдХреЗ wilds рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░ рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреЗ рдХреБрдЫ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд▓реЛ gameInit
рдХрд╛ рд╡рд░реНрдгрди gameInit
:
DLLEXPORT void gameInit(void* game) { BWAPIC_setGame(game); }
newAIModule
рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ C ++ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ onXXXXX рдЬреИрд╕реЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдердб рдЯреЗрдмрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреБрдЫ рдЧреЗрдо рдЗрд╡реЗрдВрдЯреНрд╕ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
typedef struct ExampleAIModule { const AIModule_vtable* vtable_; const char* name; } ExampleAIModule;
рдкрд╣рд▓рд╛ рдХреНрд╖реЗрддреНрд░ рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЬрд╛рджреВ рд╣реИ)ред рдпрд╣рд╛рдБ newAIModule
рдлрд╝рдВрдХреНрд╢рди рд╣реИ:
DLLEXPORT void* newAIModule() { ExampleAIModule* const module = (ExampleAIModule*) malloc( sizeof(ExampleAIModule) ); module->name = "ExampleAIModule"; module->vtable_ = &module_vtable; return createAIModuleWrapper( (AIModule*) module ); }
createAIModuleWrapper
рдПрдХ рдФрд░ рдореИрдЬрд┐рдХ рдЯреНрд░рд┐рдХ рд╣реИ рдЬреЛ C рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ C ++ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддреА рд╣реИ рдЖрднрд╛рд╕реА рддрд░реАрдХреЗ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпред
module_vtable
рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ рд╣реИ, рд╡рд┐рдзрд┐ рдорд╛рди рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╕реЗ рднрд░реЗ рд╣реБрдП рд╣реИрдВ:
static AIModule_vtable module_vtable = { onStart, onEnd, onFrame, onSendText, onReceiveText, onPlayerLeft, onNukeDetect, onUnitDiscover, onUnitEvade, onUnitShow, onUnitHide, onUnitCreate, onUnitDestroy, onUnitMorph, onUnitRenegade, onSaveGame, onUnitComplete }; void onEnd(AIModule* module, bool isWinner) { } void onFrame(AIModule* module) {} void onSendText(AIModule* module, const char* text) {} void onReceiveText(AIModule* module, Player* player, const char* text) {} void onPlayerLeft(AIModule* module, Player* player) {} void onNukeDetect(AIModule* module, Position target) {} void onUnitDiscover(AIModule* module, Unit* unit) {} void onUnitEvade(AIModule* module, Unit* unit) {} void onUnitShow(AIModule* module, Unit* unit) {} void onUnitHide(AIModule* module, Unit* unit) {} void onUnitCreate(AIModule* module, Unit* unit) {} void onUnitDestroy(AIModule* module, Unit* unit) {} void onUnitMorph(AIModule* module, Unit* unit) {} void onUnitRenegade(AIModule* module, Unit* unit) {} void onSaveGame(AIModule* module, const char* gameName) {} void onUnitComplete(AIModule* module, Unit* unit) {}
рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рдирд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрд┐рди рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рдХрд┐рди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЦрд╛рд▓реА рдХрд░ рджрд┐рдпрд╛, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ
void onStart(AIModule* module) { ExampleAIModule* self = (ExampleAIModule*) module; Game* game = BWAPIC_getGame(); Game_sendText(game, "Hello from bwapi-c!"); Game_sendText(game, "My name is %s", self->name); }
рдЦреЗрд▓ рдЪрд▓рдиреЗ рдкрд░ рдЗрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рддрд░реНрдХ рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред BWAPIC_getGame
рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо BWAPIC_setGame
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рддреЛ, рдЖрдЗрдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреНрд░реЙрд╕-рдХрдВрдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдПрдВ:
bwapi-c/example$ tree . тФЬтФАтФА BWAPIC.dll тФФтФАтФА Dll.c 0 directories, 2 files bwapi-c/example$ i686-w64-mingw32-gcc -mabi=ms -shared -o Dll.dll Dll.c -I../include -L. -lBWAPIC bwapi-c/example$ cp Dll.dll ~/Starcraft/bwapi-data/ bwapi-c/example$ cd ~/Starcraft/bwapi-data/ Starcraft$ wine bwheadless.exe -e StarCraft.exe -l bwapi-data/BWAPI.dll --headful ... ... ...
рдмрдЯрди рджрдмрд╛рдПрдВ рдФрд░ рдЦреЗрд▓ рдХреЛ рдЪрд▓рд╛рдПрдВред рд╕рдВрдХрд▓рди рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА BWAPI рд╡реЗрдмрд╕рд╛рдЗрдЯ рдФрд░ BWAPI-C рдкрд░ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:

рдЖрдк рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрдЯрд╡реЗрдЕрдЯрд░реНрд╕ , рдпреВрдирд┐рдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ, рдорд┐рдирд░рд▓ рд╕рд░реНрдЪ рдФрд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред bwapi-c / example / Dll.c.
bwapi-рд╕рд┐рд╕
рд░рд╕реНрдЯ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдирд╛рдордХрд░рдг рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИред рдХреЛрдИ рднреА рдкреИрдХреЗрдЬ foo-sys рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ:
- рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп libfoo рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ;
- рд▓рд┐рдмрдлреВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рдгрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдШреЛрд╖рдгрд╛рдПрдВ рд╣реА! * -рдПрд╕рдЯреА рдХреНрд░реЗрдЯ рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрдд рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
* -Sys рдкреИрдХреЗрдЬ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд╛рд░реНрдЧреЛ рдХреЛ рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ / рдпрд╛ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ ред
рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП * -sys рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдмрд┐рдВрдбрдЧреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рд╕реЗ рдмрд╛рдВрдзрдирд╛ред рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ рджреЛ =)
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреА рдкреАрдврд╝реА рд╕реБрдкрд░ рдЖрд╕рд╛рди рд╣реИ:
bindgen BWAPI.h -o lib.rs \ --opaque-type ".+_" \ --blacklist-type "std.*|__.+|.+_$|Game_v(Send|Print|Draw).*|va_list|.+_t$" \ --no-layout-tests \ --no-derive-debug \ --raw-line "#![allow(improper_ctypes, non_snake_case)]" \ -- -I../submodules/bwapi-c/include sed -i -r -- 's/.+\s+(.+)_;/pub struct \1;/' lib.rs
BWAPI.h
BWAPI-C рдХреЗ рд╕рднреА C рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╛рдЗрд▓ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП bindgen рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдРрд╕реА рдШреЛрд╖рдгрд╛рдПрдВ рдХрд░ рджреА рд╣реИрдВ:
extern "C" {
рджреЛ рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реИрдВ: рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдФрд░ рдмрд┐рд▓реНрдб рдХреЗ рджреМрд░рд╛рди рдлреНрд▓рд╛рдИ рдкрд░ рдХреЛрдб рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ред рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рд╣реИрдВ ред
рдЦрд╝реБрд╢реА рд╣реИ рдЖрдкрд╕реЗ рдорд┐рд▓рдХрд░ рдмреЛрд╡рд╛рдкреА-рд╕реАрд╕ ; рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рдХрджрдоред
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдореИрдВ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛? nlinker рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдПрдХ рдЪрд╛рд▓рд╛рдХ рд░рдгрдиреАрддрд┐ рд▓рд╛рдЧреВ рдХреАред рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╣реЛрд╕реНрдЯ рд╡рд┐рдВрдбреЛрдЬ рд╣реИ, рддреЛ GitHub рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдХрдЯреНрдареЗ BWAPIC рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдФрд░ рд╢реЗрд╖ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо OpenBW рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрддреЛрдВ рд╕реЗ BWAPI-C рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛)ред
bwapi-рд░реБ
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣реИ рдФрд░ рд╣рдо рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрддрддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ: рд╢реБрджреНрдз рдореВрд▓реНрдп рдФрд░ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдмрд┐рдВрджреБред
рд╢реБрджреНрдз рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд░рдВрдЧ рд▓реЗрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рд░рдВрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рдХреЛрдб рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
game.draw_line(CoordinateType::Screen, (10, 20), (30, 40), Color::Red); ^^^
рдЗрд╕рд▓рд┐рдП, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ C ++ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдпрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рднреА, рдФрд░ рдЗрд╕реЗ bwapi_sys рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ :: рд░рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ std :: Convert :: рд╕реЗ:
рдЕрдкрдиреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЖрдк enum-primitive-derive crate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдкрд╛рд░рджрд░реНрд╢реА рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИред рдЪрд▓рд┐рдП рдиреНрдпреВрдЯрд╛рдЗрдк рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
pub struct Player(*mut sys::Player);
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд▓реЗрдпрд░ рдПрдХ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ - рд╕реА рд╕реЗ рдПрдХ рдХрдЪреНрдЪрд╛ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╕реВрдЪрдХ рдФрд░ рдпрд╣рд╛рдБ рдЖрдк рдкреНрд▓реЗрдпрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ :: рд░рдВрдЧ:
impl Player {
рдЕрдм рд╣рдо рд░рд╕реНрдЯ рдореЗрдВ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдмреЙрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ!
рдЬрдВрдЧ рдореЗрдВ рдмреЙрдЯ рдмрдирд╛рдирд╛
рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рдмреЙрдЯ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рдЙрдВрдЯрд░рд░реВ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛: рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдирд╛ рдФрд░ рдЦрдирд┐рдЬреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИред


рдЪрд▓реЛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ gameInit
рдФрд░ newAIModule
:
#[no_mangle] pub unsafe extern "C" fn gameInit(game: *mut void) { bwapi_sys::BWAPIC_setGame(game as *mut bwapi_sys::Game); } #[no_mangle] pub unsafe extern "C" fn newAIModule() -> *mut void { let module = ExampleAIModule { name: String::from("ExampleAIModule") }; let result = wrap_handler(Box::new(module)); result }
#[no_mangle]
C ++ рдореЗрдВ #[no_mangle]
рдлрд╝рдВрдХреНрд╢рди extern "C"
рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдмрд▓ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдФрд░ "рдорд╛рд╕реНрдХрд┐рдВрдЧ" рд╕реА ++ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде, wrap_handler
рдЕрдВрджрд░ рд╕рднреА рдЬрд╛рджреВ рд╣реЛрддрд╛ рд╣реИред
рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд░ рднреА рд╕рд░рд▓ рдФрд░ рдХрдЯреНрдЯрд░ рд╣реИ:
struct ExampleAIModule { name: String, }
рдЖрдЗрдП рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рдЖрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВ:
impl ExampleAIModule { fn draw_stat(&mut self) { let game = Game::get(); let message = format!("Frame {}", game.frame_count()); game.draw_text(CoordinateType::Screen, (10, 10), &message); } fn give_orders(&mut self) { let player = Game::get().self_player(); for unit in player.units() { match unit.get_type() { UnitType::Terran_SCV | UnitType::Zerg_Drone | UnitType::Protoss_Probe => { if !unit.is_idle() { continue; } if unit.is_carrying_gas() || unit.is_carrying_minerals() { unit.return_cargo(false); continue; } if let Some(mineral) = Game::get() .minerals() .min_by_key(|m| unit.distance_to(m)) {
ExampleAIModule рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ onXXXX рдШрдЯрдирд╛рдУрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ EventHandler рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ AIModule_vtable рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ:
impl EventHandler for ExampleAIModule { fn on_start(&mut self) { Game::get().send_text(&format!("Hello from Rust! My name is {}", self.name)); } fn on_end(&mut self, _is_winner: bool) {} fn on_frame(&mut self) { self.draw_stat(); self.give_orders(); } fn on_send_text(&mut self, _text: &str) {} fn on_receive_text(&mut self, _player: &mut Player, _text: &str) {} fn on_player_left(&mut self, _player: &mut Player) {} fn on_nuke_detect(&mut self, _target: Position) {} fn on_unit_discover(&mut self, _unit: &mut Unit) {} fn on_unit_evade(&mut self, _unit: &mut Unit) {} fn on_unit_show(&mut self, _unit: &mut Unit) {} fn on_unit_hide(&mut self, _unit: &mut Unit) {} fn on_unit_create(&mut self, _unit: &mut Unit) {} fn on_unit_destroy(&mut self, _unit: &mut Unit) {} fn on_unit_morph(&mut self, _unit: &mut Unit) {} fn on_unit_renegade(&mut self, _unit: &mut Unit) {} fn on_save_game(&mut self, _game_name: &str) {} fn on_unit_complete(&mut self, _unit: &mut Unit) {} }
рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдирд╛ рдФрд░ рдЪрд▓рд╛рдирд╛ C рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИ:
bwapi-rs$ cargo build --example dll --target=i686-pc-windows-gnu bwapi-rs$ cp ./target/i686-pc-windows-gnu/debug/examples/dll.dll ~/Starcraft/bwapi-data/Dll.dll bwapi-rs$ cd ~/Starcraft/bwapi-data/ Starcraft$ wine bwheadless.exe -e StarCraft.exe -l bwapi-data/BWAPI.dll --headful ... ... ...
рдФрд░ рдХрд╛рдо рдХрд╛ рд╡реАрдбрд┐рдпреЛ:
OpenBW
рдпреЗ рд▓реЛрдЧ рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝ рдЧрдПред рдЙрдиреНрд╣реЛрдВрдиреЗ SC: BW рдХрд╛ рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛! рдФрд░ рд╡реЗ рдЗрд╕рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдПрдХ рд▓рдХреНрд╖реНрдп рдПрдЪрдбреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрд╕рд╕реА: рд░реАрдорд╛рд╕реНрдЯрд░реНрдб рдЙрдирдХреЗ рдЖрдЧреЗ рдерд╛ = (рдЗрд╕ рд╕рдордп, рдЖрдк рдмреЙрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рдВ, рд╕реА ++ рдореЗрдВ рднреА), рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЗрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реАрдзреЗ рд░рд┐рдкреНрд▓реЗ рдХрд░рддрд╛ рд╣реИ ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдирд╕реБрд▓рдЭреА рд╕рдорд╕реНрдпрд╛ рдереА: рд╣рдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд╕реНрддреБ рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реЛрдиреЗ рдкрд░ &mut
рдФрд░ рдЙрд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рдПрдХ рдореБрд╕реАрдмрдд рдХреА рддрд░рд╣ред рд╣рд╛рд▓реНрдЯ рдиреЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА , рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХрд╛ рд╣рд▓ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЖрдкрдХреЛ рд╕реА ++ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ "рдлрд╛рд╡рдбрд╝рд╛" рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ const
рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ const
рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖрдпрд╛, рдореИрдВрдиреЗ рд░рд┐рдкреНрд▓реЗ ьвЕьЭ╝ this рдХреЛ рджреЗрдЦрд╛ рдФрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдбреВрдм рдЧрдпрд╛ред рдЗрд╕ рдЧреЗрдо рдиреЗ рдПрдХ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ ыЖАыЭ╝ьЪ┤ рд╕реЗрдВрдз рд▓рдЧрд╛рдИред SC: BW рдХреЗ рд╕рд╛рде рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╕реЗ рдХреЛрдИ рдЦреЗрд▓ game ы╣Дъ╡РэХа ы╣Дъ╡РэХа рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ ьаХь╣Ш ьЧРъ▓М ыМАэХЬып╝ъ╡н рдкрд░ рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рдЕрдХрд▓реНрдкрдиреАрдп рдерд╛ред рдХреЛрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░реЛ-рдЧреЗрдорд░реНрд╕ as as ы░░ьЪ░ ыУд in рдХреЛрд░рд┐рдпрди рдбреЛрд░рдореНрд╕ рдХреЗ рдкреНрд░рд╛рдЗрдо рдЯрд╛рдЗрдо рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╣реА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВред эХЬъ╡н, эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡н эХЬъ╡нред
рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд StarCraft!
рд▓рд┐рдВрдХ
рд▓реЗрдЦ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреАрд╡ рдХреНрд▓рд╛рдмрдирд┐рдХ рдХреЛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред