From b0d117e646bfc85671e7204172820db48a20bc0f Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 28 Oct 2023 08:43:19 +0200 Subject: [PATCH] crossbow:: checkmate rule --- checkmove.cpp | 2 ++ crossbow.cpp | 24 ++++++++++++++++++++++++ pcmove.cpp | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/checkmove.cpp b/checkmove.cpp index 20dbcd79..13e8a8fc 100644 --- a/checkmove.cpp +++ b/checkmove.cpp @@ -338,6 +338,8 @@ EX void checkmove() { } #endif + if(!canmove && bow::crossbow_mode()) canmove = bow::have_bow_target(); + if(!canmove) { achievement_final(true); if(cmode & sm::NORMAL) showMissionScreen(); diff --git a/crossbow.cpp b/crossbow.cpp index 22ba1e62..ecfa813f 100644 --- a/crossbow.cpp +++ b/crossbow.cpp @@ -297,6 +297,30 @@ EX void shoot() { gen_bowpath_map(); } +EX bool have_bow_target() { + dynamicval bp(bowpath); + dynamicval bpm(bowpath_map); + + for(int i=0; icpdist] = {c}; + + int res = create_path(); + if(res == -1) continue; + + checked_move_issue = miVALID; + pcmove pcm; + pcm.checkonly = true; + changes.init(true); + bool b = pcm.try_shooting(false); + changes.rollback(); + + if(b) return true; + } + return false; + } + EX void showMenu() { cmode = sm::SIDE | sm::MAYDARK; gamescreen(); diff --git a/pcmove.cpp b/pcmove.cpp index 2372d3bd..c5034075 100644 --- a/pcmove.cpp +++ b/pcmove.cpp @@ -332,7 +332,7 @@ bool pcmove::movepcto() { changes.rollback(); if(!checkonly) flipplayer = false; - if(!b && items[itCrossbow] == 0 && bow::crossbow_mode() && !bow::fire_mode && d >= 0) { + if(!b && items[itCrossbow] == 0 && bow::crossbow_mode() && !bow::fire_mode && d >= 0 && !checkonly) { changes.init(checkonly); changes.value_keep(bow::bowpath_map); b = try_shooting(true);