summaryrefslogtreecommitdiff
path: root/npc/026-4/ctrl.c
blob: c22ee7fc21c5254b7f8a5825e1949ca18d1ac48a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// TMW2 scripts.
// Author:
//    Jesusalva
// Description:
//   The Impregnable Fortress Control Files
// Quest: General_Fortress
//  (MaxFloor+2, internal, internal)

// This script must set 026-4 up on init, and refresh it when needed
-	script	Impregnable#B4F	NPC_HIDDEN,{
    function _moveNpc;
    end;

// Initialize the dungeon
OnInit:
    .InstId = false;
    .npc_x = 0;
    .npc_y = 0;
    // The 19 mobs which compose the Bloody List
    setarray $@MKB4F_MOBS, NightmareDragon, Snail, WhirlyBird, PinkieSuseran, Jhon, Mandragora, PinkieMaximus, Junglefowl, Tengu, Moubi, SuperiorShroom, Nutcracker, Golem, GreenhornAbomination, ShadowTortuga, FireElement, WaterElement, EarthElement, WindElement;
    sleep(6000); // Delay 6s before initialization
    .InstId = CreateMaze(IOT_NONE, MAZE_SIZE_X, "026-4");
    instance_set_timeout(0, 0, .InstId);
    instance_init(.InstId);
    debugmes "Impregnable Fortress B4F (%d): Init OK", .InstId;
    setmapflag("026-4", mf_zone, "SuperMMO");
    goto OnMon2359;

OnMon2359:
    if (!.InstId) end;
    // Reload .InstId (weekly takeover)
    killmonsterall("026-4");
    MazeMobs(145, false, 8, "026-4"); // Initiate Lv 145 mobs
    MazeMobs(115, false, 21, "026-4"); // Initiate Lv 115 mobs
    // TODO: Add the utilities: Switches (and move them every day?) and mobpt logic
    // And the actual portal (NPC?)
    goto OnClock1843;

OnClock1843:
    if (!.InstId) end;
    // Movement will need to happen here (daily modifications)
    // We need however to validate the coordinates they're jumping to...
    _moveNpc("026-4");
    unitwarp(getnpcid("#026-4Switch_1"), "026-4", .npc_x, .npc_y);
    _moveNpc("026-4");
    unitwarp(getnpcid("#026-4Switch_2"), "026-4", .npc_x, .npc_y);
    _moveNpc("026-4");
    unitwarp(getnpcid("#026-4Switch_3"), "026-4", .npc_x, .npc_y);
    _moveNpc("026-4");
    unitwarp(getnpcid("#026-4Switch_4"), "026-4", .npc_x, .npc_y);
    _moveNpc("026-4");
    unitwarp(getnpcid("#026-4Switch_5"), "026-4", .npc_x, .npc_y);
    end;

function _moveNpc {
    // Try to warp randomly, up to 30 attempts
    .@e=0;
    .@mx=getmapinfo(MAPINFO_SIZE_X, getarg(0))-20;
    .@my=getmapinfo(MAPINFO_SIZE_Y, getarg(0))-20;
    do {
        if (.@e >= 30)
            break;
        .npc_x = rand2(20, .@mx);
        .npc_y = rand2(20, .@my);
        .@e+=1;
    } while (!checknpccell(getarg(0), .npc_x, .npc_y, cell_chkpass));
    return;
} // _moveNpc

}

// The switches main code
000-0,0,0,0,	script	#026-4Switch_1	NPC_SWITCH_OFFLINE,{
    // Retrieve my own metadata
    .@n$=strnpcinfo(0, "_0");
    explode(.@ni$, .@n$, "_");
    .@id=atoi(.@ni$[1]);
    .@bit = (2 ** (.@id - 1));
    // Do not react if already done
    if (getq(General_Fortress) != 5)
        end;
    // If already flipped, then don't do pointless things
    if (getq2(General_Fortress) & .@bit) {
        dispbottom l("I already flipped this switch, no point flipping it again.");
        end;
    }
    // After used by someone, can't be used by others for ~30 seconds
	if (getnpcclass() == NPC_SWITCH_ONLINE)
		end;
    // The Bloody Switch: Assign random monster (Miller + char ID + Switch ID)
    // Maze mobs should count (and qualify for mob points)
    // All target mobs should be Lv 100+
    .@minKills = 10;
    .@mobId = $@MKB4F_MOBS[miller_rand(.@id, getcharid(0), 18)];
    mesn l("The Bloody Switch");
    mes l("Our master respects %s, so those whom wish to meet him, the following shall they prove:", b(l("strength")));
    mesc l("Kill %d/%d %s in this session.", @bloodykill[.@mobId], .@minKills, getmonsterlink(.@mobId)), 1;
    if (@bloodykill[.@mobId] < .@minKills)
        close;
    next;
    // Mark this switch as done
    setq2 General_Fortress, getq2(General_Fortress) | .@bit;
    dispbottom l("You hear a *clank*, it must have worked.");
    closeclientdialog;
	setnpcdisplay .name$, NPC_SWITCH_ONLINE;
    sleep(30000); // Detach the player (instead of sleep2)
	setnpcdisplay .name$, NPC_SWITCH_OFFLINE;
	end;
OnInit:
	.distance=3;
    end;
}

000-0,0,0,0	duplicate(#026-4Switch_1)	#026-4Switch_2	NPC_SWITCH_OFFLINE
000-0,0,0,0	duplicate(#026-4Switch_1)	#026-4Switch_3	NPC_SWITCH_OFFLINE
000-0,0,0,0	duplicate(#026-4Switch_1)	#026-4Switch_4	NPC_SWITCH_OFFLINE
000-0,0,0,0	duplicate(#026-4Switch_1)	#026-4Switch_5	NPC_SWITCH_OFFLINE

// TODO: The main NPC which lets you out of here