diff options
-rw-r--r-- | npc/001-1/portal.txt | 7 | ||||
-rw-r--r-- | npc/018-5-4/elder.txt | 106 |
2 files changed, 69 insertions, 44 deletions
diff --git a/npc/001-1/portal.txt b/npc/001-1/portal.txt index 6e8dceb09..6865bc77b 100644 --- a/npc/001-1/portal.txt +++ b/npc/001-1/portal.txt @@ -70,6 +70,13 @@ L_TranslationFix: mes l("Burn, destroy, do whatever you need, until your last breath, my lieutenants and colonels!"); mes l("Summoned Monster"); mes l("Scout"); + mes l("Desert Pirate"); + mes l("Marsh Pirate"); + mes l("Buccaneer"); + mes l("Corsair"); + mes l("Pirate Lord"); + mes l("Duck Soldier"); + mes l("Duck Initiate"); mes l("sample"); close; diff --git a/npc/018-5-4/elder.txt b/npc/018-5-4/elder.txt index 2088a5bd7..ad5f93a2e 100644 --- a/npc/018-5-4/elder.txt +++ b/npc/018-5-4/elder.txt @@ -184,9 +184,10 @@ function elderPirateAttack { if (askyesno() == ASK_NO) return; + .@mapn$="duck@"+getcharid(0); + // Build instance if it doesn't exists or has been reallocated if (instanceowner(@duckinst) != getcharid(3)) { - .@mapn$="duck@"+getcharid(0); @duckinst = instance_create("duck@a"+getcharid(0), getcharid(3), IOT_CHAR); instance_attachmap("018-5-4", @duckinst, false, .@mapn$); // Instance lasts 6 minutes @@ -198,21 +199,26 @@ function elderPirateAttack { } getmapxy(.@m$, .@x, .@y, 0); warp .@mapn$, .@x, .@y; - addtimer(300, instance_npcname(.name$, @duckinst)+"::OnBegin"); + //debugmes "Warp successful"; + //debugmes "Prepare timer, target: %s in %d - aka. %s", .name$, @duckinst, instance_npcname(.name$, @duckinst); + addtimer(300, .name$+"::OnBegin"); closeclientdialog; close; return; } OnBegin: + //debugmes "BEGIN NPC %s, char %s. Map %s", instance_npcname(.name$, @duckinst), strcharinfo(0), getmap(); + .@n$=instance_npcname(.name$, @duckinst); + .@m$=getmap(); killmonsterall(getmap()); - .pLvl = BaseLevel; - .pirate_killed = 0; - .duck_killed = 0; - .total_pirates = 0; - .total_ducks = 0; - setnpcdisplay .name$, NPC_NO_SPRITE; + @pLvl = BaseLevel; + @pirate_killed = 0; + @duck_killed = 0; + @total_pirates = 0; + @total_ducks = 0; + setnpcdisplay .@n$, NPC_NO_SPRITE; sleep2(1000); mapannounce(getmap(), "Duck Elder : Here they come...", bc_map); sleep2(1000); @@ -224,59 +230,69 @@ OnBegin: // Spawn Monsters // FIXME MIGHT NOT WORK WITH COORDINATES ZERO (for several reasons) // PLEASE PREFER AREAMONSTER - monster("018-5-4", 0, 0, "Ocean Pirate", OceanPirate, .pLvl, "Duck Elder::OnPirateKilled"); - .total_pirates+=.pLvl; - monster("018-5-4", 0, 0, "Pirate Captain", OceanPirate, (.pLvl/10), "Duck Elder::OnPirateKilled"); // FIXME - .total_pirates+=(.pLvl/10); - monster("018-5-4", 0, 0, "Desert Pirate", DesertBandit, (.pLvl/2), "Duck Elder::OnPirateKilled"); - .total_pirates+=(.pLvl/2); - monster("018-5-4", 0, 0, "Marsh Pirate", Bandit, (.pLvl/2), "Duck Elder::OnPirateKilled"); - .total_pirates+=(.pLvl/2); - monster("018-5-4", 0, 0, "Buccaneer", Sarracenus, (.pLvl/5), "Duck Elder::OnPirateKilled"); - .total_pirates+=(.pLvl/5); - monster("018-5-4", 0, 0, "Corsair", RobinBandit, (.pLvl/5), "Duck Elder::OnPirateKilled"); - .total_pirates+=(.pLvl/5); - monster("018-5-4", 0, 0, "Pirate Lord", BanditLord, (.pLvl/10), "Duck Elder::OnPirateKilled"); - .total_pirates+=(.pLvl/10); - monster("018-5-4", 0, 0, "Pirate Assassin", HoodedAssassin, (.pLvl/25), "Duck Elder::OnPirateKilled"); - .total_pirates+=(.pLvl/25); + monster(.@m$, 0, 0, "Ocean Pirate", OceanPirate, @pLvl, "Duck Elder::OnPirateKilled"); + @total_pirates+=@pLvl; + monster(.@m$, 0, 0, "Pirate Captain", OceanPirate, (@pLvl/10), "Duck Elder::OnPirateKilled"); // FIXME + @total_pirates+=(@pLvl/10); + monster(.@m$, 0, 0, "Desert Pirate", DesertBandit, (@pLvl/3), "Duck Elder::OnPirateKilled"); + @total_pirates+=(@pLvl/3); + monster(.@m$, 0, 0, "Marsh Pirate", Bandit, (@pLvl/3), "Duck Elder::OnPirateKilled"); + @total_pirates+=(@pLvl/3); + monster(.@m$, 0, 0, "Buccaneer", Sarracenus, (@pLvl/6), "Duck Elder::OnPirateKilled"); + @total_pirates+=(@pLvl/6); + monster(.@m$, 0, 0, "Corsair", RobinBandit, (@pLvl/5), "Duck Elder::OnPirateKilled"); + @total_pirates+=(@pLvl/5); + monster(.@m$, 0, 0, "Pirate Lord", BanditLord, (@pLvl/11), "Duck Elder::OnPirateKilled"); + @total_pirates+=(@pLvl/11); + monster(.@m$, 0, 0, "Pirate Assassin", HoodedAssassin, (@pLvl/25), "Duck Elder::OnPirateKilled"); + @total_pirates+=(@pLvl/25); + debugmes "Pirates of SARAH, \"%s\" - Total: %d (Lv %d)", strcharinfo(0), @total_pirates, @pLvl; // Reinforcements // FIXME: We might not want summon() here (summon is immune to AOE) // We probably want bg_monster (blame Jesusalva) or monster w/ alchemy flag - for(.@i = 0; .@i < min(10, .pLvl/5); ++.@i) { + for(.@i = 0; .@i < min(10, @pLvl/5); ++.@i) { .@sd=summon("Duck Soldier", Duck, 300000, "Duck Elder::OnDuckKilled"); .@bhp=getunitdata(.@sd, UDT_MAXHP); // Abizit makes bonus HP vary (like AdjustSpellpower) .@lvx = .@bhp * (80 + abizit() * rand2(5,10)) / 100; - setunitdata(.@mids, UDT_MAXHP, .@lvx); - setunitdata(.@mids, UDT_HP, .@lvx); - .total_duck++; + setunitdata(.@sd, UDT_MAXHP, .@lvx); + setunitdata(.@sd, UDT_HP, .@lvx); + @total_duck++; } - for(.@i = 0; .@i < min(5, .pLvl/20); ++.@i) { + for(.@i = 0; .@i < min(5, @pLvl/20); ++.@i) { .@sd=summon("Duck Initiate", EliteDuck, 300000, "Duck Elder::OnDuckKilled"); .@bhp=getunitdata(.@sd, UDT_MAXHP); // Abizit makes bonus HP vary (like AdjustSpellpower) .@lvx = .@bhp * (80 + abizit() * rand2(5,10)) / 100; - setunitdata(.@mids, UDT_MAXHP, .@lvx); - setunitdata(.@mids, UDT_HP, .@lvx); - .total_duck++; + setunitdata(.@sd, UDT_MAXHP, .@lvx); + setunitdata(.@sd, UDT_HP, .@lvx); + @total_duck++; } // Begin timer - initnpctimer(); + //initnpctimer(); + addtimer 300000, "Duck Elder::OnTimerQuit"; end; OnPirateKilled: - .pirate_killed++; - if (.pirate_killed >= .total_pirates) { + @pirate_killed++; + .@mia=@total_ducks-@duck_killed; + if (.@mia < mobcount(getmap(), "Duck Elder::OnDuckKilled")) + @duck_killed=@total_ducks-mobcount(getmap(), "Duck Elder::OnDuckKilled"); + if (@duck_killed >= @total_ducks) { + elderPirateDefeat(); + } + if (@pirate_killed >= @total_pirates) { elderPirateVictory(); } end; OnDuckKilled: - .duck_killed++; - if (.duck_killed >= .total_ducks) { + if (!playerattached()) + end; + @duck_killed++; + if (@duck_killed >= @total_ducks) { elderPirateDefeat(); } end; @@ -292,10 +308,11 @@ OnTimerQuit: function elderPirateVictory { stopnpctimer(); - .pirate_killed = 0; - .duck_killed = -50; // Set to -50 to make sure defeat doesn't trigger when monsters are killed + @pirate_killed = 0; + @duck_killed = -50; // Set to -50 to make sure defeat doesn't trigger when monsters are killed announce("Duck Elder : Success! The pirates have been thwarted.", bc_self); - setnpcdisplay .name$, NPC_DUCK_ELDER; + .@n$=instance_npcname(.name$, @duckinst); + setnpcdisplay .@n$, NPC_DUCK_ELDER; setq(LilitQuest_PiratesOfSARAH, 3); getmapxy(.@m$, .@x, .@y, 0); killmonsterall(.@m$); @@ -306,11 +323,12 @@ function elderPirateVictory { } function elderPirateDefeat { - stopnpctimer(); - .pirate_killed = -50; // Set to -50 to make sure victory doesn't trigger when monsters are killed - .duck_killed = -50; + //stopnpctimer(); + @pirate_killed = -50; // Set to -50 to make sure victory doesn't trigger when monsters are killed + @duck_killed = -50; announce("Duck Elder : We have failed. The pirates will regroup and replenish their fallen. They will strike again, until we are defeated.", bc_self); - setnpcdisplay .name$, NPC_DUCK_ELDER; + .@n$=instance_npcname(.name$, @duckinst); + setnpcdisplay .@n$, NPC_DUCK_ELDER; getmapxy(.@m$, .@x, .@y, 0); killmonsterall(.@m$); warp "018-5-4", .@x, .@y; |