home *** CD-ROM | disk | FTP | other *** search
- /*
- **
- ** _rank.qc (Rank Code, 1.2)
- **
- ** Copyright (C) 1996 Johannes Plass
- **
- ** This program is free software; you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation; either version 2 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program; if not, write to the Free Software
- ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- **
- ** Author: Johannes Plass (plass@dipmza.physik.uni-mainz.de)
- **
- */
-
-
- void(entity player,entity sort) RankPrintRank;
-
- void(entity player) RankInfo =
- {
- if (!USE_MODULE_RANK) return;
-
- sprint(player,"# Rank: Type 'rank' for extended\n");
- sprint(player," ranking, 'help-rank' for help.\n");
- };
-
- void(entity player) RankInit =
- {
- if (!USE_MODULE_RANK) return;
-
- stuffcmd(player,"alias rank \"impulse 203\";\n");
- stuffcmd(player,"alias help-rank \"impulse 204\";\n");
- };
-
- void(entity player) RankHelp =
- {
- if (!USE_MODULE_RANK) return;
-
- // 123456789#123456789#123456789#12345678
- sprint(player,"# Rank: provides extended rankings.\n");
- sprint(player," Type 'rank' to display a list of\n");
- sprint(player," current ranks in the format\n");
- sprint(player," TOT = KILL DEATH ACCID = PLAYER\n");
- sprint(player," where\n");
- sprint(player," PLAYER : name of player\n");
- sprint(player," TOT : his total score\n");
- sprint(player," KILL : how many he killed\n");
- sprint(player," DEATH : how many killed him\n");
- sprint(player," ACCID : his deathly accidents\n");
- sprint(player," Formula for TOT:\n");
- sprint(player," TOT = 3*KILL - DEATH - 3*ACCID\n");
- };
-
- void(entity player,float event) RankCountEvent =
- {
- if (!USE_MODULE_RANK) return;
-
- if (event == RANK_KILL) player.rank_kills = player.rank_kills + 1;
- else if (event == RANK_DEATH) player.rank_deaths = player.rank_deaths + 1;
- else if (event == RANK_ACCIDENT) player.rank_accidents = player.rank_accidents + 1;
- else if (event == RANK_SUICIDE) player.rank_suicides = player.rank_suicides + 1;
- player.rank_total = 3 * player.rank_kills
- - player.rank_deaths
- - 3 * player.rank_accidents
- - 6 * player.rank_suicides
- ;
-
- };
-
- void(entity targ, entity attacker) RankClientObituary =
- {
- //dprint ("RankClientObituary: executing\n");
-
- if (!USE_MODULE_RANK) return;
-
- if (targ.classname == "player") {
- if (attacker.classname == "teledeath") {
- // telefragging
- RankCountEvent(attacker,RANK_KILL);
- RankCountEvent(targ,RANK_DEATH);
- } else if (attacker.classname == "teledeath2") {
- // never seen in game, so may be wrong here
- RankCountEvent(targ,RANK_ACCIDENT);
- } else if (attacker.classname == "player") {
- if (targ == attacker) {
- // player killed by own weapon
- RankCountEvent(targ,RANK_ACCIDENT);
- } else {
- // attacker killed target
- RankCountEvent(attacker,RANK_KILL);
- RankCountEvent(targ,RANK_DEATH);
- }
- } else {
- // player killed by environment (slime, water, lava etc.)
- RankCountEvent(targ,RANK_ACCIDENT);
- }
- }
- };
-
- void(entity player,float n,float digits) RankPrintRankNumber =
- {
- local string ns;
- if (n<0) {
- if (digits > 3 && n >= -99) sprint (player," ");
- if (digits > 2 && n >= -9) sprint (player," ");
- } else if (n >= 0) {
- if (digits > 3 && n <= 999) sprint (player," ");
- if (digits > 2 && n <= 99) sprint (player," ");
- if (digits > 1 && n <= 9) sprint (player," ");
- }
- ns = ftos(n);
- sprint (player,ns);
- };
-
- void(entity player,entity sort) RankPrintRank =
- {
- local float acc;
- // don't show dead players, they should at least be respawnable
- if (sort.deadflag == DEAD_DEAD) return;
- else if (sort.deadflag != DEAD_NO) sprint(player,"d");
- else if (sort.player_flag & PLAYER_IS_OBSERVER) sprint(player,"o");//#jp#(Observer)
- else sprint(player," ");
- RankPrintRankNumber(player,sort.rank_total,4);
- sprint (player," = ");
- RankPrintRankNumber(player,sort.rank_kills,3);
- sprint (player," ");
- RankPrintRankNumber(player,sort.rank_deaths,3);
- sprint (player," ");
- acc = sort.rank_accidents + sort.rank_suicides;
- RankPrintRankNumber(player,acc,3);
- sprint (player," = ");
- sprint (player,sort.netname);
- sprint (player,"\n");
- };
-
- void(entity player) RankDumpRanksToConsole =
- {
- local entity e, sort, walk;
-
- if (!USE_MODULE_RANK) return;
-
- if (world.chain) error ("RankDumpRanksToConsole: world.chain is set");
-
- // build a sorted lis
- e = find(world, classname, "player");
- sort = world;
- while (e) {
- if (!sort) {
- sort = e;
- e.chain = world;
- } else {
- if (e.rank_total < sort.rank_total) {
- e.chain = sort;
- sort = e;
- } else {
- walk = sort;
- do {
- if (!walk.chain) {
- e.chain = world;
- walk.chain = e;
- } else if (walk.chain.rank_total > e.rank_total) {
- e.chain = walk.chain;
- walk.chain = e;
- } else
- walk = walk.chain;
- } while (walk.chain != e);
- }
- }
- e = find(e, classname, "player");
- }
-
- while (sort) {
- RankPrintRank (player,sort);
- sort = sort.chain;
- }
- };
-
-