Jump to content

Poison spitting creature script


Recommended Posts

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! smile

 

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

Guest
This topic is now closed to further replies.
×
×
  • Create New...