summaryrefslogblamecommitdiff
path: root/world/map/npc/055-1/pumpkins.txt
blob: 96005de31d9e8b145b3c38ab3309414ed05ed8c0 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                   
 

                                  
 



                                                      
 
                                                                                             

                                         
                                                                                              


                                                    
                             







                                                           
                   

              
                                                                                                                                                                    


                                                           
                   





                                         
                        


                                                                     
                                                                                                           

                                                    
                              
                   


                                                                     
                                                                                       

                                                    
                               
                   



                                                                     
                


                   
                                                                                         

        
          




                                                                                    









                                                                                                         

                                                     









                                            
                                                                                                         
                                                   
                                                                                 
                                                               

                                                                                                                                                 
                                                                                                                 
                                   










                                                                                                    















                                                                                     
                                 













                                                                                                          

                                                                                           




                                                                        
 
055-1,0,0,0|script|_N-Pumpkin|32767
{

//////////////////////////////////
// puppet logic below

    set @distance_handler, 1; // silent
    set @npc_distance, (1-2); // -1 means attack range
    callfunc "PCtoNPCRange";
    if (@npc_check) end;

    if (Quest_Halloween != 1 || !(gettime(6) == 11 && (gettime(5) >= 4 && gettime(5) <= 30)))
        goto L_HeavyPoison;
    if (@discover_poisonous_pumpkin == 0)
        message strcharinfo(0), "Pumpkin : Yuke, this pumpkin released some ugly poison gas!";
    set @discover_poisonous_pumpkin, 1;
    misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
    heal -15, 0;
    sc_start SC_POISON, 1, 4;
    if (rand(0,100) < 10)
        getitem "PumpkinSeeds", 1;

    if (countitem("PumpkinSeeds") >= $@halloween_num_seeds)
        goto L_EnoughSeeds;

    set @mobID, 1063;
    callfunc "MobPoints";
    goto L_Destroy;

L_EnoughSeeds:
    message strcharinfo(0), "Pumpkin : " + $@halloween_num_seeds + " should be enough seeds for Oscar. And this pumpkin gas gets too bad to stand it any longer...";
    set Quest_Halloween, 2;
    // Reset this to get the message for the "heavy" poison
    set @discover_poisonous_pumpkin, 0;
    goto L_Destroy;

L_HeavyPoison:
    if (@discover_poisonous_pumpkin == 0)
        goto L_HeavyPoison0;
    if (@discover_poisonous_pumpkin == 1)
        goto L_HeavyPoison1;
    goto L_HeavyPoison2;

L_HeavyPoison0:
    set @discover_poisonous_pumpkin, @discover_poisonous_pumpkin + 1;
    message strcharinfo(0), "Pumpkin : Ouch, this pumpkin is totally poisonous! Let's get away from them!";
    misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
    heal -150,0;
    sc_start SC_POISON, 1, 60;
    goto L_Destroy;

L_HeavyPoison1:
    set @discover_poisonous_pumpkin, @discover_poisonous_pumpkin + 1;
    message strcharinfo(0), "Pumpkin : This is really awful! I should not touch them!";
    misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
    heal -350,0;
    sc_start SC_POISON, 1, 120;
    goto L_Destroy;

L_HeavyPoison2:
    set @discover_poisonous_pumpkin, @discover_poisonous_pumpkin + 1;
    misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
    heal -Hp, 0;
    goto L_Destroy;

OnAppear:
    fakenpcname strnpcinfo(0), strnpcinfo(0), 1063; // set the sprite (implies enablenpc)
    end;

L_Destroy:
    disablenpc strnpcinfo(0); // makes the npc invisible, unclickable
    addnpctimer .death_t, strnpcinfo(0) + "::OnReallyDestroy"; // schedule a respawn
    end;

OnReallyDestroy:
    set .nodes[.i], get(.nodes[.i], "_N-Pumpkin") - 1, "_N-Pumpkin"; // tell the puppeteer we lost an egg
    destroy;


//////////////////////////////////
// puppeteer logic below

S_MakeNode:
    set .nID, .nID + 1; // give the node an id
    set .@name$, "#_Pkin" + chr(3) + .nID;
    if (.nID == 2147483647)
        set .nID, 0; // start over if id = 0x7FFFFFFF
    goto S_FindXY;

S_FindXY:
    set .@x, rand(.x1[.i], .x2[.i]);
    set .@y, rand(.y1[.i], .y2[.i]);
    if (iscollision(.m$[.i], .@x, .@y) == 1)
        goto S_FindXY;
    goto S_ReallySpawn;

S_ReallySpawn:
    set .@p, puppet(.m$[.i], .@x, .@y, .@name$, 32767); // spawn the node (but not on map, because 32767)
    if (.@p < 1) goto S_MakeNode; // silently retry
    disablenpc .@name$; // make sure it can't be clicked by guessing the being id
    set .i, .i, .@p; // tell the puppet what object contains it
    set .death_t, rand(.death_t/2, .death_t), .@p; // tell the puppet when to die
    set .@timer, if_then_else(.done_initial[.i], rand(.appear_t/2, .appear_t), 0); // timer depends on if first spawn or if respawned after death
    addnpctimer .@timer, .@name$+"::OnAppear"; // we spawn the node instantly but it only appears after the timer
    set .nodes[.i], .nodes[.i] + 1;
    return;

S_IterateObjects:
    if (.min_nodes[.i] == 0)
        set .min_nodes[.i], (.min * min(1, ((.x2[.i] - .x1[.i]) * (.y2[.i] - .y1[.i])) / .divisor));
    if (.max_nodes[.i] == 0)
        set .max_nodes[.i], (.max * max(1, ((.x2[.i] - .x1[.i]) * (.y2[.i] - .y1[.i])) / .divisor));

    if (.nodes[.i] >= .max_nodes[.i])
        goto S_NextObject;

    callsub S_MakeNode;
    if (.nodes[.i] < if_then_else(.done_initial[.i], .min_nodes[.i], .max_nodes[.i]))
        goto S_IterateObjects;
    goto S_NextObject;

S_NextObject:
    set .done_initial[.i], 1;
    if (.i >= (.count - 1))
        goto S_Return;
    set .i, .i + 1; // object iterator++
    goto S_IterateObjects;

S_Return:
    return;

OnHeartbeat:
    set .i, 0; // object iterator
    freeloop 1;
    callsub S_IterateObjects;
    freeloop 0;
    addnpctimer .spawn_t, strnpcinfo(0) + "::OnHeartbeat"; // heartbeat
    end;

OnMaybeStart:
    if (.x1[1] == 0)
        end;
    set .min, 0; // relative min number of nodes per object => (min * (((x2 - x1) * (y2 - y1)) / divisor))
    set .max, 5; // relative max number of nodes per object => (max * (((x2 - x1) * (y2 - y1)) / divisor))
    set .divisor, 32; // see .min & .max ^
    set .count, getarraysize(.x1); // number of nodes objects in TSX
    set .spawn_t, 18000; // heartbeat rate
    set .death_t, 1000; // rand(timer/2, timer) before a node triggers respawn after death
    set .appear_t, 40000; // rand(timer/2, timer) before a node becomes visible after spawn
    if (.started)
        end;
    set .started, 1;
    addnpctimer 10000, strnpcinfo(0)+"::OnHeartbeat"; // first heartbeat
    end;
}