--- /dev/null
+use utf8;
+
+'' => {
+ desc => 'normal gameplay',
+
+ 'b' => ["step left down", 'pm', 'numpad 1'],
+ 'j' => ["step down", 'pm', 'numpad 2'],
+ 'n' => ["step right down", 'pm', 'numpad 3'],
+ 'h' => ["step left", 'pm', 'numpad 4'],
+ 'l' => ["step right", 'pm', 'numpad 6'],
+ 'y' => ["step left up", 'pm', 'numpad 7'],
+ 'k' => ["step up", 'pm', 'numpad 8'],
+ 'u' => ["step right up", 'pm', 'numpad 9'],
+
+ 'B' => ["go left down", 'po', 'shift numpad 1'],
+ 'J' => ["go down", 'po', 'shift numpad 2'],
+ 'N' => ["go right down", 'po', 'shift numpad 3'],
+ 'H' => ["go left", 'po', 'shift numpad 4'],
+ 'L' => ["go right", 'po', 'shift numpad 6'],
+ 'Y' => ["go left up", 'po', 'shift numpad 7'],
+ 'K' => ["go up", 'po', 'shift numpad 8'],
+ 'U' => ["go right up", 'po', 'shift numpad 9'],
+
+ '^b'=> ["run left down", 'po', 'numpad 1'],
+ '^j'=> ["run down", 'po', 'numpad 2'],
+ '^n'=> ["run right down", 'po', 'numpad 3'],
+ '^h'=> ["run left", 'po', 'numpad 4'],
+ '^l'=> ["run right", 'po', 'numpad 6'],
+ '^y'=> ["run left up", 'po', 'numpad 7'],
+ '^k'=> ["run up", 'po', 'numpad 8'],
+ '^u'=> ["run right up", 'po', 'numpad 9'],
+
+ 'g' => ["run until interest", 'po argm'],
+ 'm' => ["move blind", 'po argm', 'no pickup'],
+ 'G' => ["g any$sign{_}where", 'po argm', "follow branches"],
+
+ '?' => ["help menu", 'mv mode?'], #help
+ '+?'=> ["more help", 'mv'],
+ '/' => ["explain symbol", 'mi arg mode/'], #whatis
+ '&' => ["explain comm$sign{_}and", 'mi arg'],
+ '<' => ["climb up a ladder", 'pm'], #up
+ '>' => ["climb down a ladder", 'pm'], #down
+ '.' => ["rest (noop)", 'pm'], #rest
+ '_' => ["travel to", 'po argM'], #travel
+
+ '+2'=> ["two$sign{_}weapon toggle", 'co'], #twoweapon
+ 'a' => ["apply tool", 'co argi'], #apply
+ 'A' => ["remove all armor", 'co'], #armor
+ '^a'=> ["redo comm$sign{_}and", 'co', 'Again'], #again
+ '+a'=> ["adjust inv$sign{_}ent$sign{_}ory", 'mi'], #adjust
+ 'c' => ["close door", 'co argm'], #close
+ 'C' => ["call monster", 'co arg'], #call
+ '+c'=> ["chat", 'co arg'], #chat
+ 'd' => ["drop item", 'co argi'], #drop
+ 'D' => ["Drop items", 'co arg'], #Drop
+ '^d'=> ["kick", 'co argm'], #kick
+ '+d'=> ["dip", 'co argi'], #dip
+ 'e' => ["eat food", 'co argi'], #eat
+ 'E' => ["engrave", 'co argi'], #engrave
+ '+e'=> ["weapon skills", 'co', 'Enhance'], #enhance
+ 'f' => ["fire quiver", 'co argm'], #fire
+ 'F' => ["fight monster", 'co argm'], #fight
+ '+f'=> ["force lock", 'co'], #force
+ 'i' => ["invent$sign{_}ory", 'mo'], #invent
+ 'I' => ["invent$sign{_}ory part", 'mo arg'], #Invent
+ '+i'=> ["invoke object", 'co argi'], #invoke
+ '+j'=> ["jump", 'co'], #jump
+ '+l'=> ["loot", 'co'], #loot
+ '+m'=> ["monster ability", 'co'], #monster
+ '+n'=> ["name item$sign{_}(s)", 'mo arg'], #name
+ 'o' => ["open door", 'co argm'], #open
+ 'O' => ["options", 'mv modeO'], #options
+ '+o'=> ["offer sacrifice", 'co argi'], #offer
+ 'p' => ["pay bill", 'co'], #pay
+ 'P' => ["put on", 'co argi'], #puton
+ '^p'=> ["repeat message", 'mi'], #prevmsg
+ '+p'=> ["pray", 'co arg'], #pray
+ 'q' => ["drink", 'co argi', 'Quaff'], #quaff
+ 'Q' => ["quiver ammo", 'co argi'], #quiver
+ '+q'=> ["exit game", 'mi', 'Quit'], #quit
+ 'r' => ["read scroll", 'co argi'], #read
+ 'R' => ["put off", 'co argi', 'Remove accessory'], #remove
+ '^r'=> ["redraw", 'mi'], #redraw
+ '+r'=> ["rub object", 'co argi'], #rub
+ 's' => ["search secrets", 'co'], #search
+ 'S' => ["save game", 'mi'], #save
+ '+s'=> ["sit down", 'co'], #sit
+ 't' => ["throw$sign{_}/shoot", 'co argm'], #throw
+ 'T' => ["remove armor", 'co argi'], #takeoff
+ '^t'=> ["teleport", 'co'], #'port
+ '+t'=> ["turn undead", 'co'], #turn
+ '+u'=> ["untrap", 'co'], #untrap
+ 'v' => ["version", 'mi'],
+ 'V' => ["verbose version", 'mi'], #history
+ '+v'=> ["compile details", 'mi'], #version
+ 'w' => ["wield weapon", 'co argi'], #wield
+ 'W' => ["wear armor", 'co argi'], #wear
+ '+w'=> ["wipe face", 'co'], #wipe
+ 'x' => ["swap weapons", 'co', 'Xchange'], #xchange
+ 'X' => ["explore mode", 'mi'], #explore
+ '^x'=> ["show stats", 'mi'], #show
+ 'z' => ["zap wand", 'co argm'], #zap
+ 'Z' => ["cast spell", 'co argi'], #Zap
+ '^z'=> ["suspend game", 'mi'], #suspend
+
+ ':' => ["look here", 'mi'], #look
+ ';' => ["look else$sign{_}where", 'mi argM'], #farlook
+ ',' => ["pick up", 'co'], #pickup
+ '@' => ["toggle pick$sign{_}up", 'mi'],
+ '^' => ["show trap", 'mi argm'], #trap_id
+ ')' => ["show weapon", 'mo'],
+ '[' => ["show armor", 'mo'],
+ '=' => ["show rings", 'mo'],
+ '"' => ["show amulet", 'mo'],
+ '(' => ["show tools", 'mo'],
+ '*' => ["show equipment", 'mo'],
+ '$' => ["count gold", 'mi'], #gold
+ '+' => ["list spells", 'mo'], #spells
+ '\\'=> ["discovered objects", 'mo'], #known
+ '!' => ["shell escape", 'mi'], #sh
+ '#' => ["more comm$sign{_}ands", 'mv'],
+},
+
--- /dev/null
+<:
+use utf8;
+use strict;
+use warnings;
+no warnings 'qw'; # you know what you doing
+no warnings 'uninitialized'; # save some useless checks for more legible code
+
+our $VERSION = '1.0';
+
+our $ascii = 0;
+if (exists $get{ascii}) {
+ $ascii = $get{ascii} ne '0'; # manual override
+} elsif (defined $ENV{HTTP_ACCEPT_CHARSET}) {
+ $ascii = 1;
+ for (split q{,}, $ENV{HTTP_ACCEPT_CHARSET}) {
+ $ascii = 0, last if $_ eq '*' or m{utf-?8}i;
+ }
+}
+
+my $charset = $ascii ? 'us-ascii' : 'utf-8';
+my $ctype = "text/html; charset=$charset";
+$header{content_type} = $ctype;
+
+:><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+<head>
+<title>nethack cheat sheet</title>
+<meta http-equiv="content-type" content="<:= $ctype :>">
+<link rel="stylesheet" type="text/css" media="all" href="base.css">
+<!--[if lte IE 6]><style> .help dl.legend dt {margin:0 0 1px} </style><![endif]-->
+<!--[if lte IE 7]><style> .help dl.legend dd {float:none} </style><![endif]--><:
+ my %styles = map {$_ => $_} qw(dark circus mono terse);
+ our $style = exists $get{style} && $styles{$get{style}} || 'light';
+ printf(qq{\n<link rel="%s" type="text/css" media="all" href="%s" title="%s">},
+ $_ eq $style ? 'stylesheet' : 'alternate stylesheet', "$_.css", $_
+ ) for keys %styles;
+
+ our $showkeys = exists $get{keys} && $get{keys} ne '0';
+ print "\n<style> .no {visibility:hidden} </style>" unless $showkeys;
+ print "\n<style> .no, .alias {opacity:.5} </style>"
+ if $showkeys and $get{keys} eq 'ghost';
+:>
+
+<script><!--
+function setmode(classname) {
+ // set style for each #rows>li>ul>li to display:none unless it matches classname
+ var showclass = classname ? ' '+classname+'(?!\\w)' : '^$';
+ var parentskip = /^keys/;
+ var row = document.getElementById('rows').firstChild;
+ do {
+ if (row.tagName == 'LI' && row.firstChild.tagName == 'UL'
+ && !row.firstChild.className.match(parentskip)) {
+ var el = row.firstChild.firstChild;
+ if (el) do {
+ if (el.tagName == 'LI') {
+ el.style.display = el.className.match(showclass) ? 'block' : 'none';
+ }
+ } while (el = el.nextSibling);
+ }
+ } while (row = row.nextSibling);
+
+ // update H2 to reflect the first part of a currently active (but hidden) H3
+ var h3s = document.getElementsByTagName('H3');
+ for (var i = 0; i < h3s.length; i++) {
+ if (h3s[i].parentNode.style.display != 'block') continue;
+ document.getElementsByTagName('H2')[0].innerHTML = h3s[i].firstChild.data;
+ }
+} // setmode
+//--></script>
+
+<body>
+
+<h1>NetHack cheat sheet</h1>
+
+<h2>normal gameplay</h2>
+
+<ul id="rows">
+
+<li class="row">
+ <ul class="keys omni">
+ <li class="mo" onclick="setmode()"><b>Esc</b>
+ <!-- not as static anymore, but never bothered; just see ^[ -->
+ </ul>
+</li>
+
+<:
+our %sign = (
+ arg => $ascii ? '.' : '·', # described as 'dot'
+ argi => $ascii ? ':' : ':',
+ motion => $ascii ? '|' : '↕',
+ alias => $ascii ? 'see: ' : '»',
+ up => $ascii ? 'up' : '▲',
+ right => $ascii ? 'right' : '▶',
+ down => $ascii ? 'down' : '▼',
+ left => $ascii ? 'left' : '◀',
+ sep => $ascii ? '*' : '•',
+ _ => exists $get{ascii} && !$ascii ? "\x{200b}" : '<wbr>',
+ # use the correct ZWNJ only when unicode is forced on
+ # default to use unofficial html for best support
+);
+
+use Shiar_Sheet::Keyboard;
+my $keys = Shiar_Sheet::Keyboard->new({do 'nethack.inc.pl'});
+$keys->map($get{map}) or undef $get{map};
+$keys->print_rows($get{static});
+:>
+</ul>
+
+<hr>
+
+<div class="help">
+ <div class="left">
+ <dl class="legend legend-types">
+ <dt class="ci">
+ <dd>
+ <dt class="pm">direction
+ <dd>Direction to move to or target a command (<:= $sign{motion} :>).
+ <dt class="po">move
+ <dd>Other character movement.
+ <dt class="co">act
+ <dd>Direct action command: takes a turn.
+ <dt class="mi">info
+ <dd>Informational command: shows/does something without ending the turn.
+ <dt class="mo">invertory
+ <dd>Display invertory menu.
+ <dt class="mv">menu
+ <dd>Enters some other menu.
+ <dt class="me">
+ <dd>
+ </dl>
+ </div>
+
+ <div class="right">
+ <dl class="legend legend-options">
+ <dt>key<:= $sign{arg} :>
+ <dd>Commands with a dot need at least one argument afterwards.
+ <dt>key<:= $sign{motion} :>
+ <dd>Requires a direction afterwards.
+ <dt>key<:= $sign{argi} :>
+ <dd>Asks for an inventory item.
+ </dl>
+
+ <ul class="legend legend-set">
+ <li>keyboard <strong>map</strong> is
+ <:= $get{map} ? 'set to ' : '' :><em><:= $keys->{map} :></em>
+ <li><strong>ascii</strong> mode is
+ <:= exists $get{ascii} && 'forced ' :><em><:=
+ $ascii ? 'on' : 'off' :></em>
+ <li><strong>keys</strong> are
+ <em><:= $showkeys ? 'always shown' : 'hidden if unassigned' :></em><:=
+ !exists $get{keys} && ' by default' :>
+ <li>default <strong>style</strong> is
+ <:= defined $get{style} && 'set to ' :><em><:= $style :></em>
+ </ul>
+ </div>
+</div>
+
+<p class="footer">
+ <a href="http://sheet.shiar.nl/nethack">sheet.shiar.nl<strong>/nethack</strong></a>
+ <a href="git://dev.shiar.net/vi-cheat"><:= "v$VERSION" :></a>
+ created by Shiar <:= $sign{sep} :>
+ <a title="Licensed under the GNU Affero General Public License, version 3"
+ href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">AGPLv3</a> <:= $sign{sep} :>
+ last update <:
+ use Time::Format qw(time_format);
+ print time_format('yyyy-mm-dd', (stat 'nethack.inc.pl')[9]);
+ :>
+</p>
+
+</html>