Skip to content

Commit

Permalink
Fix reveal_area crashing in SC:R for no good reason, make it work pro…
Browse files Browse the repository at this point in the history
…perly?
  • Loading branch information
neivv committed Apr 20, 2021
1 parent 696dcec commit 76bed4c
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "aise"
version = "2.33.0"
version = "2.33.1"
authors = ["Markus Heikkinen <ittevien@gmail.com>"]
edition = "2018"

Expand Down
34 changes: 22 additions & 12 deletions src/aiscript.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1197,10 +1197,12 @@ pub unsafe extern fn resources_command(script: *mut bw::AiScript) {

pub unsafe fn reveal_vision_hook(globals: &mut Globals, game: Game, tile_flags: *mut u32) {
for rev in &mut globals.reveal_states {
if rev.time != 0 {
if rev.time != !0 {
rev.time -= 1;
if rev.time == 0 {
reveal(game, tile_flags, rev.pos, rev.players, false);
reveal(game, tile_flags, rev.pos, rev.players, rev.reveal_type, false);
} else {
reveal(game, tile_flags, rev.pos, rev.players, rev.reveal_type, true);
}
}
}
Expand All @@ -1212,33 +1214,36 @@ unsafe fn reveal(
tile_flags: *mut u32,
area: bw::Rect,
players: PlayerMatch,
reveal_type: RevealType,
reveal: bool,
) {
let tile_x = area.left / 32;
let tile_y = area.top / 32;
let limit_x = area.right / 32;
let limit_y = area.bottom / 32;
let map_width = game.map_width_tiles();
let base_mask = match (reveal_type, reveal) {
(RevealType::RevealFull, false) => 0x1,
(RevealType::RevealFull, true) => 0x101,
(RevealType::RevealFog, _) => 0x100,
};
for player in players.players().filter(|&x| x < 8) {
let player_mask = base_mask << player;

for i in tile_x..=limit_x {
for j in tile_y..=limit_y {
let tile_flag = tile_flags.add(i as usize + map_width as usize * j as usize);
if reveal {
*tile_flag &= 0x1 << player;
*tile_flag &= !player_mask;
} else {
*tile_flag |= 0x100 << player;
*tile_flag |= 0x1 << player;
*tile_flag |= player_mask;
}
}
}
}
}

pub unsafe extern fn reveal_area(script: *mut bw::AiScript) {
if bw::is_scr() {
bw_print!("reveal_area is not supported in SCR");
return;
}
let mut read = ScriptData::new(script);
let game = bw::game();
let mut globals = Globals::get("ais reveal_area");
Expand All @@ -1253,21 +1258,26 @@ pub unsafe extern fn reveal_area(script: *mut bw::AiScript) {
}
let reveal_type = match flag {
0 => RevealType::RevealFog,
1 => RevealType::RevealFull,
x => {
bw_print!("Unsupported flag modifier: {:x}", x);
return;
}
};
if time != 0 {
if time != 0 || reveal_type == RevealType::RevealFull {
let reveal_state = RevealState {
pos: src.area,
time,
time: if time == 0 {
!0
} else {
time
},
reveal_type,
players,
};
globals.reveal_states.push(reveal_state);
}
reveal(game, bw::tile_flags(), src.area, players, true);
reveal(game, bw::tile_flags(), src.area, players, reveal_type, true);
}

fn get_bank_path(name: &str) -> Option<PathBuf> {
Expand Down
3 changes: 2 additions & 1 deletion src/globals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,10 @@ pub struct RevealState {
pub players: PlayerMatch,
}

#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
#[derive(Debug, Serialize, Deserialize, Copy, Clone, Eq, PartialEq)]
pub enum RevealType {
RevealFog,
RevealFull,
}

#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
Expand Down
4 changes: 3 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,6 @@ unsafe extern fn frame_hook() {
.idle_orders
.step_frame(&mut globals.rng, &search, tile_flags);
aiscript::under_attack_frame_hook(globals);
aiscript::reveal_vision_hook(globals, game, tile_flags);
ai::update_guard_needs(game, &mut globals.guards);
ai::continue_incomplete_buildings();
aiscript::lift_land_hook(&mut globals.lift_lands, &search, game);
Expand Down Expand Up @@ -285,8 +284,11 @@ unsafe extern fn frame_hook() {

unsafe extern fn frame_hook_after() {
let mut globals = Globals::get("frame hook after");
let game = bw::game();
let tile_flags = bw::tile_flags();
aiscript::update_towns(&mut globals);
aiscript::attack_timeouts_frame_hook_after(&mut globals);
aiscript::reveal_vision_hook(&mut globals, game, tile_flags);
}

// For hooking the point after frame's ai step but before any unit orders.
Expand Down

0 comments on commit 76bed4c

Please sign in to comment.