diff options
author | Jesusaves <cpntb1@ymail.com> | 2021-04-09 13:33:57 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2021-04-09 13:33:57 -0300 |
commit | cf18ce071c79ae37e14ea38943e0b1d88da70a7b (patch) | |
tree | f9159c9b60b3018300dd22ffba0d797bc5e828e5 /npc/009-7/core.txt | |
parent | 8a4bf716002a017de77fe7df301ef8e4aaf00a2e (diff) | |
download | serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.gz serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.bz2 serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.xz serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.zip |
Override
Diffstat (limited to 'npc/009-7/core.txt')
-rwxr-xr-x | npc/009-7/core.txt | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/npc/009-7/core.txt b/npc/009-7/core.txt new file mode 100755 index 00000000..921cd26e --- /dev/null +++ b/npc/009-7/core.txt @@ -0,0 +1,457 @@ + +function script fightclub_sendrequest { + goto L_try; + +L_try: + @loop = 0; + goto L_Loop; + +L_Loop: + if(@Duel_Queue$[@loop] == @caster_name$) goto L_Exists; + if((@Duel_Queue$[@loop] == "") && (@Duel_Queue$[(@loop + 1)] == "")) goto L_Proceed; + if((@Duel_Queue$[@loop] == "") && (@Duel_Queue$[(@loop + 1)] != "")) goto L_ShiftQueue; + @loop = (@loop + 1); + if(@loop >= getarraysize(@Duel_Queue)) goto L_Full; // this shouldn't happen since we check in magic but we still handle it + goto L_Loop; + +L_ShiftQueue: + @Duel_Queue$[@loop] = @Duel_Queue$[(@loop + 1)]; + @Duel_Queue[@loop] = @Duel_Queue[(@loop + 1)]; + @Duel_Queue$[(@loop + 1)] = ""; + @Duel_Queue[(@loop + 1)] = 0; + @loop = (@loop + 1); + if(@loop >= getarraysize(@Duel_Queue)) goto L_try; + goto L_ShiftQueue; + +L_Full: + message @caster_name$, "There is already "+ $@Duel_PlayerQueueLimit +" duel request(s) in the queue of this player, which is the maximum."; + return; + +L_Exists: + message @caster_name$, "You already requested a duel with this player."; + return; + +L_Proceed: + misceffect FX_MAGIC_DARKRED, @caster_name$; + message @caster_name$, "Your request has been sent."; + @Duel_Queue$[@loop] = @caster_name$; + @Duel_Queue[@loop] = gettimetick(2); + if(@Duel_Fighter == 0) message strcharinfo(0), "You have received a new duel request. Talk to Rouge to accept or decline."; + if(@Duel_Fighter == 0) misceffect FX_MAGIC_DARKRED, strcharinfo(0); + if(@Duel_Fighter == 1) set @Duel_HasPendingRequest, 1; + return; +} + +function script fightclub_getrules { + $@fightclub_myself = getcharid(3); + if(@target < 1) goto L_Proceed; // get our own rules + if(attachrid(@target) == 1) goto L_Proceed; + goto L_Missing; + +L_Proceed: + $@Temp_NoMagic = (DUELS & $@NoMagicBit); + if($@fightclub_myself == getcharid(3)) goto L_Proceed2; // the target is ourselves + if(attachrid($@fightclub_myself) == 1) goto L_Proceed2; + goto L_Missing; + +L_Missing: + return; + +L_Proceed2: + $@fightclub_myself = 0; + @target = 0; + if($@Temp_NoMagic == 0) + mes "(no rules)"; + if($@Temp_NoMagic != 0) mes "- No Magic"; + set $@Temp_NoMagic, 0; // now we clean these vars ASAP because they're globals + return; +} + +function script fightclub_AddToQueue { + @ATQ_Loop = 0; + goto L_Loop; + +L_Loop: + if(($@Duel_Queue_Blue$[@ATQ_Loop] == @caster_name$) && ($@Duel_Queue_Red$[@ATQ_Loop] == @target_name$)) goto L_Exists; + if(($@Duel_Queue_Red$[@ATQ_Loop] == @caster_name$) && ($@Duel_Queue_Blue$[@ATQ_Loop] == @target_name$)) goto L_Exists; + @ATQ_Loop = (@ATQ_Loop + 1); + if(@ATQ_Loop >= getarraysize($@Duel_Queue_ID)) goto L_Proceed2; + goto L_Loop; + +L_Exists: + mes "This battle is already in the queue."; + return; + +L_Full: + mes "There is already " + $@Duel_QueueLimit + " battles in the queue, which is the maximum. Please try again later."; + return; + +L_Proceed2: + if(getarraysize($@Duel_Queue_ID) >= ($@Duel_QueueLimit + 1)) goto L_Full; + @index = getarraysize($@Duel_Queue_ID); + if(@index >= 1) goto L_Proceed22; + @index = 1; + goto L_Proceed22; + +L_Proceed22: + if($@Duel_Queue_Red$[@index] != "") goto L_NotClean; + $@Duel_Queue_Red$[@index] = @caster_name$; + if($@Duel_Queue_Blue$[@index] != "") goto L_NotClean; + $@Duel_Queue_Blue$[@index] = @target_name$; + if($@Duel_Queue_ID[@index] != 0) goto L_NotClean; + $@Duel_Queue_ID[@index] = ($@Duel_Queue_ID[(@index - 1)] + 1); + if($@Duel_Queue_ID[@index] <= $Duel_LastDuel) goto L_FixId; + return; + +L_NotClean: + message @caster_name$, "An error occured: array element not empty. Try again in 5 seconds."; + return; + +L_FixId: + $@Duel_Queue_ID[@index] = ($Duel_LastDuel + 1); + return; +} + +function script fightclub_NextBattle { + set $@Duel_Queue_Blue$[0], ""; // clean the 0 index + $@Duel_Queue_Red$[0] = ""; + $@Duel_Queue_ID[0] = 0; + set $@Duel_Loop, 1; // start the loop at 1 + goto L_Loop; + +L_Loop: // here we shift the array to the left + if($@Duel_Queue_ID[$@Duel_Loop] < 1) goto L_Empty; + $@Duel_Queue_Red$[($@Duel_Loop - 1)] = $@Duel_Queue_Red$[$@Duel_Loop]; + set $@Duel_Queue_Red$[$@Duel_Loop], ""; // it is always important to clean + $@Duel_Queue_Blue$[($@Duel_Loop - 1)] = $@Duel_Queue_Blue$[$@Duel_Loop]; + $@Duel_Queue_Blue$[$@Duel_Loop] = ""; + $@Duel_Queue_ID[($@Duel_Loop - 1)] = $@Duel_Queue_ID[$@Duel_Loop]; + $@Duel_Queue_ID[$@Duel_Loop] = 0; + $@Duel_Loop = ($@Duel_Loop + 1); + if($@Duel_Loop >= getarraysize($@Duel_Queue_ID)) goto L_Proceed; + goto L_Loop; + +L_Empty: + // the queue is now empty + return; + +L_Proceed: + callfunc "fightclub_CleanStage"; + set $@Duel_CurrentDuel, $@Duel_Queue_ID[0]; // since the array is shifted, the index is always 0 + set $Duel_LastDuel, $@Duel_Queue_ID[0]; // this is used to keep the same index across reboots + $@Duel_BluePlayer = getcharid(3,$@Duel_Queue_Blue$[0]); + $@Duel_RedPlayer = getcharid(3,$@Duel_Queue_Red$[0]); + if(attachrid($@Duel_BluePlayer) != 1) goto L_Missing; + if(attachrid($@Duel_RedPlayer) == 1) goto L_Proceed2; + goto L_Missing; + +L_Missing: + callfunc "fightclub_CleanStage"; + callfunc "fightclub_NextBattle"; + return; + +L_Proceed2: + addtimer ($@Duel_TimeBeforeNext * 1000), "#FightClubUtils::OnDelayedNextBattle"; + return; +} + +function script fightclub_NextBattleProceed { + $@Duel_NoMagic = 0; + if((DUELS & $@NoMagicBit) != 0) set $@Duel_NoMagic, 1; // get the rules of the caster + donpcevent "Rouge#Duels::OnAnnounceNext"; + $@Duel_Started = 0; + addtimer ($@Duel_TimeBeforeWarp * 1000), "#FightClubUtils::OnDelayedStart"; + return; +} + +function script fightclub_StartBattle { + $@Duel_Started = 1; + npcwarp 40, 45, "Rouge#Duels"; + donpcevent "#FightClubTimeLimit::OnStartTimer"; + if(attachrid($@Duel_RedPlayer) != 1) goto L_Missing; + callfunc "fightclub_enter"; + if(attachrid($@Duel_BluePlayer) != 1) goto L_Missing; + callfunc "fightclub_enter"; + return; + +L_Missing: + callfunc "fightclub_CleanStage"; + callfunc "fightclub_NextBattle"; + return; +} + +function script fightclub_TimeOut { + donpcevent "Rouge#Duels::OnAnnounceTimeOut"; + if(attachrid($@Duel_RedPlayer) != 1) goto L_Missing; + callfunc "fightclub_exit"; + if(attachrid($@Duel_BluePlayer) != 1) goto L_Missing; + callfunc "fightclub_exit"; + callfunc "fightclub_CleanStage"; + callfunc "fightclub_NextBattle"; + return; + +L_Missing: + callfunc "fightclub_CleanStage"; + callfunc "fightclub_NextBattle"; + return; +} + +function script fightclub_Intrusion { + // nothing to do here (yet) + return; +} + +function script fightclub_EmergencyWipe { + callfunc "fightclub_CleanStage"; + callfunc "fightclub_StartUp"; + // TODO: check if everything is clean (function) and mapexit otherwise + return; +} + +function script fightclub_Victory { + // TODO: give some sort of reward + // TODO: increase score + // TODO: update leaderboard + return; +} + +function script fightclub_DestroyMe { + @Duel_Fighter = 0; + setpvpchannel @previous_channel; + sc_end 132; sc_end 14; sc_end 37; sc_end 185; sc_end 194; sc_end 195; sc_end 196; sc_end 197; sc_end 198; sc_end 199; // remove effects + heal MaxHp, MaxSp; // refill hp/mana + if(getmapname() == "009-7") warp "009-7", rand($@fightclub_x1, $@fightclub_x2), rand(($@fightclub_y1 - 2), ($@fightclub_y1 - 3)); + return; +} + +function script fightclub_Missing { + // $@Duel_Missing 1 = red, 2 = blue + if (attachrid($@Duel_BluePlayer) == 1) goto L_Proceed; // we need to attach to at least one player + if (attachrid($@Duel_RedPlayer) == 1) goto L_Proceed; + goto L_Resume; // can't attach either of them (this is not a problem since it means they are offline so their vars are clean anyway) + +L_Proceed: + if($@Duel_Missing == 1) goto L_BlueWins; + goto L_RedWins; + +L_BlueWins: + donpcevent "Rouge#Duels::OnAnnounceBlueForfeit"; + $@duel_winner = $@Duel_BluePlayer; + callfunc "fightclub_Victory"; + goto L_Clean; + +L_RedWins: + donpcevent "Rouge#Duels::OnAnnounceRedForfeit"; + $@duel_winner = $@Duel_RedPlayer; + callfunc "fightclub_Victory"; + goto L_Clean; + +L_KillBlue: + callfunc "fightclub_exit"; + if(attachrid($@Duel_RedPlayer) == 1) goto L_KillRed; + goto L_Resume; + +L_KillRed: + callfunc "fightclub_exit"; + goto L_Resume; + +L_Clean: + if(attachrid($@Duel_BluePlayer) == 1) goto L_KillBlue; + if(attachrid($@Duel_RedPlayer) == 1) goto L_KillRed; + goto L_Resume; // couldn't kill them + +L_Resume: + callfunc "fightclub_CleanStage"; + callfunc "fightclub_NextBattle"; + return; +} + +function script fightclub_StartUp { + if($@Duel_TimeBeforeNext < 1) set $@Duel_TimeBeforeNext, 5; // init the (temporary) TimeBeforeNext global + if($@Duel_TimeBeforeWarp < 1) set $@Duel_TimeBeforeWarp, 5; // init the (temporary) TimeBeforeWarp global + if($@Duel_TimeBeforeStart < 1) set $@Duel_TimeBeforeStart, 3; // init the (temporary) TimeBeforeStart global + if($@Duel_TimeLimit < 1) set $@Duel_TimeLimit, 120; // init the (temporary) TimeLimit global + if($@Duel_QueueLimit < 1) set $@Duel_QueueLimit, 5; // init the (temporary) QueueLimit global + if($@Duel_PlayerQueueLimit < 1) set $@Duel_PlayerQueueLimit, 2; // init the (temporary) PlayerQueueLimit global + if($@Duel_PlayerQueueTimeOut < 1) set $@Duel_PlayerQueueTimeOut, 300; // init the (temporary) PlayerQueueTimeOut global + setarray $@Duel_Queue_ID, 0; + cleararray $@Duel_Queue_ID, 0, ($@Duel_QueueLimit + 1); + setarray $@Duel_Queue_Blue$, ""; + cleararray $@Duel_Queue_Blue$, "", ($@Duel_QueueLimit + 1); + setarray $@Duel_Queue_Red$, ""; + cleararray $@Duel_Queue_Red$, "", ($@Duel_QueueLimit + 1); + $@Duel_TotalTime = 0; + $@Duel_Channel = 20; + if($fightclub_enabled) set $fightclub_enabled, 0; // this var moved to $SANGUINE + // DUELS flags below + $@DuelPvpBit = (1 << 1); + $@NoMagicBit = (1 << 2); + // $SANGUINE flags below + $@SV_FCDBit = (1 << 1); + $@SV_BMDBit = (1 << 2); + return; +} + +function script fightclub_CleanStage { + if($@Duel_NoWarp != 1) areawarp "009-7", $@fightclub_x1, $@fightclub_y1, $@fightclub_x2, $@fightclub_y2, "009-7", 31, 40; // kick all players from stage + $@Duel_NoWarp = 0; + set $@Duel_NoMagic, 0; // clean the Duel parameters + set $@Duel_CurrentDuel, 0; // no duel atm + set $@Duel_Started, 0; // no duel atm + $@Duel_RedPlayer = 0; + $@Duel_BluePlayer = 0; + $@Duel_Missing = 0; + $@Duel_TotalTime = 0; + npcwarp 32, 45, "Rouge#Duels"; + donpcevent "#FightClubTimeLimit::OnStopTimer"; + killmonster "009-7", "All"; + return; +} + +function script fightclub_setrules { + goto L_Main; + +L_Main: + mes "Your rules are the following: "; mes ""; + callfunc "fightclub_getrules"; + mes ""; mes "What do you want to do?"; + menu + "Change my rules.", L_Start, + "Nevermind.", L_Return; + +L_Start: + DUELS = DUELS | $@NoMagicBit; + goto L_NoMagic; + +L_NoMagic: + mes "Do you want to allow magic?"; + mes "If disabled, the fighters will not be able to use any kind of spell."; + menu + "Yes.", L_NoMagicYes, + "No.", L_Done; +L_NoMagicYes: + DUELS = DUELS &~ $@NoMagicBit; + goto L_Done; + +L_Done: + next; + mes "You have succesfully changed your options."; + goto L_Main; + +L_Return: + return; +} + +function script fightclub_death { + if(@Duel_Fighter != 1) goto L_NoDuel; + if(($@Duel_CurrentDuel < 1) || ($@Duel_Started != 1)) goto L_Reset; + if(@killerrid != 0) goto L_Murdered; + goto L_Killed; + +L_Killed: + if(getcharid(3) == $@Duel_RedPlayer) goto L_BlueWins; + goto L_RedWins; + +L_RedWins: + donpcevent "Rouge#Duels::OnAnnounceRedWins"; + $@duel_winner = $@Duel_RedPlayer; + callfunc "fightclub_Victory"; + callfunc "fightclub_exit"; + if(attachrid($@Duel_RedPlayer) == 1) goto L_RedWins2; + goto L_Missing; + +L_RedWins2: + callfunc "fightclub_exit"; + goto L_Proceed; + +L_BlueWins: + donpcevent "Rouge#Duels::OnAnnounceBlueWins"; + $@duel_winner = $@Duel_BluePlayer; + callfunc "fightclub_Victory"; + callfunc "fightclub_exit"; + if(attachrid($@Duel_BluePlayer) == 1) goto L_BlueWins2; + goto L_Missing; + +L_Missing: + goto L_Proceed; + +L_BlueWins2: + callfunc "fightclub_exit"; + goto L_Proceed; + +L_Proceed: + callfunc "fightclub_CleanStage"; + return; + +L_Murdered: + if(($@Duel_RedPlayer != @killerrid) && ($@Duel_BluePlayer != @killerrid)) goto L_Stranger; + goto L_Killed; // now we proceed the same way as L_Killed + +L_Stranger: + // the victim was not murdered by its adversary (wtf) + if(debug) donpcevent "Debug#Duels::OnKillerNotInDuel"; + callfunc "fightclub_EmergencyWipe"; + return; + +L_NoDuel: + if(debug) donpcevent "Debug#Duels::OnVictimNotInDuel"; + return; + +L_Reset: // the player has duel_fighter but no duel is ongoing (happens if the player quit before fightclub_exit can be called) + if(debug) donpcevent "Debug#Duels::OnVictimInDuelNoDuel"; + callfunc "fightclub_DestroyMe"; // here we attempt to resume the interrupted procedure + return; +} + +function script fightclub_enter { + @Duel_Fighter = 1; + warp "009-7", rand($@fightclub_x1,$@fightclub_x2), rand($@fightclub_y1,$@fightclub_y2); + heal MaxHp, MaxSp; // ensure that you can't duel wih a corpse + sc_end 132; sc_end 14; sc_end 37; sc_end 185; sc_end 194; sc_end 195; sc_end 196; sc_end 197; sc_end 198; sc_end 199; // remove effects + message strcharinfo(0), "Get Ready."; + addtimer ($@Duel_TimeBeforeStart * 1000), "#FightClubUtils::OnBecomeKiller"; // call fightclub_enter_killer in 3 seconds + return; +} + +function script fightclub_enter_killer { + if(getpvpflag(0) != $@Duel_Channel) set @previous_channel, getpvpflag(0); + setpvpchannel $@Duel_Channel; + message strcharinfo(0), "GO !"; + return; +} + +function script fightclub_exit { + callfunc "fightclub_DestroyMe"; // kill and reset state + message strcharinfo(0), "Thank you for participating in the fight club!"; + if(@Duel_HasPendingRequest) message strcharinfo(0), "You have received a new duel request."; + return; +} + + + +function script fightclub_event_killed { + @duel_killer = 0; + if(@Duel_Fighter != 1) goto L_End; + if(getmapname() != "009-7") goto L_End; + set $@duel_loser, getcharid(3); // grab the rid of the victim + set $@duel_winner, @killerrid; // grab the rid of the killer + set @killerrid, 0; // reset killerid + callfunc "fightclub_death"; + goto L_End; +L_End: + if(getpvpflag(0) == $@Duel_Channel) setpvpflag @previous_channel; + return; +} + +function script fightclub_event_die { + @duel_killer = 0; + if(@Duel_Fighter != 1) goto L_End; + if(getmapname() != "009-7") goto L_End; + set @killerrid, 0; // since the player was not murdered, the killerrid is 0 + set $@duel_loser, getcharid(3); // grab the rid of the victim + callfunc "fightclub_death"; + goto L_End; +L_End: + if(getpvpflag(0) == $@Duel_Channel) setpvpflag @previous_channel; + return; +} |