// magekiller.txt // This script works like the regular basicnpc.txt script except that in combat // the character will favor attacking spell casters (mages or priests). // When choosing a target, it will select the mage or priest in the party of // the highest mage/priest spell ability respectively and attack him/her. // If there are no living PCs with mage or priest spell abilities, then the // character behaves normally. // // IMPORTANT: Only use this script on monsters that are hostile to the party. // The behavior of friendly npcs in combat with this script is very awkward. // // Memory Cells: // Cell 0 - How creature moves. // 0 - If 0, wander randomly. // 1 - Stands still until a target appears. // 2 - Completely immobile, even if target appears. // Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this // is killed, set to 1. (Example: If cell 1 is 3 and cell 2 is 5, when // creature is killed, sets SDF(3,5) to 1.) // Cell 3 - Dialogue node to start with if talked to. if left at 0, this // character doesn't talk. begincreaturescript; variables; short i,target; short randtarg; short caster; body; beginstate INIT_STATE; if (get_memory_cell(0) == 2) set_mobility(ME,0); break; beginstate DEAD_STATE; // Set the appropriate stuff done flag for this character being dead if ((get_memory_cell(1) != 0) || (get_memory_cell(2) != 0)) set_flag(get_memory_cell(1),get_memory_cell(2),1); break; beginstate START_STATE; // Selecting a spell caster as a target. // First sees whether a living mage or priest are in the party. If so, it randomly // selects whether to attack the mage or the priest of highest ability. // Variable randtarg = 0 for mage, randtarg = 1 for priest. // In doing this, it checks to see if the corresponding target (mage or priest) // is actually alive. If not, it switches to opposite one. // Should there be no living mage and priest PCs, the character targets normally. if ((char_with_highest_skill(11) >= 0) || (char_with_highest_skill(12) >= 0)) { randtarg = get_ran(1,0,1); if (randtarg == 0) { if (char_with_highest_skill(11) >= 0) { caster = char_with_highest_skill(11); } else { caster = char_with_highest_skill(12); } } if (randtarg > 0) { if (char_with_highest_skill(12) >= 0) { caster = char_with_highest_skill(12); } else { caster = char_with_highest_skill(11); } } set_target(ME,caster); do_attack(); set_state(3); } else { if (select_target(ME,8,0)) { do_attack(); set_state(3); } } // if I have a target for some reason, go attack it if (target_ok()) { if (dist_to_char(get_target()) <= 16) set_state(3); else set_target(ME,-1); } // Have I been hit? Strike back but only if there are no living mage/priests. if ((who_hit_me() >= 0) && ((char_with_highest_skill(11) < 0) && (char_with_highest_skill(12) < 0))) { set_target(ME,who_hit_me()); do_attack(); set_state(3); } // Otherwise, just peacefully move around. Go back to start, if I'm too far // from where I started. if ((my_dist_from_start() >= 6) || ((my_dist_from_start() > 0) && (get_memory_cell(0) > 0))) { if (get_ran(1,1,100) < 40) return_to_start(ME,1); } else if (get_memory_cell(0) == 0) { fidget(ME,25); } // if we're in combat and the above didn't give me anything to do, just // stop now. Otherwise, game will keep running script, and that eats up CPU time. if (am_i_doing_action() == FALSE) end_combat_turn(); break; beginstate 3; // attacking if (target_ok() == FALSE) set_state(START_STATE); do_attack(); break; beginstate TALKING_STATE; if (get_memory_cell(3) == 0) { print_str("Talking: It doesn't respond."); end(); } begin_talk_mode(get_memory_cell(3)); break;