summaryrefslogblamecommitdiff
path: root/npc/functions/dungeon.txt
blob: 58063562332099dc6017cc4e3f032328cd8e5906 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                            

                                                              
                                
                                                   
                                          

        
                                         















                                                                              
                                                  





                                                   
        














                                         
                                                                                                                                                

     
                                                              
                                                     
                   

                           
        
                          


                                         
                                  


                                                         
                          
 

                                                      
        
 





                                         



                                        




                             
                                                                                


                                
                        
                            
                             




                                                           
                                                      





                                

                                        

        













                                         
                                                                                                      


                                                          
                                   

                                              

                                                                

                                     
                                        



                                        




































































                                                                                                                                             




                                                                         
                                                           
                                         

                                                                    
                                                                
         

                                                                             

                                                


                                                

                                                      


        
 

 

                                    

                                   
                                   
                                   


 
// TMW2 Script
// Authors:
//    Jesusalva
// Description:
//    Dungeon utilities

-	script	#DungeonCore	NPC_HIDDEN,{
    end;

// Main initialization
OnInit:
    setarray .heatmap$, "007-2", "026-3";
    setarray .cursemap$, "006-4", "006-4-1", "025-1", "026-2";
    setarray .sickmap$, "029-5";
    setarray .bleedmap$, "006-9", "026-6", "026-7";
    setarray .clockmap$, "017-0", "032-2";
    end;

/////////////////////////////////////////
// Heartbeat for Heat effects
OnHeat:
    // Did you left?
    .@i=array_find(.heatmap$, getmap());
    if (.@i < 0) {
        @heat$="";
        end;
    }

    // First time seeing this
    if (@heat$ != getmap()) {
        @heat$=getmap();
        dispbottom l("This is a hot map, you're suffering damage over time.");
    }

    // You are in a HEATMAP$, so suffer damage from heat
    if (@coolio > gettimetick(2) || Class == Redy)
        percentheal -1, 0;
    else
        percentheal -5, 0;

    // New tick (dies in 140~180 seconds)
    addtimer2 rand2(7000, 9000), .name$+"::OnHeat";
    end;


/////////////////////////////////////////
// Heartbeat for Cursed Land map effects
OnCurse:
    // Did you left?
    .@i=array_find(.cursemap$, getmap());
    if (.@i < 0) {
        @curse$="";
        end;
    }

    // First time seeing this
    if (@curse$ != getmap()) {
        @curse$=getmap();
        dispbottom l("This is a Cursed Lands map, you'll lose mana over time and may also incurr in debuffs if mana is low (may cause death).");
    }

    // You are in a CURSEMAP$, so suffer damage from the curse
    if (@purifio > gettimetick(2) || Class == Savior)
        heal 0, -1;
    else if (islegendary())
        percentheal 0, -2;
    else
        percentheal 0, -4;

    // MP is below 20%, you'll get cursed
    if (Sp*100 < MaxSp*20)
        SC_Bonus(15, SC_CURSE, 1);

    // MP is below 1%, you'll get start losing HP rapidly
    if (Sp*100 < MaxSp)
        percentheal -9, 0;

    // New tick (cycles every 15 seconds in average)
    addtimer2 rand2(14000, 15000), .name$+"::OnCurse";
    end;

/////////////////////////////////////////
// Heartbeat for Disease effects
OnSick:
    // Did you left?
    .@i=array_find(.sickmap$, getmap());
    if (.@i < 0) {
        if (@forced_sick$ != getmap()) {
            @sick$="";
            end;
        }
    }

    // First time seeing this
    if (@sick$ != getmap()) {
        @sick$=getmap();
        dispbottom l("This map contains poisonous gas and may cause diseases.");
    }

    // The effect is based on HP
    if (Hp*10 > MaxHp*7)
        .@eff = SC_BLOODING;
    else if (Hp*10 > MaxHp*4)
        .@eff = SC_POISON;
    else
        .@eff = SC_DPOISON;

    // You are in a SICKMAP$, so suffer damage from disease
    if (@sickio > gettimetick(2) || Class == Raijin) {
        heal -50, 0;
    } else {
        heal -rand2(50, 200), 0;
        SC_Bonus(10, .@eff, 1);
    }

    // New tick (20 seconds fixed cycle)
    addtimer2 20000, .name$+"::OnSick";
    end;


/////////////////////////////////////////
// Heartbeat for Bleed effects
OnBleed:
    // Did you left?
    .@i=array_find(.bleedmap$, getmap());
    if (.@i < 0) {
        @bleed$="";
        end;
    }

    // First time seeing this
    if (@bleed$ != getmap()) {
        @bleed$=getmap();
        dispbottom l("This is a Blood Pact map, HP won't recover naturally, and bleeding may start.");
    }

    // You are in a BLEEDMAP$, HP regeneration is disabled
    if (@bleedio <= gettimetick(2))
        SC_Bonus(15, SC_HALT_REGENERATION, 1);

    // You may bleed at 2% chance per 15 seconds (except heroes)
    if (rand2(50) == 25 && !islegendary())
        SC_Bonus(15, SC_BLOODING, 1);

    // New tick (15 seconds fixed cycle)
    addtimer2 15000, .name$+"::OnBleed";
    end;


/////////////////////////////////////////
// Heartbeat for Clocked effects
function syndroCheck {
    .@k = getarg(0);
    .@t = getarg(1, 2000);
    sleep2(.@t);
    if (!playerattached()) return false;
    if (BaseExp != .@k) return true;
    return false;
}

OnClocked:
    // Not Applicable
    if ($CAPTCHA & 4)
        end;

    // Did you left?
    .@i=array_find(.clockmap$, getmap());
    if (.@i < 0) {
        @clocked$="";
        end;
    }

    // First time seeing this
    if (@clocked$ != getmap()) {
        @clocked$=getmap();
        dispbottom l("This is an OverClocked map, excessive combat will cause Botter's Syndrome Disease, which reduces EXP Gain and drops.");
    }
    // Prepare the variables we'll be studying
    .@mpk = MONSTERS_KILLED; .@k = BaseExp;
    // We'll now wait in some intervals. Killing in them cause
    // the K variables to be set, and contribute towards bot score.
    .@k1 = syndroCheck(.@k); .@k = BaseExp;
    .@k2 = syndroCheck(.@k); .@k = BaseExp;
    .@k3 = syndroCheck(.@k); .@k = BaseExp;
    .@k4 = syndroCheck(.@k); .@k = BaseExp;
    .@k5 = syndroCheck(.@k); .@k = BaseExp;
    .@k6 = syndroCheck(.@k); .@k = BaseExp;
    .@k7 = syndroCheck(.@k); .@k = BaseExp;
    .@k8 = syndroCheck(.@k); .@k = BaseExp;
    // Determine if you'll be afflicted, base chance is 100%
    .@chance = 100;
    // Every 2 seconds you spent without killing is -10%
    if (!.@k1)
        .@chance -= 10;
    if (!.@k2)
        .@chance -= 10;
    if (!.@k3)
        .@chance -= 10;
    if (!.@k4)
        .@chance -= 10;
    if (!.@k5)
        .@chance -= 10;
    if (!.@k6)
        .@chance -= 10;
    if (!.@k7)
        .@chance -= 10;
    if (!.@k8)
        .@chance -= 10;
    // You killed less than 7 monsters, so zero the chance
    if (.@mpk + 7 > MONSTERS_KILLED)
        .@chance -= 20;
    // (If you killed less than 12 monsters, potentially go to 10%
    else if (.@mpk + 12 > MONSTERS_KILLED)
        .@chance -= 10;

    // Determine whenever you'll be afflicted with the Syndrome
    // The syndrome duration is 30 seconds
    if (rand2(100) < .@chance) {
        // If you have a Homunculus active, the effect is smaller (5~10%)
        if (gethominfo(0))
            .@homun = (homstatus() ? 10 : 20);
        else
            .@homun = 10;
        // Calculate the effect based on your score (5~15%)
        .@eff = 5 + (.@chance / .@homun);
        // If you already have one running (!!), increase the effect
        if (getstatus(SC_BOTTER_SYNDROME)) {
            .@eff += min(100, getstatus(SC_BOTTER_SYNDROME, 1));
        }
        // Sanitize the effect (it cannot go past 30%)
        // (Note it reaches the cap if it fires at 100% rate twice w/o Homun)
        .@cap = (getmap() == "017-0" ? 30 : 40);
        .@eff = min(.@cap, .@eff);
        SC_Bonus(30, SC_BOTTER_SYNDROME, .@eff);
    }

    // New tick (14~30 seconds fixed cycle)
    addtimer2 rand(14000,30000), .name$+"::OnClocked";
    end;


}


//////////////////////////////
007-2	mapflag	nosave	007-1,99,189
006-4	mapflag	nosave	006-3,54,36
006-4-1	mapflag	nosave	006-3,54,36
029-5	mapflag	nosave	029-4,21,97
006-9	mapflag	nosave	006-6,46,27