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








                                                        
                              


                            
                                                               
              
 
                                 











                                                                                     
                         


        
                                                                                 


                                                                                                       
                           
























                                                                                                                                                      



                                                                 
                                                                    
                                 
                                              
                  
     












                                                                     
                                                       













                                                          
                                                       













                                                             
                                                       










                                                         
                                                       


                                                                             
                                                               




                
                                                       






                                                                                 
                                                       







                                                     
                                                                     







                                                       
                                               
                      
                                                 







                                                                    
 
                                                        
                              
                         
                                                                                                                                                              

                                                        
                                                                       

                                  
     









                                                                                 
                       
                                                                                                                                    

                                                        
                                                                       

                                  
     






                                                       
                              
                     
                                                                                                                                     
        




                                              
                                                      








                                                                                                    
                                                                    
                                 
                                              


                  








                                                                                 
                         
                                                                                                              

                                                      
                                                                       

                                  
     





                
















                                                                          
                                                                    
                                 
                                              
                  














































































                                                                                                                                


                                                                                 
  
                                                             
                                                       





                                                                                                                              
          



                
  
 
// TMW Script.
// Author:
//    Jesusalva
// Notes:
//    Christmas 2021 - Northen Lights Dungeon

081-2,90,20,0	script	#0812Nexit	NPC_HIDDEN,0,0,{
    end;
OnTouch:
    if (!isChristmas21()) end;
    if (!'XMAS21AMBUSH) end;
    if (!'XMAS21CANDLE) end;
    if (!'XMAS21TREE) end;
    /* We need to determine if instance exists and is needed */
    X21INIT();

	.@mapn$="0813@"+X21ID2();

    /* Boss Chamber may be... unique */
    if ('LOCKD) {
        if (getmapusers(.@mapn$) > 0) {
            dispbottom l("Northern Lights")+" : "+l("This chamber is full.");
            end;
        } else {
            // Cleanup the chamber
            doevent instance_npcname("Pentagram#Xmas21A", instance_id())+"::OnClean";
        }
    }

    warp .@mapn$, 44, 49;
    end;
}

/* *************************************************************************** */
/* Candle Puzzle */
081-2,130,255,0	script	#X21Candle_0	NPC_NO_SPRITE,{
    if (!countitem(ThermalNapalm)) { dispbottom(l("I don't have anything to lit this candle.")); end; }
    if ('XMAS21CANDLE) end;
    // Extract ID
    .@n$=strnpcinfo(2, "_-1");
    explode(.@ni$, .@n$, "_");
    .@id=atoi(.@ni$[1]);
    if (.@id < 0) { consolemes(CONSOLEMES_ERROR, "ERROR, X21 Invalid Candle"); end; }
    .@c = 'X21_CANDLE[.@id];
    .@c$ = (.@c == 0 ? l("No") : (.@c == 1 ? l("Regular") : l("Magic")));

    mes l("This candle is using %s Fire.", .@c$);
    mes l("Do you want to change it?");
    mesc l("Cost: 1x %s", getitemlink(ThermalNapalm)), 1;
    next;
    menuint
        l("No, leave it alone."), -1,
        rif(.@c != 1, l("Lit a regular fire.")), 1,
        rif(.@c != 2, l("Lit a magic fire.")), 2,
        rif(.@c != 0, l("Remove the fire.")), 0;
    mes "";
    if (@menuret < 0) { closeclientdialog; close; }
    delitem ThermalNapalm, 1;
    'X21_CANDLE[.@id] = @menuret;
    // Modify the flame sprite
    setnpcdisplay(instance_npcname(strnpcinfo(0)), (@menuret ? (@menuret == 1 ? NPC436 : NPC437) : NPC_NO_SPRITE));
    //debugmes "Sprite %s (%s) to %d", strnpcinfo(0), instance_npcname(strnpcinfo(0)), (@menuret ? (@menuret == 1 ? NPC436 : NPC437) : NPC_NO_SPRITE);
    // What about 374 instead of 437?
    // Unlock the gate once the puzzle is complete
    if (X21CANDLE_CHECK()) {
        delcells("X21L1@"+X21ID());
        specialeffect(FX_MAGIC_WICKED_SPAWN, AREA, getcharid(3));
        mapannounce getmap(), "Puzzle solved by "+strcharinfo(0), 0;
        getexp X21_EXP_PUZZLE, 0;
        getitem XmasTicket, X21_TICKET_PUZZLE;
        X21INIT();
    }
    closeclientdialog;
    close;
OnInit:
    .distance=1;
    end;
}

081-2,131,257,0	duplicate(#X21Candle_0)	#X21Candle_1	NPC_NO_SPRITE
081-2,132,249,0	duplicate(#X21Candle_0)	#X21Candle_2	NPC_NO_SPRITE
081-2,133,253,0	duplicate(#X21Candle_0)	#X21Candle_3	NPC_NO_SPRITE
081-2,134,258,0	duplicate(#X21Candle_0)	#X21Candle_4	NPC_NO_SPRITE
081-2,135,251,0	duplicate(#X21Candle_0)	#X21Candle_5	NPC_NO_SPRITE

081-2,79,279,0	script	Hint#X21C0	NPC_NO_SPRITE,{
    .@c = 0;
    .@c += ('COLORCODE[0] ? 0 : 1);
    .@c += ('COLORCODE[1] ? 0 : 1);
    .@c += ('COLORCODE[2] ? 0 : 1);
    .@c += ('COLORCODE[3] ? 0 : 1);
    .@c += ('COLORCODE[4] ? 0 : 1);
    .@c += ('COLORCODE[5] ? 0 : 1);
    dispbottom l("%d candles should always be off.", .@c);
    end;
OnInit:
    .distance=1;
    end;
}

081-2,65,274,0	script	Hint#X21C1	NPC_NO_SPRITE,{
    .@c = 0;
    .@c += ('COLORCODE[0] == 1 ? 1 : 0);
    .@c += ('COLORCODE[1] == 1 ? 1 : 0);
    .@c += ('COLORCODE[2] == 1 ? 1 : 0);
    .@c += ('COLORCODE[3] == 1 ? 1 : 0);
    .@c += ('COLORCODE[4] == 1 ? 1 : 0);
    .@c += ('COLORCODE[5] == 1 ? 1 : 0);
    dispbottom l("%d candles should use regular fire.", .@c);
    end;
OnInit:
    .distance=1;
    end;
}

081-2,51,271,0	script	Hint#X21C2	NPC_NO_SPRITE,{
    if ('COLORCODE[0] == 2)
        dispbottom l("The leftmost candle is magical.");
    else if ('COLORCODE[5] == 2)
        dispbottom l("The rightmost candle is magical.");
    else
        dispbottom l("Neither extremes are magical.");
OnInit:
    .distance=1;
    end;
}

081-2,41,267,0	script	Hint#X21C3	NPC_NO_SPRITE,{
    if ('COLORCODE[0] == 'COLORCODE[5])
        dispbottom l("The leftmost and the rightmost candle are identical.");
    else
        dispbottom l("The left-right extremes are different.");
OnInit:
    .distance=1;
    end;
}

081-2,51,247,0	script	Hint#X21C4	NPC_NO_SPRITE,{
    .@n$ = ('COLORCODE[2] ? ('COLORCODE[2] == 1 ? "Regular" : "Magical") : "No");
    dispbottom l("The northmost candle should use %s Fire.", .@n$);
OnInit:
    .distance=1;
    end;
}

081-2,63,236,0	script	Hint#X21C5	NPC_NO_SPRITE,{
    .@n$="";
    if (!'COLORCODE[3])
        .@n$=('OBSCURECOLOR ? "Regular" : "Magical");
    else if ('COLORCODE[3] == 1)
        .@n$=('OBSCURECOLOR ? "No" : "Magical");
    else
        .@n$=('OBSCURECOLOR ? "Regular" : "No");

    dispbottom l("The central candle should NOT use %s Fire.", .@n$);
OnInit:
    .distance=1;
    end;
}

081-2,88,257,0	script	Hint#X21C6	NPC_NO_SPRITE,{
    .@c=('COLORCODE[1]+'COLORCODE[4]);
    if (.@c <= 1)
        .@n$="Bleakness, at best Regular Fire";
    else if (.@c >= 3)
        .@n$="Brightness, probably Magical Fire";
    else
        .@n$="either Regular Fire, or they may diverge";

    dispbottom l("The two southern candles lean towards %s.", .@n$);
OnInit:
    .distance=1;
    end;
}

081-2,103,213,0	script	#X21Barrier1	NPC_HIDDEN,4,1,{
    @inst = instance_id() + 1;
    if (!'XMAS21CANDLE) {
        dispbottom l("Northern Lights")+" : "+l("The strong shall yield the %s to enlighten the way, according to the established sequence.", b(l("powder")));
        slide 105, 214;
        if (checkcell(getmap(), 105, 212, cell_chkpass))
            setcells getmap(), 103, 211, 107, 212, 1, "X21L1@"+X21ID();
    } else {
        delcells "X21L1@"+X21ID();
    }
    end;
OnInit:
    .distance=1;
    end;
}

/* *************************************************************************** */
/* Seeds Puzzle - See 2021.txt */

081-2,127,129,0	script	#X21Barrier2	NPC_HIDDEN,4,0,{
    if (!'XMAS21TREE) {
        npctalkonce l("In this year Christmas, kids shall play ball. Once the Christmas Tree is set, the festivities may proceed.");
        slide 127, 130;
        if (checkcell(getmap(), 127, 128, cell_chkpass))
            setcells getmap(), 124, 127, 131, 128, 1, "X21L2@"+X21ID();
    } else {
        delcells "X21L2@"+X21ID();
    }
    end;
OnInit:
    .distance=1;
    end;
}

081-2,118,169,0	script	#X21SeedFlag	NPC_NO_SPRITE,{
    @inst = instance_id() + 1;
    if (!'XMAS21TREE)
        npctalkonce l("Tiny leaves in a room, the objects from the other; When they merge together, the festivities shall proceed.");
    end;
OnPlant:
    getmapxy(.@m$, .@x, .@y, 0);
    // Should never happen, so nuke everything
    if (instance_id() < 0) end;
    // Already planted this spot
    if ('XMAS21TREE_X[.@x] && 'XMAS21TREE_Y[.@y]) end;
    // Record the success planting it
    'XMAS21TREE_X[.@x] = true;
    'XMAS21TREE_Y[.@y] = true;
    // Sprout a Christmas Tree IF position was not already filled
    monster(.@m$, .@x, .@y, strmobinfo(1, ChristmasTree), ChristmasTree, 1, "#XMAS21Core::OnX1164");
    // Unlock the gate once the puzzle is complete
    if (X21SEED_CHECK()) {
        delcells("X21L2@"+X21ID());
        specialeffect(FX_MAGIC_WICKED_SPAWN, AREA, getcharid(3));
        mapannounce getmap(), "Puzzle solved by "+strcharinfo(0), 0;
        getexp X21_EXP_PUZZLE, 0;
        getitem XmasTicket, X21_TICKET_PUZZLE;
        X21INIT();
    }
    end;
OnInit:
    .distance=2;
    end;
}

/* *************************************************************************** */
/* Ambush Puzzle */

081-2,49,73,0	script	#X21Barrier3	NPC_HIDDEN,2,0,{
    if (!'XMAS21AMBUSH) {
        npctalkonce l("One room, Seventeen buttons, Three truths, and a lever to bring joy to the children.");
        slide 49, 74;
        if (checkcell(getmap(), 49, 72, cell_chkpass))
            setcells getmap(),  47,  71,  51,  72, 1, "X21L3@"+X21ID();
    } else {
        delcells "X21L3@"+X21ID();
    }
    end;
OnInit:
    .distance=1;
    end;
}

081-2,112,90,0	script	Nutcracker O'Panel#X21	NPC_NO_SPRITE,{
    if ('XMAS21AMBUSH)
        end;
    mes l("This Nutcracker has a lever on it.");
    mesc l("Do you flip it?"), 1;
    next;
    if (askyesno() == ASK_NO) {
        closeclientdialog;
        close;
    }

    .@goal = (2**'AMBUSHTRI[0]) + (2**'AMBUSHTRI[1]) + (2**'AMBUSHTRI[2]);
    if ('AMBUSH_BMASK == .@goal) {
        npctalk l("*beep*");
        delcells("X21L3@"+X21ID());
        'XMAS21AMBUSH = true;
        specialeffect(FX_MAGIC_WICKED_SPAWN, AREA, getcharid(3));
        mapannounce getmap(), "Puzzle solved by "+strcharinfo(0), 0;
        getexp X21_EXP_PUZZLE, 0;
        getitem XmasTicket, X21_TICKET_PUZZLE;
        X21INIT();
    } else {
        npctalk l("*click*");
    }
    'AMBUSH_BMASK = 0;
    .@amb = any(ManaGuardian, ManaGuardian, ManaSlayer, (X21TYPE() == IOT_PARTY ? ManaTyrant : ManaGuardian), Tengu, Sasquatch);
    areamonster getmap(), 108, 82, 128, 102, strmobinfo(1, .@amb), .@amb, 1;
    closeclientdialog;
    close;
OnInit:
    .distance=1;
    end;
}

081-2,117,87,0	script	Star of Bethlem#X21_0	NPC_NO_SPRITE,{
    if ('XMAS21AMBUSH)
        end;
    // Extract ID
    .@n$=strnpcinfo(2, "_-1");
    explode(.@ni$, .@n$, "_");
    .@id=atoi(.@ni$[1]);
    if (.@id < 0) { consolemes(CONSOLEMES_ERROR, "ERROR, X21 Invalid Ambush Hint"); end; }

    .@n='AMBUSHTRI[.@id]+2; // Account for the invisible frame
    .@c=(.@n % 5 == 0) ? 5 : (.@n % 5);
    .@r=(.@n / 5)+((.@n % 5 == 0) ? 0 : 1);
    npctalkonce l("%s column, %s row", X21SRLZ(.@c), X21SRLZ(.@r));
    end;
OnInit:
    .distance=1;
    end;
}
081-2,124,94,0	duplicate(Star of Bethlem#X21_0)	Canes#X21_1	NPC_NO_SPRITE
081-2,120,100,0	duplicate(Star of Bethlem#X21_0)	Crown#X21_2	NPC_NO_SPRITE

081-2,60,118,0	script	Switch#X21AB_1	NPC_NO_SPRITE,{
    if ('XMAS21AMBUSH)
        end;
    // Extract ID
    .@n$=strnpcinfo(2, "_0");
    explode(.@ni$, .@n$, "_");
    .@id=atoi(.@ni$[1]);
    if (.@id < 1) { consolemes(CONSOLEMES_ERROR, "ERROR, X21 Invalid Ambush Switch"); end; }

    // Already flipped
    .@bit=(2**.@id);
    if ('AMBUSH_BMASK & .@bit)
        end;

    mesc l("There is a switch here.");
    mesc l("Do you flip it?"), 1;
    next;
    if (askyesno() == ASK_YES) {
        'AMBUSH_BMASK = 'AMBUSH_BMASK | .@bit;
        npctalk l("*click*");
    }

    closeclientdialog;
    close;
OnInit:
    .distance=1;
    end;
}
081-2,65,118,0	duplicate(Switch#X21AB_1)	Switch#X21AB_2	NPC_NO_SPRITE
081-2,70,118,0	duplicate(Switch#X21AB_1)	Switch#X21AB_3	NPC_NO_SPRITE
081-2,50,123,0	duplicate(Switch#X21AB_1)	Switch#X21AB_4	NPC_NO_SPRITE
081-2,55,123,0	duplicate(Switch#X21AB_1)	Switch#X21AB_5	NPC_NO_SPRITE
081-2,60,123,0	duplicate(Switch#X21AB_1)	Switch#X21AB_6	NPC_NO_SPRITE
081-2,65,123,0	duplicate(Switch#X21AB_1)	Switch#X21AB_7	NPC_NO_SPRITE
081-2,70,123,0	duplicate(Switch#X21AB_1)	Switch#X21AB_8	NPC_NO_SPRITE
081-2,50,128,0	duplicate(Switch#X21AB_1)	Switch#X21AB_9	NPC_NO_SPRITE
081-2,55,128,0	duplicate(Switch#X21AB_1)	Switch#X21AB_10	NPC_NO_SPRITE
081-2,60,128,0	duplicate(Switch#X21AB_1)	Switch#X21AB_11	NPC_NO_SPRITE
081-2,65,128,0	duplicate(Switch#X21AB_1)	Switch#X21AB_12	NPC_NO_SPRITE
081-2,70,128,0	duplicate(Switch#X21AB_1)	Switch#X21AB_13	NPC_NO_SPRITE
081-2,50,133,0	duplicate(Switch#X21AB_1)	Switch#X21AB_14	NPC_NO_SPRITE
081-2,55,133,0	duplicate(Switch#X21AB_1)	Switch#X21AB_15	NPC_NO_SPRITE
081-2,60,133,0	duplicate(Switch#X21AB_1)	Switch#X21AB_16	NPC_NO_SPRITE
081-2,65,133,0	duplicate(Switch#X21AB_1)	Switch#X21AB_17	NPC_NO_SPRITE

/* *************************************************************************** */
/* The Enigma */

/*
// FIXME (137,68 and 130,56 and 120,69) (no sprite) (no code)
081-2,137,68,0	script	Enigma#X21A1	NPC_NO_SPRITE,{
    mes l("Three Enigmas, one always say the truth, one always says a lie, and the third may either say the truth or a lie.");
    mes "";
    if ('TRUTHSTAT[0])
        mesc l("The truth"), 1;
    else
        mesc l("A lie"), 1;
    close;
OnInit:
    .distance=2;
    end;
}
*/