-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathNostromo.html
177 lines (176 loc) · 8.23 KB
/
Nostromo.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Nostromo</title>
<style type="text/css">
html, body {
padding: 0;
}
html {
height: 100%;
margin: 0;
background-color: #CCC;
}
body {
min-height: 100%;
margin: 10px auto;
font-family: verdana, sans-serif;
font-size: 75%;
max-width: 780px;
background-color: white;
border: 10px solid #369;
}
#banner {
background-color: #369;
color: white;
text-align: center;
}
#banner * {
color: white;
margin: 0;
}
#banner h1 {
padding: 1em 0;
}
#banner p {
padding-bottom: 2em;
}
#content {
padding: 0.5em 2em;
}
.keys {
list-style: none;
margin-left: 0;
padding-left: 0;
}
.keys li {
font-weight: bold;
line-height: 24px;
}
.keys li ul li {
font-weight: normal;
}
.key {
color: white;
background-color: #333;
border: 2px outset #666;
padding: 0 2px;
line-height: 20px;
font-size: 9px;
text-transform: uppercase;
font-weight: bold;
}
.key.blue {
background-color: #039;
border-color: #03C;
}
.key.green {
background-color: #093;
border-color: #0C3;
}
.key.yellow {
background-color: #FC3;
border-color: #CC6;
text-transform: none;
text-shadow: 0 0 1px #330;
}
.key em {
text-transform: none;
}
</style>
</head>
<body>
<div id="banner">
<h1>Nostromo</h1>
<p>A project by <a href="http://benryves.com/">Ben Ryves</a> for <a href="http://maxcoderz.org/">MaxCoderz</a>.</p>
</div>
<div id="content">
<h2>Demo 7</h2>
<p>This is an experimental 3D engine for the TI-83 and TI-83+ graphical calculators.</p>
<p>
As it is an experiment it is not desperately useful, and it is likely to contain bugs that may crash your calculator.
<strong>Please back up any important files before running this program.</strong>
</p>
<p>
Two binaries are provided; <em>Nostromo.8xp</em> (for the TI-83+) and <em>Nostromo.83p</em> (for the TI-83).
The TI-83 binary requires an Ion-compatible shell. The TI-83+ binary requires a MirageOS-compatible shell.
</p>
<p>Source code is not currently provided as it is currently too messy and buggy to be of use.</p>
<h2>Usage</h2>
<p>Select the program from the list in your shell of choice and run it. The following keys can be used to control the demo:</p>
<ul class="keys">
<li>General
<ul>
<li><strong class="key">Clear</strong> Exit.</li>
</ul>
</li>
<li>Movement
<ul>
<li><strong class="key blue">▲</strong> / <strong class="key blue">▼</strong> Move forwards/backwards.</li>
<li><strong class="key blue">Trace</strong> / <strong class="key blue">Graph</strong> Strafe left/right.</li>
<li><strong class="key">Mode</strong> / <strong class="key">X,T,Θ,<em>n</em></strong> Move up/down ("fly mode" only).</li>
</ul>
</li>
<li>Looking
<ul>
<li><strong class="key blue">◀</strong> / <strong class="key blue">▶</strong> Look left/right.</li>
<li><strong class="key">Del</strong> / <strong class="key">Stat</strong> Look up/down.</li>
</ul>
</li>
<li>Interaction
<ul>
<li><strong class="key green">Alpha</strong> Open/close doors.</li>
</ul>
</li>
<li>Options
<ul>
<li><strong class="key blue">Y=</strong> Show/hide the options menu.</li>
</ul>
</li>
</ul>
<h2>Options menu</h2>
<p>
Press <strong class="key blue">Y=</strong> to show or hide the options menu.
Select an option from the menu with the <strong class="key blue">▲</strong> and <strong class="key blue">▼</strong> keys.
</p>
<p>Pressing <strong class="key blue">Enter</strong> or <strong class="key yellow">2nd</strong> will change the highlighted option.</p>
<ul>
<li><strong>Show FPS counter</strong> — When enabled, this displays the number of frames rendered each second in the bottom left of the screen.</li>
<li><strong>CPU speed</strong> — Toggle between 6MHz and 15MHz on supported calculators (the regular TI-83+ and TI-83 are limited to 6MHz operation only).</li>
<li><strong>Fly mode</strong> — Enabling this mode allows you to freely move the camera up and down rather than walking around on the floor.</li>
<li><strong>Collision detection</strong> — Disabling this allows you to walk through walls.</li>
<li><strong>Render objects</strong> — When disabled, sprite objects are not drawn.</li>
<li><strong>View statistics</strong> — Shows the camera position, angle, how many BSP nodes were visited, how many sub-sectors were drawn and how many attempted/successful walls were drawn.</li>
</ul>
<h2>Known issues</h2>
<ul>
<li>Performance is not especially good at the moment. Looking across the large room with the pit in the middle slows the framerate to a crawl owing to the sheer number of subsectors and lines being handled.</li>
<li>Some pixels are not rendered when they should be. This is especially noticeable near the ends of steeply sloping wall edges.</li>
<li>When you are very close to the edge of a wall it may get projected incorrectly (integer overflow) and you will see either a vertical line flash into view then out again or a region of the screen will appear blank.</li>
<li>In "fly mode" you can fly above the ceiling and below the floor.</li>
<li>If the camera is moved into a "solid" region it will be instantly pushed out into free space when near a wall. This can be triggered in normal usage (without disabling collision detection or enabling fly mode) by standing under an open door then closing it; you'll be forced into the room when the bottom edge of the door moves below your head height.</li>
<li>Collision detection is not properly handled around the very ends of walls, which may cause a sudden jump in player position when you "slide" around a corner.</li>
<li>The current floor height is calculated based on the point directly under the centre of the player and not taking the player's radius into consideration. This can cause an unnatural jump when you slowly walk off the edge of a raised portion of the level.</li>
<li>If the frame rate drops low enough it is possible to walk through walls. This is down to the way movement is scaled by frame time; the longer a frame takes to render, the further you move during that frame. If the frame rate drops low enough you move fast enough to outwit the collision detection routines.</li>
<li>Moving sectors are not reset when you restart the level. As an example, lower the platform in the middle of the map then exit and restart the program. When you walk to it you will notice that it is still lowered.</li>
</ul>
<p>If you would like to report an issue, please include the camera position and viewing angle in your report (accessible from the "View statistics" menu option).</p>
<h2>Map</h2>
<p>
The demo world is based on parts of E2M7 (Spawning Vats) from <em>DOOM</em>.
I chose this level as it has some interesting architecture without being too demanding as well as for historical reasons; as far as I am aware it was one of the first levels created for <em>DOOM</em> that appeared in the final game.
</p>
<p style="text-align: center;"><img src="Map.png" width="600" height="420" alt="Map of the demo world" /></p>
<p>
The lines indicate walls. Each wall connects two vertices, indicated by the smaller black blobs.
Some walls are split into multiple segments; this is either a by-product of the need to break the level into convex sub-sectors for rendering purposes or to avoid a limitation with the clipping routines (long walls viewed at a steep angle can be clipped incorrectly).
</p>
<p>
The larger blue blobs indicate "things" — objects represented by a sprite in the world.
The single large red blob indicates the player's starting position.
</p>
</div>
</body>
</html>