kettek2/wiki/games/newsboy/index.html

300 lines
12 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Newsboy</title>
<style type="text/css">/*<![CDATA[*/
@import "scrollr.css";
/*]]>*/</style>
<style type="text/css">
@font-face {
font-family: "Anonymous Pro";
src: url("Anonymous_Pro.eot"), url("Anonymous_Pro.eot?#iefix") format("embedded-opentype"), local("Anonymous_Pro.ttf"), url("Anonymous_Pro.ttf") format("truetype");
}
@font-face {
font-family: "watchtv";
src: url("watchtv.eot"), url("watchfont.eot?#iefix") format("embedded-opentype"), local("watchtv.ttf"), url("watchtv.ttf") format("truetype");
}
h1 {
font-family: "watchtv";
font-size:64px;
margin: 0;
clear: none;
display: inline;
color: #888;
}
h1:hover {
color: #CCC;
}
h2 {
font-family: "watchtv";
}
h3 {
font-family: "Anonymous Pro";
font-size: 16px;
}
a {
color: #66AAAA;
font-family: "Anonymous Pro";
}
a:visited {
color: #699;
}
a:hover {
color: #CFF;
}
p {
padding-left:1em;
}
body {
padding-top: 64px;
font-family: "Anonymous Pro";
font-size:14pt;
background-color: #000;
color: #AAA;
text-align: left;
}
#display {
background-color: #000;
text-align: center;
}
#display img {
/* fluff */
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
-moz-box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
}
.swappr_loader {
position: absolute;
color: #fff;
text-shadow: #000 0px 0px 4px;
bottom:2em;
width:128px;
/* center it */
left:50%;
margin-left:-64px;
}
.scrollr {
text-align: center;
}
.scrollr div {
text-align: center;
}
#menu {
height: 64px;
text-align:center;
position:fixed;
top:0px;
left:0px;
width: 100%;
z-index: 100;
background-color: #022;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
-moz-box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
padding-bottom:16px;
}
#menu_left {
display: inline;
}
#menu_right {
display: inline;
}
.hash {
margin-bottom:96px;
}
#latest_dl {
background-color: #022;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
-moz-box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.6);
width: 512px;
height: 96px;
padding: 8px;
text-align: center;
}
#latest_dl div {
text-align: left;
}
#latest_dl h3 {
padding:0;
margin: 0;
}
</style>
<script type="text/javascript" src="swappr.js"></script>
<script type="text/javascript">
swappr.Init({
time: 250,
display: "display",
from: "scrollr"
});
</script>
<script type="text/javascript" src="scrollr.js"></script>
</head>
<body>
<div id="menu">
<div id="menu_left">
<a href="#plot">plot</a>
<a href="#media">media</a>
<a href="#credits">credits</a>
<!--<a href="#news">news</a>-->
</div>
<a href="#plot"><h1>Newsboy</h1></a>
<div id="menu_right">
<a href="#requirements">sysreq</a>
<a href="#download">download</a>
<a href="#engine">engine</a>
</div>
</div>
<div class="hash" id="plot"></div>
<h2>Plot</h2>
<p>
You are Newsboy, a professional delivery agent for politikers, phreakers, mobbers, and most any other high-end entity who wishes for discreet, careful, and highly professional deliveries.
You live in an age when the human mind has been joined into the intergalactic network known as The Mesh.
</p>
<p>
Some have even made the leap towards total abandonment of the physical world, referring to it derisively as "meatspace."
These people are known as Transcendents and have moved their conscious mind away from the material world into the ever-changing Mesh.
You exist in a special place here, for you near-seemlessly hop through meatspace and the Mesh. It is, after all, an intrinsic part of your excellent service.
</p>
<p>
However, during a job in meatspace, you are framed by the brutish Corps for killing a young Kapital president. As they move to eradicate your consciousness you quickly transfer your conscious mind to Transcendence.
</p>
<p>
It is here that you must find your way back to your body before the Corps can crack into your material mind.
</p>
<p>
The game plays from a 2D third-person perspective using a completely custom engine made entirely in this month (more on that afterwards). You use METABITs to defend yourself from hostile entities such as z0mbie processes. These METABITs level up the more rogue processes they absorb, thereby increasing damage output.
</p>
<div class="hash" id="media"></div>
<h2>Media</h2>
<div id="display">
<img src="shot1.png" alt="display"/>
</div>
<div class="scrollr" id="scrollr">
<div>
<a href="shot1.png"><img src="shot1.png" alt="shot1"/></a>
</div>
<div>
<a href="shot2.png"><img src="shot2.png" alt="shot2"/></a>
</div>
<div>
<a href="shot3.png"><img src="shot3.png" alt="shot3"/></a>
</div>
</div>
<div class="hash" id="credits"></div>
<h2>Credits</h2>
<ul>
<li> Engine/Design/Graphics/Maps: <a href="http://kettek.exoss.net/">kts_kettek </a></li>
<li> Most Excellent Music: <a href="http://mrandy.net/music">MR4</a></li>
</ul>
<!-- <div class="hash" id="news"></div>
<h2>News</h2>
<p>
<h3>2014-07-03 00:26:35</h3>
On the itinerary:
<ul>
<li>Implement more functionality of the Trigger/Event system </li>
<li>More enemy types </li>
<ul>
<li> "Sniffer" - looks for player, notifies nearby enemies of location. </li>
<li> "Swarm" - collection of small entities that work in tandem to swarm the player.</li>
<li> "Worm" - multi-segmented entity, close-range, high damage</li>
</ul>
<li> Maps </li>
<ul>
<li> Add more to s1m2 </li>
<li> Create s1m3, where you have to pass through the dangerous Outer Zone </li>
<li> Finally, s1m4, when you reach your body's neural node </li>
</ul>
<li> Custom map selection </li>
<li> Leveling System </li>
<ul>
<li> METABIT trait selection, for defense, range, damage, etc. </li>
</ul>
<li> Reduce graphical fidelity OR implement a more intelligent frame caching system. </li>
</ul>
</p>-->
<div class="hash" id="requirements"></div>
<h2>Requirements</h2>
<ul>
<li> OS: 64-bit GNU/Linux or 32-bit Windows (or others - Use the Source! OS X binary coming soon)</li>
<li> CPU: Something comparable to an AMD E350 1.6Ghz Dual-Core</li>
<li> RAM: At least 1.5 gigs free. I'll optimize in the future. </li>
<li> Videocard: Almost any that has at least 128mb vram.</li>
<li> HD space: 150~ megs </li>
</ul>
<div class="hash" id="download"></div>
<h2>Download</h2>
<div id="latest_dl">
<h3> Latest Release (2014/06/30): Newsboy 0x00</h3>
<a href="http://media.cerebustv.com/kts/Newsboy_0x00.tgz">.tgz</a>/<a href="http://media.cerebustv.com/kts/Newsboy_0x00.zip">.zip</a>
<div>Includes full GPLv3 source code and 64-bit GNU/Linux and 32-bit Windows binaries</div>
</div>
<p>
Mac OS X .app coming soon - binaries already built.
</p>
<p>The source code is released under the GPLv3, so feel free to modify it, fix it, or whatever else you please under that license. If you do any of these things, let me know, as I'd be curious. :]
</p>
<h3>Notes on Building</h3>
<p>To build the source, you will need the development libraries for:</p>
<ul>
<li>SDL2</li>
<li>SDL2_image</li>
<li>SDL2_ttf</li>
<li>SDL2_mixer</li>
<li>OpenGL</li>
</ul>
<p>If you would like to build the source on Windows, you will either need to have a Mingw build environment, or you will have to convert to your appropriate build environment. To do the latter would be fairly straight forward, as the Makefile doesn't do anything special beyond collect all .c files, compile them, then link into the Newsboy binary.</p>
<div class="hash" id="engine"></div>
<h2>Engine</h2>
<p>
Newsboy uses a custom engine written in C and SDL2 - it currently weighs in at approximately 14k lines of code. It uses SDL2_image, SDL2_ttf, and SDL2_mixer, as well as OpenGL for accelerated rendering of 2D sprites(textured quads) and zooming.
</p>
<p>
It also hosts some interesting, although currently underused, features.
</p>
<h3>Nanosecond Precision</h3>
<p>
The first of these is nanosecond precision. The entire timer system relies on nanoseconds, however the in-game delta use is generally in milliseconds. Why was this done? Because it was fun.
</p>
<h3>Animation System</h3>
<p>
The second is the animation system. Although also underused, the animation system was designed and implemented to drive portions of game logic and physics. To begin with, each animation contains a set, such as "walk", "idle", etc., and each set contains a "face", generally for the cardinal directions. Each face contains frames, which consist of an image string and a tag string.
</p>
<p>
When particular tags are encountered during particular sets, game logic and physics can be affected. For example, when the player is in the "walk" set and a "walk" tag is found on the current frame, then an amount of force is applied during that frame. This leads to more natural movement. In addition, this approach helps with smoothing animation between sets, as the "walk" state can only be ended if a "pass" frame is encountered (the "pass" frame is the one that is visually the closest to the standard "idle" frames).
</p>
<h3>Trigger->Event System</h3>
<p>
Although not all of the specifications have been implemented as of yet, the engine uses a trigger->event(s) system. To specify, a Trigger is a rectangular location on the map that can be interacted with via collision or otherwise by different types of entities, such as the player, enemies, metabits, or projectiles. Furthermore, Triggers have different behaviors, such as one-time use, looping, delays, etc.. Finally, Triggers can link to a theoretically unlimited amount of Events.
</p>
<p>
Events also exist as rectangular locations, but should be thought of as function calls. They are given a "type" id, which corresponds to a function call, such as those for starting/stopping music, spawning entities, changing animation sets, etc. From there they must be provided with the appropriate amount of parameters (with specific data types of "string", "int" or "char") for that function call. I will be writing more on how to use this system for map development, as the number of functions and their parameters are only discoverable through the source.
</p>
<p>
Although Events are referred to via string in the map editor and the map data files, when the map is loaded in a live map structure, the strings are converted into integers and accessed via index.
</p>
<p>
There are other neat features which I will also provide, likely after code cleanup, comment-adding, and bugfixes.
</p>
<div style="font-size:11px"><a href="http://www.smeltery.net/fonts/watch-tv">SMeltery's WAtch TV font, used under the SMFF EULA</a>
<br />
<a href="http://www.marksimonson.com/fonts/view/anonymous-pro">Mark Simonson Studio's Anonymous Pro font, used under the OFL</a>
</div>
<br />
<div style="font-size:12px">Unless otherwise noted, all content is copyright (c) 2014, kts_kettek / Ketchetwahmeegwun T. Southall --- Valid HTML5 and CSS3</div>
</body>
</html>