summaryrefslogblamecommitdiff
path: root/npc/023-3/logic.txt
blob: 0b722516e20ad06b5268378e83d956f65534a2e5 (plain) (tree)
1
2
3
4
5
6
7
8
9

                
                 
               
                                                                                 



                                                        
            

        


                                     
                       
                                  
                      

                    



                                              
                                     





                                                        
            

        


                                     
                       
                                  
                      

                    
                                 
                       


                                                                      

                        

                             

 



                                                                              


                                                                                           

       

                      

 
 

                                                                       
            

        







                                                                     


 
                                                           
                                                               



                                        
                                                                  


                                                                                

                                             
            
     






























                                                                                                                                                         

                                   























                                                                                            

                
















                                                                      
                                                  

            
       

                      




                                                                
            

        

                                           

            





                                                                     
 
 
                                                         
                                                    
            

        

                     

              
                     
       




                                                                                                                                                                          
 
 



























                                                                                                 
                                             

                           


                                                        
            

           
                


                                     
 
 

                                                    
            
       





                                                                                 

           



                                        
 


                                                              
 


                                                              
 


                                                              
 


                                                              
 

                     
 



                                                              
            

       



                          
 
           



                                        
                                       
                                                                              
         

                     
 
          

                                     
                                   

            

           

                                   

 
                                                              
            

       



                          
 
           



                                        
                                       
                                                                              
         

                     
 
          

                                     
                                   

            

           

                                   
 
 

                                                                                    
 
// TMW2 scripts.
// Author:
//	Jesusalva
// Description:
//	023-3 Abandoned Ice Caves Configuration File. Variables: $@LOGIC_0233BOSS

023-3	mapflag	zone	MMO

023-3,63,220,0	script	#Exit0233	NPC_HIDDEN,0,0,{
	end;

OnTouch:
	.@q=getq(General_Narrator);
	.@q2=getq2(General_Narrator);
	// Cheater Detected
	if (.@q < 15) {
		warp "Save", 0, 0;
		die();
		end;
	}

	mesc l("Return to Frostia's Castle?");
	if (askyesno() == ASK_YES) {
		.@mapn$="024-16";
		warp .@mapn$, 30, 26;
	}
	closeclientdialog;
	close;
}

023-3,48,22,0	script	#Finish0233	NPC_HIDDEN,0,0,{
	end;

OnTouch:
	.@q=getq(General_Narrator);
	.@q2=getq2(General_Narrator);
	// Cheater Detected
	if (.@q < 15) {
		warp "Save", 0, 0;
		die();
		end;
	}
	// Not allowed to proceed
	if (.@q > 15) {
		dispbottom l("Hmm, no, I shouldn't go back there...");
		end;
	}

	.@mapn$="001-7";
	warp .@mapn$, 91, 90;
	end;
}

// A simple random treasure chest - to be sure players were introduced to this
// awesome system. Same rules as any treasure box still applies.
023-3,94,212,0	script	#chest_02330	NPC_CHEST,{

	TreasureBox();
	specialeffect(.dir == 0 ? 24 : 25, AREA, getnpcid()); // closed ? opening : closing
	close;

OnInit:
	.distance = 2;
	end;
}


// Miniboss fight must be enabled on right npc. No passing before that.
023-3,120,103,0	script	#MiniBossTrap0233	NPC_HIDDEN,0,2,{
	end;

OnTouch:
	.@q=getq(FrostiaQuest_Homunculus);
	if (!.@q) {
		dispbottom l("A powerful magic barrier repels you!");
		getmapxy(.@m$, .@x, .@y, 0);
		slide .@x-2, .@y;
		sit();
	}
	end;
}


// The scout which went ahead of you (+ miniboss mechanics)
023-3,86,88,0	script	Elite Scout#MB0233	NPC_DARKSABER,{
	if ($@LOGIC_0233BOSS) {
		npctalkonce l("FIGHT!");
		end;
	}
	if (getq(FrostiaQuest_Homunculus) >= 1 && !is_sponsor()) {
		npctalkonce l("I'm not going any closer to that cursed place!");
		end;
	}
    if (getq(FrostiaQuest_Homunculus) >= 1) {
        npctalk3 l("Everything in order.");
        end;
    }
	mesn;
	mesq l("Congratulations in making this far, @@.", strcharinfo(0));
	next;
	select
		l("Thanks, and bye."),
		l("What should I do now?");
	if (@menu == 1)
		close;
	mes "";
	mesn;
	mesq l("So, there is a magical barrier to the right, which is in place exactly to protect us.");
	next;
	mesn;
	mesq l("Past this checkpoint, is the village where the Monster King was born.");
	next;
	mesn;
	mesq l("If you want to pass through it, you'll need to defeat the Guardian which made the seal. You can bring friends for healing and support.");
	next;
	mesn;
	mesq l("Once the fight begins, the barrier at your left will lock. It won't open until the fight is over.");
	next;
	mesn;
	mesq l("Are you ready?");
	mesc l("WARNING: DO NOT PROCEED UNLESS YOU'RE READY."), 1;
	if (askyesno() == ASK_YES && !$@LOGIC_0233BOSS) {
		$@LOGIC_0233BOSS=getcharid(3); // It could be 1.
		$@LOGIC_0233BOXX=monster("023-3", any(85,94,103,113), any(91,96,102,111), "Guardian", Yeti, 1, .name$+"::OnYetiDefeat");
		initnpctimer;
	}
	closeclientdialog;
	end;
// Check if fight is still going on
OnTimer10000:
	if (!attachrid($@LOGIC_0233BOSS)) {
		killmonster("023-3", .name$+"::OnYetiDefeat");
		$@LOGIC_0233BOSS=0;
		end;
	}
	// You gave up, finish it now and not later
	if (getmap() != "023-3") {
		killmonster("023-3", .name$+"::OnYetiDefeat");
		$@LOGIC_0233BOSS=0;
		end;
	}
	// What if the Yeti left the chamber? O.o
	// It's not like there was mob collision to prevent this from happening
	// If that's the case, bring the Yeti to player position and order attack :>
	getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@LOGIC_0233BOXX);
	getmapxy(.@mx$, .@xx, .@yx, 0);
	if (!(is_between(79, 120, .@x) && is_between(75, 125, .@y))) {
		unitwarp($@LOGIC_0233BOXX, .@mx$, .@xx, .@yx);
		unitattack($@LOGIC_0233BOXX, $@LOGIC_0233BOSS);
		unittalk($@LOGIC_0233BOXX, "I did not forgot you, @@! %%e", strcharinfo(0));
		end;
	}
	initnpctimer;
	end;
// Yeti Defeated
OnYetiDefeat:
	stopnpctimer;
	.@rid=$@LOGIC_0233BOSS;
	$@LOGIC_0233BOSS=0;
	// In past, only MVP would count. Now, the requester count.
	if (playerattached())
		detachrid();
	// Player decided to leave the game, annuled
	if (!attachrid(.@rid))
		end;
	// Player decided to leave for a walk, annuled
	if (!isin("023-3", 79, 75, 120, 125))
		end;

	// We don't need compareandsetq because it's now the requester
	message(.@rid, l("You've slayed the Yeti."));
	npctalk l("Good luck in your journey, @@.", rid2name(.@rid));
	setq FrostiaQuest_Homunculus, 1;
    specialeffect(FX_FANFARE, AREA, getcharid(3));

	end;
OnInit:
	.distance = 5;
	end;
}


// Cannot flee from Miniboss Fight
023-3,80,84,0	script	#MiniBossTrapB0233	NPC_HIDDEN,5,0,{
	end;

OnTouch:
	.@q=getq(FrostiaQuest_Homunculus);
	.@q2=getq(FrostiaQuest_Homunculus);
    if (.@q)
        end;
	if ($@LOGIC_0233BOSS) {
		dispbottom l("A powerful magic barrier repels you!");
		slide 81, 86;
		sit();
	}
	end;
}

// A not-so-simple treasure chest from Sagratha's Dungeon
023-3,0,0,0	script	#0233ChestCtrl	NPC_HIDDEN,{
	end;

OnDelay:
	initnpctimer;
	end;

OnTimer180000:
	stopnpctimer;
OnInit:
	setarray .@x, 189, 191, 193, 186;
	setarray .@y,  44,  42,  43,  45;
	.@r=rand2(getarraysize(.@x));
	monster "023-3", .@x[.@r], .@y[.@r], "Treasure Chest", any(BronzeChest,BronzeMimic,SilverChest,SilverMimic,GoldenChest,GoldenMimic), 1, "#0233ChestCtrl::OnDelay";
	end;
}

// Aethyr Gateway
023-3,26,219,0	script	#AethyrGate	NPC_HIDDEN,{
	end;

OnInit:
    // In theory, pattern ID must be between 1~9
    // To set $@p1$~$@p9$ with the PERL expression
    // But as we're only using $@p0$ (full string)
    // the value itself is meaningless
    .pid=getnpcid();
    debugmes "Aethyr: Pattern %d", .pid;
    //I'm not going to learn PERL just for that
    defpattern(.pid, "^(.*)$", "OnTalkNearby");
    activatepset(.pid);
    end;

OnTalkNearby:
    // not very obvious stuff by gumi, $@p0$ contains the whole string
    // so we must cut it. Could use $@p1$ if perl was proper but... meh.
    .@no_nick$ = strip(substr($@p0$, getstrlen(strcharinfo(PC_NAME)) + 3, getstrlen($@p0$) - 1));
    .@message$ = strtoupper(.@no_nick$);

    //0234_Password_BlackBox(.@message$);
    callfunc "0234_Password_BlackBox", .@message$;
    end;
}


// TODO: Spike traps and etc. at the corritor
// TODO: Rolling Stone Trap

// Delete rolling stones as they hit this wall
/*023-3,47,40,0	script	#0233DelStone	NPC_HIDDEN,1,0,{
OnTouch:
	end;

OnTouchNPC:
	//die();
	//unitkill(0);
	unitwarp(0, "023-3", 42, 26);
	end;
}

// TODO: Rolling Stone core
023-3,0,0,0	script	#0233RollStone	NPC_HIDDEN,{
	end;
OnInit:
	$@0233_STONEA=monster("023-3", 47, 23, "Rolling Stone", RollingStone, 1);
	$@0233_STONEB=monster("023-3", 48, 25, "Rolling Stone", RollingStone, 1);
	$@0233_STONEC=monster("023-3", 47, 30, "Rolling Stone", RollingStone, 1);
	$@0233_STONED=monster("023-3", 48, 37, "Rolling Stone", RollingStone, 1);
	initnpctimer;
	end;

OnTimer250:
	unitwalk($@0233_STONEA, 47, 40);
	unitwalk($@0233_STONEC, 47, 40);
	unitwalk($@0233_STONEB, 48, 40);
	unitwalk($@0233_STONED, 48, 40);

	getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONEA);
	if (.@y >= 40)
		unitwarp($@0233_STONEA, "023-3", 47, 23);

	getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONEB);
	if (.@y >= 40)
		unitwarp($@0233_STONEB, "023-3", 48, 23);

	getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONEC);
	if (.@y >= 40)
		unitwarp($@0233_STONEC, "023-3", 47, 23);

	getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@0233_STONED);
	if (.@y >= 40)
		unitwarp($@0233_STONED, "023-3", 48, 23);

	initnpctimer;
	end;
}
*/

// TODO: NPC walking cannot trigger OnTouch events >.>
023-3,47,23,0	script	#0233RollStoneA	NPC_ROLLINGSTONE,0,0,{
	end;

OnInit:
	npcspeed(240);
	initnpctimer;
	npcwalkto(47, 41);
	end;

OnTimer120:
	if (.y >= 40) {
		movenpc(.name$, 47, 23);
		npcwalkto(47, 41);
	}
	if (getareausers("023-3", 0)) {
		areatimer2("023-3", .x, .y, .x, .y, 10, .name$+"::OnTouchie");
	}
	initnpctimer;
	end;

OnTouchie:
	if (isin(.map$, .x, .y, 0)) {
		percentheal -40, -40;
		warp .map$, 49, 41;
	}
	end;

OnTouchNPC:
	sc_start SC_COMA, 60000, 0;
	end;
}

023-3,48,26,0	script	#0233RollStoneB	NPC_ROLLINGSTONE,0,0,{
	end;

OnInit:
	npcspeed(240);
	initnpctimer;
	npcwalkto(49, 41);
	end;

OnTimer120:
	if (.y >= 40) {
		movenpc(.name$, 48, 23);
		npcwalkto(48, 41);
	}
	if (getareausers("023-3", 0)) {
		areatimer2("023-3", .x, .y, .x, .y, 10, .name$+"::OnTouchie");
	}
	initnpctimer;
	end;

OnTouchie:
	if (isin(.map$, .x, .y, 0)) {
		percentheal -40, -40;
		warp .map$, 49, 41;
	}
	end;

OnTouchNPC:
	sc_start SC_COMA, 60000, 0;
	end;
}

023-3,47,30,0	duplicate(#0233RollStoneA)	#0233RollStoneC	NPC_ROLLINGSTONE,0,0
023-3,48,37,0	duplicate(#0233RollStoneB)	#0233RollStoneD	NPC_ROLLINGSTONE,0,0