Garrulous Glaahk spyderbytes Posted April 6, 2004 Share Posted April 6, 2004 There are probably some optimizations that can be made to this (I'm an Avernumscript noob), but it should be pretty safe and generic. Enjoy! Code: // cpoisonspit.txt// Much like basicnpc, but creature spits poison every other round at anyone in the// party in an adjacent and visible location. Also includes logic for granting an optional// special item after a number of these cretures specified in Memory Cell 4 have died.// 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 each of these dies, // flag is incremented.// Cell 3 - Dialogue node to start with if talked to. if left at 0, this// character doesn't talk.// Cell 4 - Number of these things to die before a special item is granted. If 0, no// special item is granted.// Cell 5 - Special item to grant on death.// Cell 6 - Number of dice for poison damage// Cell 7 - Size of dice for poison damagebegincreaturescript;variables;short i, target, last_abil_time, distance, max;body;beginstate INIT_STATE; if (get_memory_cell(0) == 2) set_mobility(ME, 0); last_abil_time = get_current_tick(); // uesd to determine when to spit poisonbreak;beginstate DEAD_STATE; // Increment the appropriate stuff done flag for this character being dead if ((get_memory_cell(1) != 0) || (get_memory_cell(2) != 0)) { inc_flag(get_memory_cell(1), get_memory_cell(2), 1); if (get_memory_cell(4) != 0 && (get_memory_cell(4) == get_flag(get_memory_cell(1), get_memory_cell(2)))) { // only want to do this after specified number of these die // give the special item change_spec_item(get_memory_cell(5), 1); // make it more obvious to the player that a special item was found play_sound(0); // high beep message_dialog("Your message here...", "(You have gained a special item. Check the Character Info screen to examine it.)"); } }break;beginstate START_STATE; // 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); } // Look for a target, attack it if visible if (select_target(ME, 8, 0)) { do_attack(); set_state(3); } // Have I been hit? Strike back! if (who_hit_me() >= 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); // time to spit more poison? if (tick_difference(last_abil_time, get_current_tick()) > 1) { max = party_size(); i = 0; while (i < max) { // loop through party distance = char_dist_to_loc(i, my_loc_x(), my_loc_y()); // how close is this char? if (distance == 1 && (can_see_char(i) == TRUE)) { print_named_str(ME, " spits poison!"); play_sound(42); // acid spray -- close enough for poison, I reckon damage_char(i, get_ran(get_memory_cell(6), 1, get_memory_cell(7)), 2); } i = i + 1; } last_abil_time = get_current_tick(); } 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; -spyderbytes Link to comment Share on other sites More sharing options...
Recommended Posts