This commit is contained in:
2025-09-15 16:30:24 -06:00
parent a4ff18076a
commit 6e23de8f12
61 changed files with 1103 additions and 687 deletions

108
irpg-web/ChangeLog.txt Normal file
View File

@@ -0,0 +1,108 @@
This is the ChangeLog for the old Idle RPG Website Code.
I'm not as religious about making sure my updates make it here as I am about
changes to the IRPG code making it into that ChangeLog, so there may be changes
between versions that you don't see listed here.
Also, please note that any use of "incowrect" or other cow-related "typos" are
NOT typos. I like cattle. A lot. Please stop fixing them :^)
2004-07-17 Jon Honeycutt <jotun@idlerpg.net>
* huge modification of the entire source by the original coder, res0
<bk@slashnet.org>. res0 has really helped this project through his many
contributions; it wouldn't be where it is today without him. thanks, res0!
* New site layout (valid XHTML 1.1 strict) using CSS
* Cleaned up PHP
* User maps do not display unless visitor clicks 'display' link
* changed fgets() calls to add the optional second parameter (for old PHPs)
* removed incorrect header() in makequestmap() (mikegrb)
* checked to make sure key $_SESSION['time'] was set before attempting to
reference it (HarK0nNeN)
* db.php's table tag now specifies the number of rows and columns to make
drawing faster in browsers that pay attention to it (res0)
* header("Location: ") directives now give full URIs
* made better use of htmlentities() and urlencode()s as relates to display
of usernames and classes
* users on quest and world maps are now clickable, leading to their player
info page (John Nielsen)
2004-05-31 Jon Honeycutt <jotun@idlerpg.net>
* changed players.php to show offline users as gray, this style is in
header.php, patch from Chewie <chewie@f2o.org>
* changed map-drawing PHP scripts to draw a transparent image which is then
overlayed (using CSS) over the static newmap.png image. changed the map
drawing frequency to 1/user/20s as I think this greatly decreases CPU
usage. changed the maperror.png to something more appropriate. $mapx
and $mapy in config.php describe the dimensions of your map file (Rick)
* fixed quest.php to show proper coordinates; another evil c/p error (Rick)
2004-05-23 Jon Honeycutt <jotun@idlerpg.net>
* changed most everything to make sense with the new database
* edited dump.php to display data in the same format, despite the new
database format.
* added an xml.php page that takes a 'player' argument and displays
information on that user in xml 1.0 format. should allow a better API
as far as compatibility with newer dbs goes
* changed playerview.php to use fgets() to read from modifiers.txt.
hopefully this is much faster
* edited playerview.php to show map and XML data link
* changed the counter in footer.php to strip the leading path information
from $_SERVER['PHP_SELF'] before using it to identify the page
* removed some unused $i variable from players.php
* created quest.php which shows active quest info
* created makequestmap.php which draws a quest map if quest type is 2,
redirects otherwise
* created worldmap.php which shows the active state of the irpg world
* created makeworldmap.php which draws the world map
* created makemap.php which takes a 'player' argument and draws them on the
map
* commonfunctions.php now has functions to sort by isadmin flag and player
alignment
* index.php updated with information on the new game features
* changed titles on several pages to use $irpg_chan instead of hard-coded
#G7
* updated header.php to link to new pages and idlerpg.net forum
* changed 'time modifiers' to 'character modifiers' as item modifiers are
now stored, also
2004-05-23 Alexander Hirzel <chewie@f2o.org>
* submitted a series of patches to correct, among other things, the horrible
use of <td> where <th> was more appropriate
2004-04-22 Jon Honeycutt <jotun@idlerpg.net>
* if $_GET['alltime'] wasn't set, < and > in time modifiers were not
translated to &lt; and &gt; (thanks DinTx)
* attempted to fix playerview.php from showing others' stats, traded
stristr() for strstr() matching either "^name ", " name ", or "^name's "
2004-04-23 Jonathan Attwell <caffeen@caffeen.org>
* created README, detailing how users are to install and what to edit.
* created config.php, which holds all the setup variables.
* cleaned up some of the php coding.
2004-04-15 Jon Honeycutt <jotun@ultrazone.org>
* we now stripslashes() on $_GET['player'] for players.php,
playerview.php, dump.php (thanks Diab)
2004-04-05 Jon Honeycutt <jotun@ultrazone.org>
* removed some of parallax's tabs :^)
* edited players.php to forward requests for specific players to the proper
playerview.php
* changed links in sitesource.php to be fully-qualified
* removed preg_grep in playerview.php, which insecurely used tainted
data. switched to stristr. (thanks mike@ethernal.org)
* stripped < and > from modifiers.txt output (thanks mike@ethernal.org)
* changed link to idlerpg-adv.txt in players.php to be fully-qualified.
(thanks daxxar)
* may've made other changes, not sure.
2004-02-15 Jon Honeycutt <jotun@ultrazone.org>
* edited source.php to provide fully-qualified URLs to source files;
easier for users to follow license.
* playerview.php's 'View all Time Modifiers' link now displays the
number of time modifiers.
* contact.php now sends a From: field in its headers parameter.
2004-01-31 Titus Barik <titus@barik.net>
* created ChangeLog, following Debian ChangeLog format.
* modified header.php to be location independent via $BASE_URL var.
* players.php and playerview.php are now separate files.

48
irpg-web/INSTALL.txt Normal file
View File

@@ -0,0 +1,48 @@
-------------------------------------------------------------------------------
First-time Installation:
-------------------------------------------------------------------------------
1. Make sure you have the irpg-bot functional and running.
2. Copy all of the irpg-web files to your public_html/irpg web folder.
3. Edit config.php with your favorite editor. This file must be in the same
public directory where the irpg web resides.
4. chmod 644 * && chmod 666 hits.db
5. If you change the default settings in the IRPG bot (for example, if you turn
off the option to write quest info to file, you'll have to manually edit
some scripts to take this into account. If you disable the INFO command,
you might want to remove it from the index.php page.
6. Some code in this package requires that your system have GD 2.0+ (or have it
enabled in your php.ini, on Win32). If you don't want this functionality to
be available, edit the script playerview.php to remove the use of the map
and header.php to remove the links to the world map and the quest info page.
You can also delete the worldmap.php, makeworldmap.php, makemap.php,
quest.php, and makequestmap.php scripts.
7. Edit the website ANY WAY you see fit. You don't have to keep all of the
links to me, I just thought they might be useful or interesting to users :^)
8. All milestones, issues, bugs and features are tracked using GitEmAll.
Thanks for your interest in IdleRPG! :^)
-------------------------------------------------------------------------------
Upgrading:
-------------------------------------------------------------------------------
1. Remove your old web source, ie, rm -rfv that old buggy crap and start over.
2. Make sure you have the irpg-bot functional and running.
3. Copy all of the irpg-web files to your public_html/irpg web folder.
4. Edit config.php with your favorite editor. This file must be in the same
public directory where the irpg web resides.
5. chmod 644 * && chmod 666 hits.db
6. If you change the default settings in the IRPG bot (for example, if you turn
off the option to write quest info to file, you'll have to manually edit
some scripts to take this into account. If you disable the INFO command,
you might want to remove it from the index.php page.
7. Some code in this package requires that your system have GD 2.0+ (or have it
enabled in your php.ini, on Win32). If you don't want this functionality to
be available, edit the script playerview.php to remove the use of the map
and header.php to remove the links to the world map and the quest info page.
You can also delete the worldmap.php, makeworldmap.php, makemap.php,
quest.php, and makequestmap.php scripts.
8. Edit the website ANY WAY you see fit. You don't have to keep all of the
links to me, I just thought they might be useful or interesting to users :^)
9. All milestones, issues, bugs and features are tracked using GitEmAll.
Thanks for your interest in IdleRPG! :^)

64
irpg-web/admincomms.txt Normal file
View File

@@ -0,0 +1,64 @@
This is not the full list of commands for the Idle RPG bot, but only the list
of admin commands.
INFO, retrieve some fairly useless stats about the bot.
DIE, kills the bot.
HOG, summon the Hand of God spell. See the main help file.
RESTART, restarts the bot.
CHPASS <char name> <new password>, change a character's pass in the IRPG.
CHCLASS <char name> <new class name>, change a character's class in the IRPG.
CHUSER <char name> <new char name>, change a character's username in the IRPG.
Please only use in very special circumstances; otherwise, have them form
a new player and DEL the old one. This should not let you overwrite an
existing account, but is untested.
PUSH <char name> <seconds>, push a player toward his goal by subtracting time
from his next time to level. Please use this only if bot has mistakenly
penalized someone. You could also use this to punish a user by setting
the number of seconds to a negative number. Don't do that.
DEL <char name>, remove a user's account.
JUMP <server[:port]>, move the bot to another server.
SILENT <mode>, switch bot between 4 modes of silence.
- mode 0, bot sends all privmsgs.
- mode 1, only chanmsg() is disabled.
- mode 2, only privmsg()/notice() to non-channels is disabled.
- mode 3, privmsgs/notices to users and channels are disabled.
BACKUP, tell bot to copy $opts{'dbfile'} to .dbbackup/$opts{'dbfile'}TIMESTAMP
RELOADDB, force bot to reload player database file, rewriting all memory.
RELOADDB can only be used while in pause mode.
PAUSE, toggle pause mode.
PEVAL <code>, execute arbitrary argument as Perl code. Queues output > 3 lines
or >1k of text. Some useful PEVAL commands:
- Delete all accounts not logged in in 4 weeks (See also: DELOLD):
/msg bot PEVAL delete $rps{$_} for grep { time()-$rps{$_}{lastlogin} > 3600*24*7*4 && !$rps{$_}{online} } keys %rps;
- Remove one hour from everyone's clocks:
/msg bot PEVAL $rps{$_}{next} -= 3600 for keys %rps;
- List all online users, separated by commas:
/msg bot PEVAL join(', ',grep { $rps{$_}{online} } keys %rps);
- View contents of a file on remote host:
/msg bot peval `cat file`
- Turn on debug mode:
/msg bot peval $opts{debug}=1;
- Force write-out of database:
/msg bot peval writedb();
DELOLD <days>, remove all non-logged-in accounts inactive in the last <days>
days.
CLEARQ, clear the outgoing message queue. Useful to use if someone floods the
bot with a lot of text that it plans to respond to.
MKADMIN <username>, set the isadmin flag for a given username.

View File

@@ -0,0 +1,94 @@
<?php
function duration($s) {
$s = abs(intval($s));
if ($s == 0) return "None";
return sprintf("%d day%s, %02d:%02d:%02d",
$s/86400,intval($s/86400)==1?"":"s",
($s%86400)/3600,($s%3600)/60,$s%60);
}
function cmp_level_asc($a,$b) { return cmp_level_desc($b,$a); }
function cmp_level_desc($a,$b) {
list(,,,$level1,,$time1)=explode("\t",trim($a));
list(,,,$level2,,$time2)=explode("\t",trim($b));
if ($level1 == $level2) return ($time1 <= $time2) ? -1 : 1;
return ($level1 > $level2) ? -1 : 1;
}
function cmp_alignment_asc($a,$b) { return cmp_alignment_desc($b,$a); }
function cmp_alignment_desc($a,$b) {
list(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,$a1)=explode("\t",trim($a));
list(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,$a2)=explode("\t",trim($b));
if ($a1 == "g" || $a2 == "e") return -1;
if ($a1 == "e" || $a2 == "g") return 1;
return 0;
}
function cmp_isadmin_asc($a,$b) { return cmp_isadmin_desc($b,$a); }
function cmp_isadmin_desc($a,$b) {
list(,,$o1)=explode("\t",trim($a));
list(,,$o2)=explode("\t",trim($b));
return ($o1 > $o2) ? -1 : 1;
}
function cmp_ttl_asc($a,$b) { return cmp_ttl_desc($b,$a); }
function cmp_ttl_desc($a,$b) {
list(,,,,,$time1)=explode("\t",trim($a));
list(,,,,,$time2)=explode("\t",trim($b));
return ($time2 < $time1) ? -1 : 1;
}
function cmp_user_asc($a,$b) { return cmp_user_desc($b,$a); }
function cmp_user_desc($a,$b) {
list($u1)=explode("\t",trim($a));
list($u2)=explode("\t",trim($b));
return (strtolower($u1) > strtolower($u2)) ? -1 : 1;
}
function cmp_online_asc($a,$b) { return cmp_online_desc($b,$a); }
function cmp_online_desc($a,$b) {
list(,,,,,,,,$o1)=explode("\t",trim($a));
list(,,,,,,,,$o2)=explode("\t",trim($b));
return ($o1 > $o2) ? -1 : 1;
}
function cmp_idled_asc($a,$b) { return cmp_idled_desc($b,$a); }
function cmp_idled_desc($a,$b) {
list(,,,,,,,,,$i1)=explode("\t",trim($a));
list(,,,,,,,,,$i2)=explode("\t",trim($b));
return ($i1 > $i2) ? -1 : 1;
}
function cmp_created_asc($a,$b) { return cmp_created_desc($b,$a); }
function cmp_created_desc($a,$b) {
list(,,,,,,,,,,,,,,,,,,,$i1)=explode("\t",trim($a));
list(,,,,,,,,,,,,,,,,,,,$i2)=explode("\t",trim($b));
return ($i1 > $i2) ? -1 : 1;
}
function cmp_lastlogin_asc($a,$b) { return cmp_lastlogin_desc($b,$a); }
function cmp_lastlogin_desc($a,$b) {
list(,,,,,,,,,,,,,,,,,,,,$i1)=explode("\t",trim($a));
list(,,,,,,,,,,,,,,,,,,,,$i2)=explode("\t",trim($b));
return ($i1 > $i2) ? -1 : 1;
}
function cmp_uhost_asc($a,$b) { return cmp_uhost_desc($b,$a); }
function cmp_uhost_desc($a,$b) {
list(,,,,,,,$u1)=explode("\t",trim($a));
list(,,,,,,,$u2)=explode("\t",trim($b));
return (strtolower($u1) > strtolower($u2)) ? -1 : 1;
}
function cmp_pen_asc($a,$b) { return cmp_pen_desc($b,$a); }
function cmp_pen_desc($a,$b) {
list(,,,,,,,,,,,,$p1[0],$p1[1],$p1[2],$p1[3],$p1[4],$p1[5],
$p1[6])=explode("\t",trim($a));
list(,,,,,,,,,,,,$p2[0],$p2[1],$p2[2],$p2[3],$p2[4],$p2[5],
$p2[6])=explode("\t",trim($b));
$s1 = $s2 = 0;
foreach ($p1 as $pen) $s1 += $pen;
foreach ($p2 as $pen) $s2 += $pen;
return ($s1 > $s2) ? -1 : 1;
}
function cmp_sum_asc($a,$b) { return cmp_sum_desc($b,$a); }
function cmp_sum_desc($a,$b) {
list(,,,,,,,,,,,,,,,,,,,,,$i1[0],$i1[1],$i1[2],$i1[3],$i1[4],$i1[5],
$i1[6],$i1[7],$i1[8],$i1[9])=explode("\t",trim($a));
list(,,,,,,,,,,,,,,,,,,,,,$i2[0],$i2[1],$i2[2],$i2[3],$i2[4],$i2[5],
$i2[6],$i2[7],$i2[8],$i2[9])=explode("\t",trim($b));
$s1 = $s2 = 0;
foreach ($i1 as $item) { $s1 += $item; }
foreach ($i2 as $item) $s2 += $item;
return ($s1 > $s2) ? -1 : 1;
}
?>

61
irpg-web/config.php Normal file
View File

@@ -0,0 +1,61 @@
<?php
// admin nick
$admin_nick="admin";
// admin email
$admin_email="admin@mynet.org";
// your game's bot nickname
$irpg_bot="IdleBot";
// your game's server to connect to
$irpg_network="irc.mynet.org:7000";
// your game's channel
$irpg_chan="#IdleRPG";
// your server's network name advertisement
$irpg_irc_network_name="MyNet IRC Network";
// your server's network address advertisement
$irpg_irc_network_address="ircs://irc.mynet.org:7000";
// base directory of your game's url
// my site is https://www.mynet.org/irpg/, so it's "/irpg/"
$irpg_base_dir="/irpg/";
// url of your forum site
$irpg_forum_url="https://www.mynet.org/";
// type of site email disabled/smtp/php
$irpg_site_email="disabled";
// full or relative pathname to the DBs:
// character database
$irpg_db="/home/user/private/idlerpg/irpg.db";
// time modifiers file
$irpg_mod="/home/user/private/idlerpg/modifiers.txt";
// active quest info file
$irpg_qfile="/home/user/private/idlerpg/questinfo.txt";
// image to use for the top logo
$irpg_logo="idlerpg_ff0000.png";
// stylesheet to use g7/rw
$irpg_stylesheet = "rw.css";
// width-wise dimension of your map file
// this does not appear to be used anywhere in the web
// it appears that all PHP map files use 500,500 images,
// regardless of what you set here
$irpg_mapx=500;
// length-wise dimension of your map file
// this does not appear to be used anywhere in the web
// it appears that all PHP map files use 500,500 images,
// regardless of what you set here
$irpg_mapy=500;
?>

55
irpg-web/contact.php Normal file
View File

@@ -0,0 +1,55 @@
<?php
include("config.php");
$irpg_page_title = "Contact";
$irpg_page_desc = "IdleRPG Contact";
include("header.php");
echo "<h1>Contact</h1>";
if (!$irpg_site_email) {
echo " <blockquote>Config error. The config file was not loaded correctly.</blockquote>\n";
}
else if ($irpg_site_email == "disabled") {
echo " <blockquote>Email is disabled.</blockquote>\n";
}
else if ($irpg_site_email == "php" && $_POST['from'] && $_POST['text']) {
$to = $admin_email;
$subject = "IdleRPG: ".$_POST['from'];
$message = "Name: ".$_POST['name']."\nE-mail: ".$_POST['from']."\n\n".$_POST['text'];
$additional_headers = "From: ".$_POST['from']."\r\n";
mail($to, $subject, $message, $additional_headers);
echo " <blockquote>Thanks for your submission.</blockquote>\n";
}
else if ($irpg_site_email == "smtp" && $_POST['from'] && $_POST['text']) {
echo " <blockquote>SMTP Email is under construction. Your submission was not submitted.</blockquote>\n";
}
else {
echo " <form method=\"post\" action=\"contact.php\">\n".
" <table border=\"0\">\n".
" <tr>\n".
" <th align=\"left\"><label for=\"from\">Your e-mail address</label>:</th>\n".
" <td align=\"right\">\n".
" <input type=\"text\" size=\"20\" maxlength=\"50\" name=\"from\" id=\"from\" />\n".
" </td>\n".
" </tr>\n".
" <tr>\n".
" <th align=\"left\"><label for=\"name\">Your name</label>:</th>\n".
" <td align=\"right\">\n".
" <input type=\"text\" size=\"20\" maxlength=\"50\" name=\"name\" id=\"name\" />\n".
" </td>\n".
" </tr>\n".
" <tr>\n".
" <td colspan=\"2\">\n".
" <textarea name=\"text\" rows=\"6\" cols=\"44\"></textarea><br />\n".
" </td>\n".
" </tr>\n".
" <tr>\n".
" <td colspan=\"2\" align=\"right\">\n".
" <input type=\"submit\" value=\"Send\" />\n".
" </td>\n".
" </tr>\n".
" </table>\n".
" </form>\n";
}
include("footer.php");
?>

253
irpg-web/db.php Normal file
View File

@@ -0,0 +1,253 @@
<?php
include("config.php");
include("commonfunctions.php");
$irpg_page_title = "DB-style Player Listing";
$irpg_page_desc = "IdleRPG DB-style Player Listing";
include("header.php");
$file = file($irpg_db);
unset($file[0]);
if (!$_GET['sort'] ||
(($_GET['sort'] != "cmp_level_asc") &&
($_GET['sort'] != "cmp_level_desc") &&
($_GET['sort'] != "cmp_isadmin_asc") &&
($_GET['sort'] != "cmp_isadmin_desc") &&
($_GET['sort'] != "cmp_alignment_asc") &&
($_GET['sort'] != "cmp_alignment_desc") &&
($_GET['sort'] != "cmp_ttl_asc") &&
($_GET['sort'] != "cmp_ttl_desc") &&
($_GET['sort'] != "cmp_pen_asc") &&
($_GET['sort'] != "cmp_pen_desc") &&
($_GET['sort'] != "cmp_lastlogin_asc") &&
($_GET['sort'] != "cmp_lastlogin_desc") &&
($_GET['sort'] != "cmp_created_asc") &&
($_GET['sort'] != "cmp_created_desc") &&
($_GET['sort'] != "cmp_idled_asc") &&
($_GET['sort'] != "cmp_idled_desc") &&
($_GET['sort'] != "cmp_user_asc") &&
($_GET['sort'] != "cmp_user_desc") &&
($_GET['sort'] != "cmp_online_asc") &&
($_GET['sort'] != "cmp_online_desc") &&
($_GET['sort'] != "cmp_uhost_asc") &&
($_GET['sort'] != "cmp_uhost_desc") &&
($_GET['sort'] != "cmp_sum_asc") &&
($_GET['sort'] != "cmp_sum_desc"))) $_GET['sort'] = "cmp_level_desc";
usort($file,$_GET['sort']);
?>
<table border=1 cellpadding=2 cellspacing=2 cols="32" rows="<?php echo count($file); ?>">
<tr>
<th NOWRAP>
User
(<a href="db.php?sort=cmp_user_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_user_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Level
(<a href="db.php?sort=cmp_level_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_level_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Admin
(<a href="db.php?sort=cmp_isadmin_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_isadmin_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>Class</th>
<th NOWRAP>
TTL
(<a href="db.php?sort=cmp_ttl_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_ttl_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Nick!User@Host
(<a href="db.php?sort=cmp_uhost_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_uhost_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Online
(<a href="db.php?sort=cmp_online_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_online_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Total Time Idled
(<a href="db.php?sort=cmp_idled_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_idled_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>X Pos</th>
<th NOWRAP>Y Pos</th>
<th NOWRAP>Mesg Pen.</th>
<th NOWRAP>Nick Pen.</th>
<th NOWRAP>Part Pen.</th>
<th NOWRAP>Kick Pen.</th>
<th NOWRAP>Quit Pen.</th>
<th NOWRAP>Quest Pen.</th>
<th NOWRAP>LOGOUT Pen.</th>
<th NOWRAP>
Total Pen.
(<a href="db.php?sort=cmp_pen_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_pen_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Acct. Created
(<a href="db.php?sort=cmp_created_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_created_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Last Login
(<a href="db.php?sort=cmp_lastlogin_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_lastlogin_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>Amulet</th>
<th NOWRAP>Charm</th>
<th NOWRAP>Helm</th>
<th NOWRAP>Boots</th>
<th NOWRAP>Gloves</th>
<th NOWRAP>Ring</th>
<th NOWRAP>Leggings</th>
<th NOWRAP>Shield</th>
<th NOWRAP>Tunic</th>
<th NOWRAP>Weapon</th>
<th NOWRAP>
Sum
(<a href="db.php?sort=cmp_sum_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_sum_desc">
<img src="down.png" border="0">
</a>)
</th>
<th NOWRAP>
Alignment
(<a href="db.php?sort=cmp_alignment_asc">
<img src="up.png" border="0">
</a>
/
<a href="db.php?sort=cmp_alignment_desc">
<img src="down.png" border="0">
</a>)
</th>
</tr>
<?php
foreach ($file as $line) {
list($user,,$isadmin,$level,$class,$secs,,$uhost,$online,$idled,$x,$y,
$pen['mesg'],
$pen['nick'],
$pen['part'],
$pen['kick'],
$pen['quit'],
$pen['quest'],
$pen['logout'],
$created,
$lastlogin,
$item['amulet'],
$item['charm'],
$item['helm'],
$item['boots'],
$item['gloves'],
$item['ring'],
$item['leggings'],
$item['shield'],
$item['tunic'],
$item['weapon'],
$alignment,
) = explode("\t",trim($line));
$class = str_replace("<","&lt;",$class);
$user = str_replace("<","&lt;",$user);
$class = str_replace(">","&gt;",$class);
$user = str_replace(">","&gt;",$user);
$sum = 0;
foreach ($item as $k => $v) $sum += $v;
$pentot = 0;
foreach ($pen as $k => $v) $pentot += $v;
echo " <tr>\n".
" <td nowrap>$user</td>\n".
" <td>$level</td>\n".
" <td>".($isadmin?"Yes":"No")."</td>\n".
" <td nowrap>$class</td>\n".
" <td nowrap>".duration($secs)."</td>\n".
" <td nowrap>$uhost</td>\n".
" <td>".(($online == 1) ? "Yes" : "No")."</td>\n".
" <td nowrap>".duration($idled)."</td>\n".
" <td nowrap>$x</td>\n".
" <td nowrap>$y</td>\n".
" <td nowrap>".duration($pen['mesg'])."</td>\n".
" <td nowrap>".duration($pen['nick'])."</td>\n".
" <td nowrap>".duration($pen['part'])."</td>\n".
" <td nowrap>".duration($pen['kick'])."</td>\n".
" <td nowrap>".duration($pen['quit'])."</td>\n".
" <td nowrap>".duration($pen['quest'])."</td>\n".
" <td nowrap>".duration($pen['logout'])."</td>\n".
" <td nowrap>".duration($pentot)."</td>\n".
" <td nowrap>".date("D M j H:i:s Y",$created)."</td>\n".
" <td nowrap>".date("D M j H:i:s Y",$lastlogin)."</td>\n".
" <td>".$item['amulet']."</td>\n".
" <td>".$item['charm']."</td>\n".
" <td>".$item['helm']."</td>\n".
" <td>".$item['boots']."</td>\n".
" <td>".$item['gloves']."</td>\n".
" <td>".$item['ring']."</td>\n".
" <td>".$item['leggings']."</td>\n".
" <td>".$item['shield']."</td>\n".
" <td>".$item['tunic']."</td>\n".
" <td>".$item['weapon']."</td>\n".
" <td>$sum</td>\n".
" <td>".($alignment=='e'?"Evil":($alignment=='n'?"Neutral":"Good"))."</td>\n".
" </tr>\n";
}
echo " </table>\n".
" <br><br>\n".
" * Accounts created before Aug 29, 2003 may have incorrect data fields.\n";
include("footer.php");
?>

BIN
irpg-web/down.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

118
irpg-web/dump.php Normal file
View File

@@ -0,0 +1,118 @@
<?php
// this file has been edited to produce its output in the same format as
// it has with previous versions, despite the new database format. coders
// should use the new xml.php to glean player info, which is much more
// suited to db changes.
header('Content-Type: text/plain');
include("config.php");
include("commonfunctions.php");
$file = file($irpg_db);
$header = explode("\t",$file[0]);
unset($header[1]); // password
unset($header[2]); // isadmin
unset($header[6]); // nickname
unset($header[10]); // x pos
unset($header[11]); // y pos
unset($header[31]); // alignment
echo join("\t",$header)."\n";
unset($file[0]);
/* specific character requested */
if ($_GET['player']) {
foreach ($file as $line) {
list($user) = explode("\t",trim($line));
if ($user == $_GET['player']) {
list($user,,,
$level,$class,$secs,,$uhost,$online,$idled,,,
$pen['mesg'],
$pen['nick'],
$pen['part'],
$pen['kick'],
$pen['quit'],
$pen['quest'],
$pen['logout'],
$created,
$lastlogin,
$item['amulet'],
$item['charm'],
$item['helm'],
$item['boots'],
$item['gloves'],
$item['ring'],
$item['leggings'],
$item['shield'],
$item['tunic'],
$item['weapon'],
) = explode("\t",trim($line));
echo join("\t",
array($user,$level,$class,$secs,$uhost,$online,$idled,
$pen['mesg'],
$pen['nick'],
$pen['part'],
$pen['kick'],
$pen['quit'],
$pen['quest'],
$pen['logout'],
$created,
$lastlogin,
$item['amulet'],
$item['charm'],
$item['helm'],
$item['boots'],
$item['gloves'],
$item['ring'],
$item['leggings'],
$item['shield'],
$item['tunic'],
$item['weapon']))."\n";
}
}
exit(0);
}
/* no specific character requested; list all */
usort($file,"cmp_level_desc");
foreach ($file as $line) {
list($user,,,
$level,$class,$secs,,$uhost,$online,$idled,,,
$pen['mesg'],
$pen['nick'],
$pen['part'],
$pen['kick'],
$pen['quit'],
$pen['quest'],
$pen['logout'],
$created,
$lastlogin,
$item['amulet'],
$item['charm'],
$item['helm'],
$item['boots'],
$item['gloves'],
$item['ring'],
$item['leggings'],
$item['shield'],
$item['tunic'],
$item['weapon'],
) = explode("\t",trim($line));
echo join("\t",
array($user,$level,$class,$secs,$uhost,$online,$idled,
$pen['mesg'],
$pen['nick'],
$pen['part'],
$pen['kick'],
$pen['quit'],
$pen['quest'],
$pen['logout'],
$created,
$lastlogin,
$item['amulet'],
$item['charm'],
$item['helm'],
$item['boots'],
$item['gloves'],
$item['ring'],
$item['leggings'],
$item['shield'],
$item['tunic'],
$item['weapon']))."\n";
}
?>

39
irpg-web/footer.php Normal file
View File

@@ -0,0 +1,39 @@
</div>
<div class="footer">
<p class="small">
Questions? Comments? Suggestions? Bugs? Naked pics?
<?php
if ($irpg_site_email != null && $irpg_site_email != "disabled") {
echo " <a href=\"contact.php\">$admin_email</a> or\n";
}
echo " ".$admin_nick."@IRC.\n";
?>
<?php
$hits = file("hits.db");
$fp = fopen("hits.db", "w");
$thispage = explode("/",$_SERVER['PHP_SELF']);
$thispage = array_pop($thispage);
if ($fp == false) {
echo " Error: could not open file hits.db.";
}
foreach ($hits as $line) {
list($page,$numhits,$date) = explode("\t",trim($line));
if ($page == $thispage) {
++$numhits;
echo " $numhits hits since $date\n";
$found = 1;
}
if ($fp) {
fwrite($fp,"$page\t$numhits\t$date\n");
}
}
if (!$found && $fp) {
echo " 1 hit since ".date("M j, Y",time())."\n";
fwrite($fp,$thispage."\t1\t".date("M j, Y",time())."\n");
}
fclose($fp);
?>
</p>
</div>
</body>
</html>

111
irpg-web/g7.css Normal file
View File

@@ -0,0 +1,111 @@
body {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
background-color: #FFFFF0;
color: black;
margin: 10px;
text-align: justify;
}
h1 { margin-bottom: 0px; margin-top: 0px; }
h2 { margin-bottom: 0px; }
p.small { margin: 0px; font-size: smaller; }
a { text-decoration: none; color: #C69500; }
a:hover { text-decoration: underline; color: black; }
div.head {
border: 1px solid #c0c0c0;
text-align: left;
width: 100%;
margin-bottom: 10px;
background: #FFFFFF;
}
div.menu {
width: 120px;
position: relative;
float: left;
border: 1px solid #c0c0c0;
background: #FFFFFF;
}
div#menu a.home { color: #000000; background: #c0c0c0; border: 1px solid #000000; }
div#menu a.home:hover { background: #c0c0c0; border: 1px solid #000000; }
div#menu a {
text-align: center;
width: 118px;
margin: 0px;
display: block;
border: 1px solid #FFFFFF
}
div#menu a:hover { border: 1px solid #000000; background: #c0c0c0; text-decoration: none; }
div.content {
border: 1px solid #c0c0c0;
margin-left: 130px;
margin-top: 0px;
padding: 10px;
background: #FFFFFF;
}
div.footer {
border: 1px solid #c0c0c0;
margin-left: 130px;
margin-top: 10px;
padding: 10px;
background: #FFFFFF;
}
table.uniques {
border: 1px solid #c0c0c0;
padding: 5px;
text-align: left;
}
table.uniques td {
padding-left: 10px;
}
table.penalty {
border: 1px solid #c0c0c0;
padding: 5px;
text-align: left;
}
table.penalty th {
text-align: right;
}
table.penalty td {
}
/* Styles for the userlist */
li.online { font-weight: bold; }
li.offline { color: #c0c0c0; }
a.offline { color: #707070; }
#map {
width: 500px;
height: 500px;
background-image: url(newmap.png);
}
table.forum {
border: 1px solid #c0c0c0;
table-layout: fixed;
overflow: auto;
}
table.forum td,tr,caption,thead,tfoot,th {
padding-left: 10px;
padding-right: 10px;
}
.tdblue { background-color: #ffffdf; }
.tdgray { background-color: #eeeee0; }
.tdred {
border: 1px solid red;
background-color: #FFCCCC;
}
.smallest {
font-size: 11px;
}

BIN
irpg-web/head.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

44
irpg-web/header.php Normal file
View File

@@ -0,0 +1,44 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Strict//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title><?php echo $irpg_page_title; ?> :: <?php echo $irpg_chan; ?></title>
<meta name="description" content="<?php echo $irpg_page_desc; ?>" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="<?php echo $irpg_stylesheet; ?>" />
</head>
<body>
<div class="head">
<?php
echo " <img src=\"$irpg_logo\" alt=\"$irpg_chan\" title=\"$irpg_chan\" width=\"400\" height=\"56\" />\n";
?>
</div>
<div id="menu" class="menu">
<?php
$topbarurl = array(
'Game Info' => $irpg_base_dir . 'index.php',
'Player Info' => $irpg_base_dir . 'players.php',
'World Map' => $irpg_base_dir . 'worldmap.php',
'Quest Info' => $irpg_base_dir . 'quest.php',
);
if ($irpg_site_email && $irpg_site_email != "disabled") {
$topbarurl['Contact'] = $irpg_base_dir . 'contact.php';
}
if ($irpg_forum_url) {
$topbarurl['Forum'] = $irpg_forum_url;
}
foreach ($topbarurl as $key => $value) {
if ($value == $_SERVER['PHP_SELF']) {
echo " <a class=\"home\" href=\"$value\">$key</a>\n";
}
else {
echo " <a href=\"$value\">$key</a>\n";
}
}
?>
</div>
<div class="content">

10
irpg-web/hits.db Normal file
View File

@@ -0,0 +1,10 @@
contact.php 420 Jul 4, 2016
db.php 420 Jul 4, 2016
forum.php 420 Jul 4, 2016
index.php 420 Jul 4, 2016
playerview.php 420 Jul 4, 2016
players.php 420 Jul 4, 2016
quest.php 420 Jul 4, 2016
worldmap.php 420 Jul 4, 2016
g7.css 420 Jul 4, 2016
idlerpg.png 420 Jul 4, 2016

142
irpg-web/idlerpg-adv.txt Normal file
View File

@@ -0,0 +1,142 @@
#!/usr/bin/perl -w
# idlerpg-adv (11-22-2003) by daxxar (http://mental.mine.nu)
# Usage: ./idlerpg-adv.pl [playernames]
#
# Call this script from the command line, or your login profile.
use strict;
use LWP::Simple;
# Use cookies:
# %user - username, %class - class, %level - level,
# %next - time to next level, %status - online status,
# %uhost - nick!ident@host, %ca - created at,
# %llo - last logged on, %ti - total idletime,
# %items - list of items, %penalties - list of penalties (special; multiline)
#
# Each comma-separated element is printed with a newline at the end :)
my @string = (
'[User] %user', '[Class] %class', '[Level] %level', '[Next level] %next',
'[Status] %status', '[User@host] %uhost', '[Created at] %ca',
'[Last logged on] %llo', '[Total idle] %ti', '[Items] %items',
'[Penalties] %penalties'
);
### No need to change below ###
# For printing things in a columnized view
# print_col(\@list_of_entries, \@value_of_entries, $number_per_line)
sub make_col {
my $entryname = shift;
my $entryvalue = shift;
my $count = shift;
my @len;
my $ret;
# Find maximum length for each of the $count columns
for my $x (0 .. $#{$entryvalue}) {
my $col = $x % $count;
if (!defined($len[$col]) || $len[$col] < length($entryvalue->[$x] . $entryname->[$x])) {
$len[$col] = length("$entryvalue->[$x]"."$entryname->[$x]");
}
}
for my $t (0 .. $#$entryvalue) {
if (!($t % $count)) { $ret .= "\n "; }
$ret .= "$entryname->[$t]\($entryvalue->[$t]\)";
$ret .= ' ' x ($len[$t % $count] - length($entryname->[$t] . $entryvalue->[$t]) + 1);
}
return $ret;
}
sub time_to {
my @timeunits = ('yr', 'month', 'week', 'day', 'hr', 'min', 'sec');
my @timecalc = (31104000, 2592000, 604800, 86400, 3600, 60, 1);
my $seconds = shift; my $output;
if ($seconds == 0) { return "0 seconds"; }
for my $x (0 .. $#timecalc) {
my $y = int($seconds / $timecalc[$x]);
if ($y != 0 && $seconds != 0 && $seconds >= $timecalc[$x]) {
$seconds = ($seconds % $timecalc[$x]);
$output .= "$y $timeunits[$x]";
$output .= 's' unless $y == 1;
if ($seconds == 0) { last; }
$output .= ', ' if $x < $#timecalc - 1 && ($seconds % $timecalc[$x+1]) && $seconds != 0;
$output .= ' and ' if !($seconds % $timecalc[$x+1]);
}
}
return $output;
}
sub time_from {
my $seconds = shift;
my ($sec, $min, $hr, $day, $mo, $yr, $wday) = localtime($seconds);
$mo = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Oct', 'Sep', 'Nov', 'Dec')[$mo];
$wday = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')[$wday];
$yr += 1900;
if ($hr < 10) { $hr = "0$hr"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10) { $sec = "0$sec"; }
if ($day < 10) { $day .= ' '; }
return "$wday $mo $day $hr:$min:$sec $yr";
}
die "Usage: $0 <playernames>\n" .
"Example: $0 daxxar cyb\n" if @ARGV == 0;
start:
my $username = shift(@ARGV);
my $page = get "http://jotun.ultrazone.org/g7/dump.php?player=$username";
# Only line is commented if there is no such user
if ($page =~ /^#[^\n]+$/) { print "$username: no such user\n"; exit 1; }
($page) = ($page =~ /\n([^#].*)/); # Remove the comment
# @ent = entries on page, \t separated.
my @ent = split(/\t/, $page);
# Assign each tab-separated entry to its hash-key
my %values = (
'user' => $ent[0], 'level' => $ent[1],
'class' => $ent[2], 'next' => $ent[3],
'host' => $ent[4], 'status' => $ent[5],
'totalidle'=> $ent[6], 'created'=> $ent[14],
'lastlog' => $ent[15],
'penaltynames' => [ qw(msg nick part kick quit quest logout) ],
'penaltytimes' => [ @ent[7 .. 13] ],
'itemnames' => [ qw(amulet charm helm boots gloves ring leggings shield tunic weapon sum) ],
'itemlvls' => [ @ent[16 .. 25] ]
);
$values{'next'} = time_to ($values{'next'});
$values{'totalidle'} = time_to ($values{'totalidle'});
$values{'lastlog'} = time_from($values{'lastlog'});
$values{'created'} = time_from($values{'created'});
if ($values{'status'}) {$values{'status'} = 'Online'}
else {$values{'status'} = 'Offline'}
foreach my $str (@{[ @string ]}) {
$str =~ s/%user/$values{'user'}/g;
$str =~ s/%class/$values{'class'}/g;
$str =~ s/%level/$values{'level'}/g;
$str =~ s/%next/$values{'next'}/g;
$str =~ s/%status/$values{'status'}/g;
$str =~ s/%uhost/$values{'host'}/g;
$str =~ s/%ca/$values{'created'}/g;
$str =~ s/%llo/$values{'lastlog'}/g;
$str =~ s/%ti/$values{'totalidle'}/g;
if ($str =~ /%penalties/) {
my @penaltyname = qw(msg nick part kick quit quest logout);
my @penaltytime = @ent[7 .. 13];
for my $t (0 .. $#penaltytime) { $penaltytime[$t] = time_to($penaltytime[$t]); }
my $cols = make_col(\@penaltyname, \@penaltytime, 3);
$str =~ s/%penalties/$cols/g;
}
if ($str =~ /%items/) {
my @itemname = qw(amulet charm helm boots gloves ring leggings shield tunic weapon sum);
my @itemlvls = @ent[16 .. 25];
# Yay, lets get a nice sum(sum) in output! :D
my $sum; map($sum += $_, @itemlvls);
my $cols = make_col(\@itemname, [ @itemlvls, $sum ], 3);
$str =~ s/%items/$cols/g;
}
$str =~ s///g;
$str =~ s///g;
print "$str\n";
}
print "\n" if @ARGV != 0;
goto start if @ARGV != 0;

BIN
irpg-web/idlerpg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
irpg-web/idlerpg_000000.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
irpg-web/idlerpg_025D30.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
irpg-web/idlerpg_ff0000.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

401
irpg-web/index.php Normal file
View File

@@ -0,0 +1,401 @@
<?php
include("config.php");
$irpg_page_title = "Game Info";
$irpg_page_desc = "IdleRPG Game Info";
include("header.php");
?>
<h1>Idle RPG</h1>
<h2>Game Info</h2>
<p>The Idle RPG is just what it sounds like: an RPG in which the players
idle. In addition to merely gaining levels, players can find items and
battle other players. However, this is all done for you; you just idle.
There are no set classes; you can name your character anything you like,
and have its class be anything you like, as well.</p>
<h2>Location</h2>
<p>The Idle RPG can be played on the
<a href="<?php echo $irpg_irc_network_address; ?>"><?php echo $irpg_irc_network_name; ?></a>
in the channel
<a href="<?php echo $irpg_irc_network_address; ?>/<?php echo $irpg_chan; ?>"><?php echo $irpg_chan; ?></a>.
</p>
<h2>Registering</h2>
<p>To register, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> REGISTER &lt;char name&gt; &lt;password&gt;
&lt;char class&gt;
</code>
<p>Where 'char name' can be up to 16 chars long, 'password' can be up
to 8 characters, and 'char class' can be up to 30 chars.</p>
<h2>Logging In</h2>
<p>To login, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> LOGIN &lt;char name&gt; &lt;password&gt;
</code>
<p>This is a p0 (see <a href="#penalties">Penalties</a>) command.</p>
<h2>Logging Out</h2>
<p>To logout, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> LOGOUT
</code>
<p>This is a p20 (see <a href="#penalties">Penalties</a>) command.</p>
<h2>Changing Your Password</h2>
<p>To change your password, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> NEWPASS &lt;new password&gt;
</code>
<p>This is a p0 (see <a href="#penalties">Penalties</a>) command.</p>
<p>If you have forgotten your password, please use the <a href="#info">
INFO</a> command to find an online admin to help you. If your
administrator does not have the INFO command enabled, then just message
an op in the channel. They can probably help you.</p>
<h2>Removing Your Account</h2>
<p>To remove your account, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> REMOVEME
</code>
<p>This is a p0 (see <a href="#penalties">Penalties</a>) command :^)</p>
<h2>Changing Your Alignment</h2>
<p>To change your alignment, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> ALIGN &lt;good|neutral|evil&gt;
</code>
<p>This is a p0 (see <a href="#penalties">Penalties</a>) command.</p>
<p>Your alignment can affect certain aspects of the game. You may align
with good, neutral, or evil. 'Good' users have a 10% boost to their item
sum for battles, and a 1/12 chance each day that they, along with a
'good' friend, will have the light of their god shine upon them,
accelerating them 5-12% toward their next level. 'Evil' users have a 10%
detriment to their item sum for battles (ever forsaken in their time of
most need...), but have a 1/8 chance each day that they will either a)
attempt to steal an item from a 'good' user (whom they cannot help but
hate) or b) be forsaken (for 1-5% of their TTL) by their evil god. After
all, we all know that crime doesn't pay. Also, 'good' users have only a
1/50 chance of landing a <a href="#critstrike">Critical Strike</a> when
battling, while 'evil' users (who always fight dirty) have a 1/20
chance. Neutral users haven't had anything changed, and all users start
off as neutral.</p>
<p>I haven't run the numbers to see which alignment it is better to
follow, so the stats for this feature may change in the future.</p>
<a name="info"></a>
<h2>Obtaining Bot Info</h2>
<p>To see some simple information on the bot, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> INFO
</code>
<p>This is a p0 (see <a href="#penalties">Penalties</a>) command.</p>
<p>This command gives info such as to which server the bot is connected
and the nicknames of online bot admins.</p>
<p>This command is optional, and may be disabled by your bot admin.</p>
<h2>Levelling</h2>
<p>To gain levels, you must only be logged in and idle. The time
between levels is based on your character level, and is calculated
by the formula:</p>
<p>600*(1.16^YOUR_LEVEL)</p>
<p>Where ^ represents the exponentiation operator.</p>
<p>Very high levels are calculated differently as of version 3.0. Levels
after level 60 have a next time to level of:</p>
<p>(time to level @ 60) + ((1 day) * (level - 60))</p>
<p>The exponent method code had simply gotten to that point that levels
were taking too long to complete.</p>
<h2>Checking the Active Quest</h2>
<p>To see the active quest, its users, and its time left to
completion:</p>
<code>
/msg <?php echo $irpg_bot; ?> QUEST
</code>
<p>This is a p0 (see <a href="#penalties">Penalties</a>) command.</p>
<h2>Checking Your Online Status</h2>
<p>To see whether you are logged on, simply:</p>
<code>
/msg <?php echo $irpg_bot; ?> WHOAMI
</code>
<p>This is a p0 (see <a href="#penalties">Penalties</a>) command.</p>
<a name="penalties"></a>
<h2>Penalties</h2>
<p>If you do something other than idle, like part, quit, talk in the
channel, change your nick, or notice the channel, you are
penalized. The penalties are time, in seconds, added to your next
time to level and are based on your character level. The formulae
are as follows:</p>
<table id="penalty" class="penalty">
<tr>
<th>Nick change</th>
<td>30*(1.14^(YOUR_LEVEL))</td>
</tr>
<tr>
<th>Part</th>
<td>200*(1.14^(YOUR_LEVEL))</td>
</tr>
<tr>
<th>Quit</th>
<td>20*(1.14^(YOUR_LEVEL))</td>
</tr>
<tr>
<th>LOGOUT command</th>
<td>20*(1.14^(YOUR_LEVEL))</td>
</tr>
<tr>
<th>Being Kicked</th>
<td>250*(1.14^(YOUR_LEVEL))</td>
</tr>
<tr>
<th>Channel privmsg</th>
<td>[message_length]*(1.14^(YOUR_LEVEL))</td>
</tr>
<tr>
<th>Channel notice</th>
<td>[message_length]*(1.14^(YOUR_LEVEL))</td>
</tr>
</table>
<br />
<p>So, a level 25 character changing their nick would be penalized
20*(1.14^25)=793 seconds towards their next level.</p>
<p>Penalty shorthand is p[num]. So, a nick change is a p30 event,
parting the channel is a p200 event, and quitting IRC is a p20 event.
Messages and notices are p[length of message in characters].</p>
<h2>Items</h2>
<p>Each time you level, you find an item. You can find an item as
high as 1.5*YOUR_LEVEL (unless you find a <a href="#uniqueitems">
unique item</a>). There are 10 types of items: rings,
amulets, charms, weapons, helms, tunics, gloves, leggings,
shields, and boots. You can find one of each type. When you find
an item with a level higher than the level of the item you already
have, you toss the old item and start using the new one. As of version
3.0, there is an optional, p0 STATUS command that your admin may have
enabled, but you cannot see which items you have over IRC (only your
total item sum). You can, however, see which items you have on the web
<a href="players.php">here</a>.</p>
<p>As you may guess, you have a higher chance of rolling an item of a
lower value than you do of rolling one of a higher value level. The exact
formula is as follows:</p>
<p>for each 'number' from 1 to YOUR_LEVEL*1.5<br />
&nbsp;&nbsp;you have a 1 / ((1.4)^number) chance to find an
item at this level<br />
end for<p>
<p>As for item type, you have an equal chance to roll any type.</p>
<h2>Battle</h2>
<p>Each time you level, if your level is less than 25, you have a 25%
chance to challenge someone to combat. If your level is greater than or
equal to 25, you have a 100% chance to challenge someone. A pool of
opponents is chosen of all online players, and one is chosen randomly. If
there are no other online players, you fight no one. However, if you do
challenge someone, this is how the victor is decided:</p>
<ul>
<li>Your item levels are summed.</li>
<li>Their item levels are summed.</li>
<li>A random number between zero and your sum is taken.</li>
<li>A random number between zero and their sum is taken.</li>
<li>If your roll is larger than theirs, you win.</li>
</ul>
<p>If you win, your time towards your next level is lowered. The amount
that it is lowered is based on your opponent's level. The formula is:</p>
<p>((the larger number of (OPPONENT_LEVEL/4) and 7) / 100) *
YOUR_NEXT_TIME_TO_LEVEL</p>
<p>This means that you lose no less than 7% from your next time to level.
If you win, your opponent is not penalized any time, unless you land a
<a href="#critstrike">Critical Strike</a>.</p>
<p>If you lose, you will be penalized time. The penalty is calculated
using the formula:</p>
<p>((the larger number of (OPPONENT_LEVEL/7) and 7) / 100) *
YOUR_NEXT_TIME_TO_LEVEL</p>
<p>This means that you gain no less than 7% of your next time to level.
If you lose, your opponent is not awarded any time.</p>
<p>Battling the IRPG bot is a special case. The bot has an item sum of
1+[highest item sum of all players]. The percent awarded if you win is a
constant 20%, and the percent penalized if you lose is a constant 10%.</p>
<p>As of version 3.0, if more than 15% of online players are level 45 or
higher, then a random level 45+ user will battle another random player
every hour. This is to speed up levelling among higher level players.</p>
<p>Also as of version 3.0, there is a grid system. The grid is a 500 x 500
area in which players may walk. If you encounter another player on the
grid, you have a 1 / (NUMBER_OF_ONLINE_PLAYERS) chance to battle them.
Battle awards are calculated using the above formulae. More information
on the grid system is available <a href="#grid">here</a>.</p>
<p>Also as of version 3.0, a successful battle may result an item being
<a href="#stealing">stolen</a>.</p>
<a name="uniqueitems"></a>
<h2>Unique Items</h2>
<p>As of v2.1.2, after level 25, you have a chance to roll items
significantly higher than items you would normally find at that level.
These are unique items, and have the following stats:</p>
<table id="uniques" class="uniques">
<tr>
<th>Name</th>
<th>Item Level Range</th>
<th>Required User Level</th>
<th>Chance to Roll</th>
</tr>
<tr>
<th>Mattt's Omniscience Grand Crown</th>
<td>50-74</td>
<td>25 or greater</td>
<td>1 / 40</td>
</tr>
<tr>
<th>Juliet's Glorious Ring of Sparkliness</th>
<td>50-74</td>
<td>25 or greater</td>
<td>1 / 40</td>
</tr>
<tr>
<th>Res0's Protectorate Plate Mail</th>
<td>75-99</td>
<td>30 or greater</td>
<td>1 / 40</td>
</tr>
<tr>
<th>Dwyn's Storm Magic Amulet</th>
<td>100-124</td>
<td>35 or greater</td>
<td>1 / 40</td>
</tr>
<tr>
<th>Jotun's Fury Colossal Sword</th>
<td>150-174</td>
<td>40 or greater</td>
<td>1 / 40</td>
</tr>
<tr>
<th>Drdink's Cane of Blind Rage</th>
<td>175-200</td>
<td>45 or greater</td>
<td>1 / 40</td>
</tr>
<tr>
<th>Mrquick's Magical Boots of Swiftness</th>
<td>250-300</td>
<td>48 or greater</td>
<td>1 / 40</td>
</tr>
<tr>
<th>Jeff's Cluehammer of Doom</th>
<td>300-350</td>
<td>52 or greater</td>
<td>1 / 40</td>
</tr>
</table>
<h2>The Hand of God</h2>
<p>As of v3.0, every online user has a (roughly) 1/20 chance per day
of a "Hand of God" affecting them. A HoG can help or hurt your character
by carrying it between 5 and 75 percent towards or away from its next time
to level. The odds are in your favor, however, with an 80% chance to help
your character, and only a 20% chance of your character being smitten.</p>
<p>In addition to occurring randomly, admins may summon the HoG at their
whim.</p>
<a name="critstrike"></a>
<h2>Critical Strike</h2>
<p>As of v2.0.4, if a challenger beats his opponent in battle, he has a
1/35 chance of landing a Critical Strike. If this occurs, his opponent
is penalized time towards his next time to level. This amount is
calculated by the formula:</p>
<p>((random number from 5 to 25) / 100) * OPPONENT'S_NEXT_TIME_TO_LEVEL</p>
<p>Meaning he gains no less than 5% and no more than 25% of his next time
to level.</p>
<h2>Team Battles</h2>
<p>As of v3.0, every online user has (roughly) 1/4 chance per day of
being involved in a 'team battle.' Team battles pit three online
players against three other online players. Each side's items are summed,
and a winner is chosen as in regular battling. If the first group bests
the second group in combat, 20% of the lowest of the three's TTL is
removed from their clocks. If the first group loses, 20% of their lowest
member's TTL is added to their TTL.</p>
<h2>Calamities</h2>
<p>As of v3.0, every online user has a (roughly) 1/8 chance per day of a
calamity occurring to them. A calamity is a bit of extremely bad luck that
either:<br />
a) slows a player 5-12% of their next time to level<br />
b) lowers one of their item's value by 10%
</p>
<h2>Godsends</h2>
<p>As of v3.0, every online user has a (roughly) 1/8 chance per day of a
godsend occurring to them. A godsend is a bit of extremely good luck that
either:<br />
a) accelerates a player 5-12% of their next time to level<br />
b) increases one of their item's value by 10%
</p>
<h2>Quests</h2>
<p>As of v2.3, there are Quests. Four level 40+ users that have been
online for more than ten hours are chosen to represent and assist the
Realm by going on a quest. If all four users make it to the quest's end,
all questers are awarded by removing 25% of their TTL (ie, their TTL at
quest's end). To complete a quest, no user can be penalized until the
quest's end. As of v3.0, there are two kinds of quests: grid-based quests
and time-based quests. Time-based quests last a random time between 12 and
24 hours. Grid-based quests are based on the <a href="#grid">grid
system</a> and do not have a set time to completion. Rather, the questers
must reach certain points on the map for their quest to be complete. If
the quest is not completed, ALL online users are penalized a p15 as
punishment.</p>
<a name="grid"></a>
<h2>Grid System</h2>
<p>As of v3.0, the IRPG has a grid system. The grid can be considered
a 500 x 500 point map on which the players may walk. Every second, each
player has an equal chance to step up, down, or neither, and an equal
chance to step left, right, or neither. If a user encounters another
player, there is a 1/(NUMBER_OF_ONLINE_PLAYERS) chance that they will
battle one another. Normal battling rules apply.</p>
<p>Some quests require that users walk to certain points on the map. In
the spirit of IRPG, of course, the trek is made for you. Your character
will automatically walk in the direction that it is supposed to, although
at a much slower than normal pace (to avoid accidents, of course. you
don't want to fall down and risk a Realm-wide p15!).</p>
<a name="stealing"></a>
<h2>Item Stealing</h2>
<p>As of v3.0, the IRPG has item stealing. After each battle, if the
challenger wins, he has a slightly less than 2% chance of stealing an
item from the challengee. Only items of a higher value are stolen, and
the challenger's old item is given to the challengee in a moment of pity.
</p>
<h2>Credits</h2>
<p>Many thanks to version 3.0's map creators, res0 and Jeb! The game
wouldn't be the same without you.</p>
<p>The IRPG would not be possible without help from a lot of people.
To jwbozzy, yawnwraith, Tosirap, res0, dwyn, Parallax, protomek,
Bert, clavicle, drdink, jeff, rasher, Sticks, Nerje, Asterax,
emad, inkblot(!), schmolli, mikegrb, mumkin, sean, Minhiriath,
and Dan, I give many thanks. Unfortunately, this list has grown too
large to maintain. More user contributions can be seen in the
ChangeLog.
</p>
<h2>Source</h2>
<p><a href="https://gitemall.devemall.int.eu.org/TommySalami/IdleRPG">The new source code</a>,
modified, released and maintained by TommySalami</p>
<p>based on</p>
<p><a href="http://idlerpg.net/">The old source code</a>,
originally written and released in 2004 by jotun, jotun@idlerpg.net, et al.</p>
<?php
include("footer.php");
?>

59
irpg-web/makemap.php Normal file
View File

@@ -0,0 +1,59 @@
<?php
include("config.php");
// use sessions to generate only one map / person / 20s
session_start();
if (isset($_SESSION['time']) && time()-$_SESSION['time'] < 20) {
header("Location: maperror.png");
exit(0);
}
$_SESSION['time']=time();
$map = imageCreate(500,500);
$user = substr($_GET['player'],0,30);
$stringx=$stringy=-1;
$file = file($irpg_db);
unset($file[0]);
foreach ($file as $line) {
list($username,,,,,,,,,,$x,$y) = explode("\t",trim($line));
if ($username == $user) {
$stringx = $x;
$stringy = $y;
break;
}
}
if ($stringx == $stringy && $stringx == -1) {
imageString($map,5,200,245,"NO SUCH USER",imagecolorallocate($map,255,0,0));
}
else {
$width = imageFontWidth(5);
$height = imageFontHeight(5);
if ($x+((strlen($user)+1)*$width) > 500) {
$stringx = $x - ((strlen($user)+1)*$width)-12;
}
if ($y+$height > 500) {
$stringy = $y - ($height/2)-2;
}
$magenta = imageColorAllocate($map,255,0,255);
imageColorTransparent($map,$magenta);
$brown = imagecolorallocate($map, 102, 51, 0);
$parchment = imagecolorallocate($map, 255, 255, 204);
// Avoid drawing a brown dot on a brown area
$rgb = imageColorAt($map, $x, $y);
if ($rgb > 0) { // $rgb is 0 on our parchment-colored areas
$temp = $brown;
$brown = $parchment;
$parchment = $temp;
}
// YOU ARE HERE
imageFilledEllipse($map, $x, $y, 6, 6, $brown);
// background for text
imageFilledRectangle($map,$stringx+6,$stringy-($height/2),$stringx+6+$width*(strlen($user)+1),$stringy+($height/2),$brown);
// text itself
imageString($map,5,$stringx+7+($width/2),$stringy-($height/2)-1,$user,$parchment);
}
header("Content-type: image/png");
imagePNG($map);
imageDestroy($map);
?>

79
irpg-web/makequestmap.php Normal file
View File

@@ -0,0 +1,79 @@
<?php
include("config.php");
// use sessions to generate only one map / person / 20s
session_start();
if (isset($_SESSION['time']) && time()-$_SESSION['time'] < 20) {
header("Location: maperror.png");
exit(0);
}
$_SESSION['time']=time();
$file = fopen($irpg_qfile,"r");
$type=0;
while ($line=fgets($file,1024)) {
$arg = explode(" ",trim($line));
if ($arg[0] == "Y") {
$type = $arg[1];
}
elseif ($arg[0] == "P") {
$p1[0] = $arg[1];
$p1[1] = $arg[2];
$p2[0] = $arg[3];
$p2[1] = $arg[4];
}
elseif ($arg[0] == "S") {
if ($type == 1) $time = $arg[1];
elseif ($type == 2) $stage = $arg[1];
}
elseif ($arg[0] == "P1") {
$player[1]['name'] = $arg[1];
if ($type == 2) {
$player[1]['x'] = $arg[2];
$player[1]['y'] = $arg[3];
}
}
elseif ($arg[0] == "P2") {
$player[2]['name'] = $arg[1];
if ($type == 2) {
$player[2]['x'] = $arg[2];
$player[2]['y'] = $arg[3];
}
}
elseif ($arg[0] == "P3") {
$player[3]['name'] = $arg[1];
if ($type == 2) {
$player[3]['x'] = $arg[2];
$player[3]['y'] = $arg[3];
}
}
elseif ($arg[0] == "P4") {
$player[4]['name'] = $arg[1];
if ($type == 2) {
$player[4]['x'] = $arg[2];
$player[4]['y'] = $arg[3];
}
}
}
if ($type != 2) {
header("Location: maperror.png");
exit(0);
}
$map = imageCreate(500,500);
$magenta = imageColorAllocate($map, 255, 0, 255);
imageColorTransparent($map,$magenta);
$blue = imageColorAllocate($map, 0, 128, 255);
$red = imageColorAllocate($map, 255, 0, 0);
imageFilledEllipse($map, $player[1]['x'], $player[1]['y'], 6, 6, $blue);
imageFilledEllipse($map, $player[2]['x'], $player[2]['y'], 6, 6, $blue);
imageFilledEllipse($map, $player[3]['x'], $player[3]['y'], 6, 6, $blue);
imageFilledEllipse($map, $player[4]['x'], $player[4]['y'], 6, 6, $blue);
if ($stage == 1) imageFilledEllipse($map, $p1[0], $p1[1], 8, 8, $red);
else imageFilledEllipse($map, $p2[0], $p2[1], 9, 9, $red);
header("Content-type: image/png");
imagePNG($map);
imageDestroy($map);
?>

28
irpg-web/makeworldmap.php Normal file
View File

@@ -0,0 +1,28 @@
<?php
include("config.php");
// use sessions to generate only one map / person / 20s
session_start();
if (isset($_SESSION['time']) && time()-$_SESSION['time'] < 20) {
header("Location: maperror.png");
exit(0);
}
$_SESSION['time']=time();
$file = fopen($irpg_db,"r");
fgets($file);
$map = imageCreate(500,500);
$magenta = ImageColorAllocate($map, 255, 0, 255);
$blue = imageColorAllocate($map, 0, 128, 255);
$red = imageColorAllocate($map, 211, 0, 0);
ImageColorTransparent($map, $magenta);
while ($line=fgets($file)) {
list(,,,,,,,,$online,,$x,$y) = explode("\t",trim($line));
if ($online == 1) imageFilledEllipse($map, $x, $y, 3, 3, $blue);
else imageFilledEllipse($map, $x, $y, 3, 3, $red);
}
header("Content-type: image/png");
imagePNG($map);
imageDestroy($map);
?>

BIN
irpg-web/maperror.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
irpg-web/newmap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

34
irpg-web/players.php Normal file
View File

@@ -0,0 +1,34 @@
<?php
include("config.php");
include("commonfunctions.php");
$irpg_page_title = "Players";
$irpg_page_desc = "IdleRPG Players";
include("header.php");
?>
<h1>Players</h1>
<h2>Pick a player to view</h2>
<p class="small">[gray=offline]</p>
<ol>
<?php
$file = file($irpg_db);
unset($file[0]);
usort($file, 'cmp_level_desc');
foreach ($file as $line) {
list($user,,,$level,$class,$secs,,,$online) = explode("\t",trim($line));
$class = htmlentities($class);
$next_level = duration($secs);
echo " <li".(!$online?" class=\"offline\"":"")."><a".
(!$online?" class=\"offline\"":"").
" href=\"playerview.php?player=".urlencode($user).
"\">".htmlentities($user).
"</a>, the level $level $class. Next level in $next_level.</li>\n";
}
?>
</ol>
<p>For a script to view player stats from a terminal, try
<a href="idlerpg-adv.txt">this</a> perl script by
<a href="mailto:daxxar@mental.mine.nu">daxxar</a>.</p>
<p>See player stats in <a href="db.php">table format</a>.</p>
<?php
include("footer.php");
?>

148
irpg-web/playerview.php Normal file
View File

@@ -0,0 +1,148 @@
<?php
include("config.php");
/* Determine if a Player was entered. If not, redirect. */
$_GET['player'] = substr($_GET['player'],0,30);
if ($_GET['player']=="") header('Location: '.$irpg_base_dir.'players.php');
include("commonfunctions.php");
$irpg_page_title = "Player Info: " . htmlentities($_GET['player']);
$irpg_page_desc = "IdleRPG Player Info";
$showmap = $_GET['showmap'];
include("header.php");
echo "<h1>Player Info</h1>";
$file = fopen($irpg_db,"r");
fgets($file,1024); // skip top comment
$found=0;
while ($line=fgets($file,1024)) {
if (substr($line,0,strlen($_GET['player'])+1) == $_GET['player']."\t") {
list($user,,$isadmin,$level,$class,$secs,,$uhost,$online,$idled,
$x,$y,
$pen['mesg'],
$pen['nick'],
$pen['part'],
$pen['kick'],
$pen['quit'],
$pen['quest'],
$pen['logout'],
$created,
$lastlogin,
$item['amulet'],
$item['charm'],
$item['helm'],
$item['boots'],
$item['gloves'],
$item['ring'],
$item['leggings'],
$item['shield'],
$item['tunic'],
$item['weapon'],
$alignment,
) = explode("\t",trim($line));
$found=1;
break;
}
}
if (!$found) echo "<h1>Error</h1><p><b>No such user.</b></p>\n";
else {
$class=htmlentities($class);
/* if we htmlentities($user), then we cannot use links with it. */
echo " <p><b>User:</b> ".htmlentities($user)."<br />\n".
" <b>Class:</b> $class<br />\n".
" <b>Admin?:</b> ".($isadmin?"Yes":"No")."<br />\n".
" <b>Level:</b> $level<br />\n".
" <b>Next level:</b> ".duration($secs)."<br />\n".
" <b>Status:</b> O".($online?"n":"ff")."line<br />\n".
" <b>Host:</b> ".($uhost?$uhost:"Unknown")."<br />\n".
" <b>Account Created:</b> ".date("D M j H:i:s Y",$created)."<br />\n".
" <b>Last login:</b> ".date("D M j H:i:s Y",$lastlogin)."<br />\n".
" <b>Total time idled:</b> ".duration($idled)."<br />\n".
" <b>Current position:</b> [$x,$y]<br />\n".
" <b>Alignment:</b> ".($alignment=='e'?"Evil":($alignment=='n'?"Neutral":"Good"))."<br />\n".
" <b>XML:</b> [<a href=\"xml.php?player=".urlencode($user)."\">link</a>]</p>\n".
" <h2>Map</h2>\n".
" ".($showmap?"<div id=\"map\"><img src=\"makemap.php?player=".urlencode($user)."\"></div>\n\n":"<p><a href=\"?player=".urlencode($user)."&showmap=1\">Show map</a></p>\n\n")."".
" <h2>Items</h2>\n<p>";
ksort($item);
$sum = 0;
foreach ($item as $key => $val) {
$uniquecolor="#be9256";
if ($key == "helm" && substr($val,-1,1) == "a") {
$val = intval($val)." [<font color=\"$uniquecolor\">Mattt's Omniscience Grand Crown</font>]";
}
if ($key == "tunic" && substr($val,-1,1) == "b") {
$val = intval($val)." [<font color=\"$uniquecolor\">Res0's Protectorate Plate Mail</font>]";
}
if ($key == "amulet" && substr($val,-1,1) == "c") {
$val = intval($val)." [<font color=\"$uniquecolor\">Dwyn's Storm Magic Amulet</font>]";
}
if ($key == "weapon" && substr($val,-1,1) == "d") {
$val = intval($val)." [<font color=\"$uniquecolor\">Jotun's Fury Colossal Sword</font>]";
}
if ($key == "weapon" && substr($val,-1,1) == "e") {
$val = intval($val)." [<font color=\"$uniquecolor\">Drdink's Cane of Blind Rage</font>]";
}
if ($key == "boots" && substr($val,-1,1) == "f") {
$val = intval($val)." [<font color=\"$uniquecolor\">Mrquick's Magical Boots of Swiftness</font>]";
}
if ($key == "weapon" && substr($val,-1,1) == "g") {
$val = intval($val)." [<font color=\"$uniquecolor\">Jeff's Cluehammer of Doom</font>]";
}
if ($key == "ring" && substr($val,-1,1) == "h") {
$val = intval($val)." [<font color=\"$uniquecolor\">Juliet's Glorious Ring of Sparkliness</font>]";
}
echo " $key: $val<br />\n";
$sum += $val;
}
echo " <br />\n sum: $sum<br />\n".
" </p>".
" <h2>Penalties</h2>\n".
" <p>\n";
ksort($pen);
$sum = 0;
foreach ($pen as $key => $val) {
echo " $key: ".duration($val)."<br />\n";
$sum += $val;
}
echo " <br />\n total: ".duration($sum)."</p>\n";
$file = fopen($irpg_mod,"r");
$temp = array();
while ($line=fgets($file,1024)) {
if (strstr($line," ".$_GET['player']." ") ||
strstr($line," ".$_GET['player'].", ") ||
substr($line,0,strlen($_GET['player'])+1) ==
$_GET['player']." " ||
substr($line,0,strlen($_GET['player'])+3) ==
$_GET['player']."'s ") {
array_push($temp,$line);
}
}
fclose($file);
if (!is_null($temp) && count($temp)) {
echo "<h2>";
echo $_GET['allmods']!=1?"Recent ":"";
echo "Character Modifiers</h2><p>";
if ($_GET['allmods'] == 1 || count($temp) < 6) {
foreach ($temp as $line) {
$line=htmlentities(trim($line));
echo " $line<br />\n";
}
echo " <br />\n";
}
else {
end($temp);
for ($i=0;$i<4;++$i) prev($temp);
for ($line=trim(current($temp));$line;$line=trim(next($temp))) {
$line=htmlentities(trim($line));
echo " $line<br />\n";
}
}
}
if ($_GET['allmods'] != 1 && count($temp) > 5) {
echo " <br />\n".
" [<a href=\"".$_SERVER['PHP_SELF']."?player=".urlencode($user)."&amp;allmods=1\">View all Character Modifiers</a> (".count($temp).")]\n".
" </p>\n";
}
}
include("footer.php");
?>

119
irpg-web/quest.php Normal file
View File

@@ -0,0 +1,119 @@
<?php
include("config.php");
include("commonfunctions.php");
$irpg_page_title = "Quest Info";
$irpg_page_desc = "IdleRPG Quest Info";
include("header.php");
echo " <h1>Current Quest</h1>\n";
$file = fopen($irpg_qfile,"r");
$type=0;
while ($line=fgets($file,1024)) {
$arg = explode(" ",trim($line));
if ($arg[0] == "T") {
unset($arg[0]);
$text = implode(" ",$arg);
}
elseif ($arg[0] == "Y") {
$type = $arg[1];
}
elseif ($arg[0] == "P") {
$p1[0] = $arg[1];
$p1[1] = $arg[2];
$p2[0] = $arg[3];
$p2[1] = $arg[4];
}
elseif ($arg[0] == "S") {
if ($type == 1) $time = $arg[1];
elseif ($type == 2) $stage = $arg[1];
}
elseif ($arg[0] == "P1") {
$player[1]['name'] = $arg[1];
if ($type == 2) {
$player[1]['x'] = $arg[2];
$player[1]['y'] = $arg[3];
}
}
elseif ($arg[0] == "P2") {
$player[2]['name'] = $arg[1];
if ($type == 2) {
$player[2]['x'] = $arg[2];
$player[2]['y'] = $arg[3];
}
}
elseif ($arg[0] == "P3") {
$player[3]['name'] = $arg[1];
if ($type == 2) {
$player[3]['x'] = $arg[2];
$player[3]['y'] = $arg[3];
}
}
elseif ($arg[0] == "P4") {
$player[4]['name'] = $arg[1];
if ($type == 2) {
$player[4]['x'] = $arg[2];
$player[4]['y'] = $arg[3];
}
}
}
if (!$type) {
echo " <p>Sorry, there is no active quest.</p>\n";
}
else {
echo " <p><b>Quest:</b> To $text.</p>\n";
if ($type == 1) {
echo " <p><b>Time to completion:</b> ".duration($time-time()).
"</p>\n";
}
elseif ($type == 2) {
if ($stage == 1) {
echo " <p><b>Current goal:</b> [$p1[0],$p1[1]]</p>\n";
}
else {
echo " <p><b>Current goal:</b> [$p2[0],$p2[1]]</p>>\n";
}
}
echo " <p><b>Participant 1:</b> <a href=\"playerview.php?player=".
urlencode($player[1]['name'])."\">".htmlentities($player[1]['name']).
"</a><br />\n";
if ($type == 2) {
echo " <b>Position:</b> [".$player[1]['x'].",".$player[1]['y']."]</p>\n";
}
else echo "<br />\n";
echo " <p><b>Participant 2:</b> <a href=\"playerview.php?player=".
urlencode($player[2]['name'])."\">".htmlentities($player[2]['name']).
"</a><br />\n";
if ($type == 2) {
echo " <b>Position:</b> [".$player[2]['x'].",".$player[2]['y']."]</p>\n";
}
else echo "<br />\n";
echo " <p><b>Participant 3:</b> <a href=\"playerview.php?player=".
urlencode($player[3]['name'])."\">".htmlentities($player[3]['name']).
"</a><br />\n";
if ($type == 2) {
echo " <b>Position:</b> [".$player[3]['x'].",".$player[3]['y']."]</p>\n";
}
else echo "<br />\n";
echo " <p><b>Participant 4:</b> <a href=\"playerview.php?player=".
urlencode($player[4]['name'])."\">".htmlentities($player[4]['name']).
"</a><br />\n";
if ($type == 2) {
echo " <b>Position:</b> [".$player[4]['x'].",".$player[4]['y']."]</p>\n".
" <h2>Quest Map:</h2>\n".
" <p>[Questers are shown in blue, current goal in red]</p>\n".
" <div id=\"map\"><img src=\"makequestmap.php\" alt=\"Idle RPG Quest Map\" usemap=\"#quest\" border=\"0\" /></div>\n".
" <map id=\"quest\" name=\"quest\">\n".
" <area shape=\"circle\" coords=\"".$player[1]['x'].",".$player[1]['y'].",6\" alt=\"".htmlentities($player[1]['name']).
"\" href=\"playerview.php?player=".urlencode($player[1]['name'])."\" title=\"".htmlentities($player[1]['name'])."\" />\n".
" <area shape=\"circle\" coords=\"".$player[2]['x'].",".$player[2]['y'].",6\" alt=\"".htmlentities($player[2]['name']).
"\" href=\"playerview.php?player=".urlencode($player[2]['name'])."\" title=\"".htmlentities($player[2]['name'])."\" />\n".
" <area shape=\"circle\" coords=\"".$player[3]['x'].",".$player[3]['y'].",6\" alt=\"".htmlentities($player[3]['name']).
"\" href=\"playerview.php?player=".urlencode($player[3]['name'])."\" title=\"".htmlentities($player[3]['name'])."\" />\n".
" <area shape=\"circle\" coords=\"".$player[4]['x'].",".$player[4]['y'].",6\" alt=\"".htmlentities($player[4]['name']).
"\" href=\"playerview.php?player=".urlencode($player[4]['name'])."\" title=\"".htmlentities($player[4]['name'])."\" />\n".
" </map>\n";
}
else echo "<br />\n";
}
echo " <br />\n";
include("footer.php");
?>

117
irpg-web/rw.css Normal file
View File

@@ -0,0 +1,117 @@
body {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
background-color: #202020;
background-image: url(wall.gif);
color: #c0c0c0;
margin: 10px;
text-align: justify;
}
h1 { margin-bottom: 0px; margin-top: 0px; }
h2 { margin-bottom: 0px; }
p.small { margin: 0px; font-size: smaller; }
a { text-decoration: none; color: #FF4040; }
a:hover { text-decoration: underline; color: #FF8080; }
div.head {
border: 1px solid #c0c0c0;
text-align: left;
width: 100%;
margin-bottom: 10px;
background: #151515;
}
div.menu {
width: 120px;
position: relative;
float: left;
border: 1px solid #c0c0c0;
background: #151515;
}
div#menu a.home { color: #c0c0c0; background: #202020; border: 1px solid #c0c0c0; }
div#menu a.home:hover { background: #202020; border: 1px solid #c0c0c0; }
div#menu a {
text-align: center;
width: 118px;
margin: 0px;
display: block;
border: 1px solid #c0c0c0
}
div#menu a:hover { border: 1px solid #c0c0c0; background: #202020; text-decoration: none; }
div.content {
border: 1px solid #c0c0c0;
margin-left: 130px;
margin-top: 0px;
padding: 10px;
background: #202020;
}
div.footer {
border: 1px solid #c0c0c0;
margin-left: 130px;
margin-top: 10px;
padding: 10px;
background: #202020;
text-align: center
}
table.uniques {
border: 1px solid #c0c0c0;
padding: 5px;
text-align: left;
}
table.uniques td {
padding-left: 10px;
}
table.penalty {
border: 1px solid #c0c0c0;
padding: 5px;
text-align: left;
}
table.penalty th {
text-align: right;
}
table.penalty td {
}
/* Styles for the userlist */
li.online { font-weight: bold; }
li.offline { color: #c0c0c0; }
a.offline { color: #707070; }
#map {
width: 500px;
height: 500px;
background-image: url(newmap.png);
}
table.forum {
border: 1px solid #c0c0c0;
table-layout: fixed;
overflow: auto;
}
table.forum td,tr,caption,thead,tfoot,th {
padding-left: 10px;
padding-right: 10px;
}
.tdblue { background-color: #ffffdf; }
.tdgray { background-color: #eeeee0; }
.tdred {
border: 1px solid red;
background-color: #202020;
}
.smallest {
font-size: 11px;
}
table th {
white-space: nowrap;
}

BIN
irpg-web/tablegrad.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

BIN
irpg-web/up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 B

BIN
irpg-web/wall.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

30
irpg-web/worldmap.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
include("config.php");
$irpg_page_title = "World Map";
$irpg_page_desc = "IdleRPG World Map";
include("header.php");
?>
<h1>World Map</h1>
<p>[offline users are red, online users are blue]</p>
<div id="map">
<img src="makeworldmap.php" alt="IdleRPG World Map" title="IdleRPG World Map" usemap="#world" border="0" />
<map id="world" name="world">
<?php
$file = fopen($irpg_db,"r");
fgets($file);
while($location=fgets($file)) {
list($who,,,,,,,,,,$x,$y) = explode("\t",trim($location));
echo " <area shape=\"circle\" coords=\"".$x.",".$y.",4\" alt=\"".htmlentities($who).
"\" href=\"playerview.php?player=".urlencode($who)."\" title=\"".htmlentities($who)."\" />\n";
}
fclose($file);
?>
</map>
</div>
<?php
include("footer.php");
?>

76
irpg-web/xml.php Normal file
View File

@@ -0,0 +1,76 @@
<?php
header("Content-Type: text/xml");
header("Pragma: no-cache");
include("config.php");
/* Determine if a Player was entered. If not, redirect. */
$_GET['player'] = substr($_GET['player'],0,30);
if ($_GET['player']=="") header('Location: '.$irpg_base_dir.'players.php');
$file = fopen($irpg_db,"r");
fgets($file,1024); // skip top comment
while ($line=fgets($file,1024)) {
if (substr($line,0,strlen($_GET['player'])+1) == $_GET['player']."\t") {
list($user,,$isadmin,$level,$class,$secs,,$uhost,$online,$idled,
$x,$y,
$pen['mesg'],
$pen['nick'],
$pen['part'],
$pen['kick'],
$pen['quit'],
$pen['quest'],
$pen['logout'],
$created,
$lastlogin,
$item['amulet'],
$item['charm'],
$item['helm'],
$item['boots'],
$item['gloves'],
$item['ring'],
$item['leggings'],
$item['shield'],
$item['tunic'],
$item['weapon'],
$alignment,
) = explode("\t",trim($line));
break;
}
}
fclose($file);
echo "<?xml version=\"1.0\"?>";
?>
<player>
<username><?php echo $user; ?></username>
<isadmin><?php echo $isadmin; ?></isadmin>
<level><?php echo $level; ?></level>
<class><?php echo $class; ?></class>
<ttl><?php echo $secs; ?></ttl>
<userhost><?php echo $uhost; ?></userhost>
<online><?php echo $online; ?></online>
<totalidled><?php echo $idled; ?></totalidled>
<xpos><?php echo $x; ?></xpos>
<ypos><?php echo $y; ?></ypos>
<alignment><?php echo $alignment; ?></alignment>
<penalties>
<?php
$sum=0;
foreach ($pen as $key => $val) {
echo " <$key>$val</$key>\n";
$sum += $val;
}
echo " <total>$sum</total>\n";
?>
</penalties>
<items>
<?php
$sum=0;
foreach ($item as $key => $val) {
echo " <$key>$val</$key>\n";
$sum += $val;
}
echo " <total>$sum</total>\n";
?>
</items>
</player>