Garrulous Glaahk Xoid Posted September 14, 2004 Share Posted September 14, 2004 I've tested this, and it seems to work. If anyone would like to test it more thoroughly, comment on it, whatever, go ahead. EDIT 1: Oops. Forgot to check for party size... Shouldn't have been coding at 2am. Code: // rager.txt//// A relatively simple text. Creature attacks anything it hates// nearby, and will occasionally "possess" someone.//// Memory Cells:// Cell 0,1 - 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 2 - Dialogue node to start with if talked to.// If left at 0, this character doesn't talk.// --------------------------------------------------------------// Cell 3 - Can possess?// When possessing someone, the creature will become immobile,// and charm it's last target every turn, unless it's target// is dead OR the target is cured of their charmed status.// If the party size is equal to 1, then possession will// never happen. If using multiples of this script, let only// one of them to do this.// --------------------------------------------------------------// <= 0 - False// >= 1 - True// --------------------------------------------------------------// Cell 4 - Goes invulnerable while in possession of someone?// Status will be set to invulnerable whilst in possession of// a victim.// --------------------------------------------------------------// <= 0 - False// >= 1 - True// --------------------------------------------------------------// Cell 5 - Can rage?// Will be divinely touched when at 2/3 of full health, will// continue to be touched every 5 turns with a 5 turn effect.// [The reason being so that if the creature is healed that the// rage can wear off over a few rounds. Yeah, just like in real// life.]// --------------------------------------------------------------// <= 0 - False// >= 1 - True// --------------------------------------------------------------// Cell 6 - Unused// Cell 7 - Unused// Cell 8 - Unused// Cell 9 - Unusedbegincreaturescript;variables;short last_rage; // For telling when the last rage was.short last_update,last_target,last_possession;short possession;body;beginstate INIT_STATE; last_update = get_current_tick(); last_target = -1; last_rage = get_current_tick(); last_possession = -1; possession = -1;break;beginstate DEAD_STATE; // Set the appropriate stuff done flag for this character being dead. if ((get_memory_cell(0) != 0) || (get_memory_cell(1) != 0)) set_flag(get_memory_cell(0),get_memory_cell(1),1);break;beginstate START_STATE; 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); }break;beginstate 3; // Attack State // If "can rage" is true, and we are below half our health // and we have waited a decent amount of time THEN rage if ((get_memory_cell(5) > 0) && (get_health(ME) < (get_max_health(ME) * 2) / 3) && (tick_difference(last_rage,get_current_tick()) >= 5)) { print_named_str(ME,"enters a demonic rage!"); put_sparkles_on_char(ME,1,10); run_animation_sound(48); set_char_status(ME,16,5,1,0); last_rage = get_current_tick(); } // If we possessing something that fell over and died... if ((possession == 1) && (char_ok(last_target) == FALSE)) { // Remove invulnerablity if Cell 4 is a positive integer. if (get_memory_cell(4) >= 1) set_char_status(ME,4,-1,1,0); last_target = -1; // Reset last_possession so we wait at LEAST five ticks // before attempting to possess again. last_possession = get_current_tick(); possession = -1; set_mobility(ME,1); } // If we aren't possessing something & our target is dead, // then return to START_STATE. if (target_ok() == FALSE) set_state(START_STATE); // Update possession if we are possessing someone, they are a // living target, and at least 1 turn has passed since we last // updated this phase. if ((possession == 1) && (char_ok(last_target)) && (tick_difference(get_current_tick(),last_update) >= 1)) { if (get_char_status(last_target,8) == 0) { if (get_memory_cell(4) >= 1) set_char_status(ME,4,-1,1,0); set_target(ME,last_target); last_target = -1; last_possession = get_current_tick(); possession = -1; set_mobility(ME,1); } else { if (get_memory_cell(4) >= 1) set_char_status(ME,4,1,1,0); // We do NOT want to update the possession more than once // per turn. Apart from that, it makes it difficult to // turn off the charmed & invulnerability status. set_char_status(last_target,8,1,1,0); last_update = get_current_tick(); } } // If can possess is true, we haven't already possessed someone, // we have waited a half decent amount of time & we get a < 50 // THEN possess our current target. if ((get_memory_cell(3) >= 1) && (party_size() >= 2) && (possession == -1) && (get_ran(1,0,100) < 50) && (tick_difference(last_possession,get_current_tick()) >= 5)) { print_named_str(get_target(),"is possessed!"); // Setup and play SFX + sound put_sparkles_on_char(ME,10,10); put_effect_on_char(get_target(),2,10,0); run_animation_sound(7); // Set creature invulnerable if Cell 4 is a positive integer. if (get_memory_cell(4) >= 1) set_char_status(ME,4,1,1,0); set_char_status(get_target(),8,2,1,0); last_update = get_current_tick(); last_target = get_target(); last_possession = get_current_tick(); possession = 1; set_target(ME,-1); set_mobility(ME,0); } 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; Link to comment Share on other sites More sharing options...
Recommended Posts