first commit

This commit is contained in:
Adolfo Delorenzo 2021-10-11 17:45:00 -06:00
commit b116d1d6ea
75 changed files with 33725 additions and 0 deletions

8
Dockerfile Normal file
View File

@ -0,0 +1,8 @@
FROM nginx:alpine
# Bring in Pacman
COPY html /usr/share/nginx/html
COPY start_nginx.sh /
# Run nginx
CMD /start_nginx.sh

0
README.md Normal file
View File

3
html/.htaccess Normal file
View File

@ -0,0 +1,3 @@
AddType application/x-web-app-manifest+json .webapp
AddType application/json .json
AddCharset ISO-8859-1 .json

121
html/LICENSE Normal file
View File

@ -0,0 +1,121 @@
Creative Commons Legal Code
CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.
For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display,
communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation
thereof, including any amended or successor version of such
directive); and
vii. other similar, equivalent or corresponding rights throughout the
world based on applicable law or treaty, and any national
implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or
warranties of any kind concerning the Work, express, implied,
statutory or otherwise, including without limitation warranties of
title, merchantability, fitness for a particular purpose, non
infringement, or the absence of latent or other defects, accuracy, or
the present or absence of errors, whether or not discoverable, all to
the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without
limitation any person's Copyright and Related Rights in the Work.
Further, Affirmer disclaims responsibility for obtaining any necessary
consents, permissions or other rights required for any use of the
Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to
this CC0 or use of the Work.

203
html/README.md Normal file
View File

@ -0,0 +1,203 @@
pacman-canvas
=============
An old classic, re-written in HTML5.
Visit http://pacman.platzh1rsch.ch to see it live.
Sounds from
http://soundfxcenter.com/ and http://soundfxnow.com/
If you like this project, feel free to buy me a coffee:
<a href="https://www.buymeacoffee.com/platzh1rsch" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
------
License
=======
Feel free to use / copy / modify my code, as long as you reshare your version and give some credit to the original author (me).
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Pacman Canvas</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://platzh1rsch.ch" property="cc:attributionName" rel="cc:attributionURL">Platzh1rsch</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://github.com/platzhersh/pacman-canvas" rel="dct:source">https://github.com/platzhersh/pacman-canvas</a>.
Get started
===========
To just run the game locally, run `npm start`.
If you want to see the console logs in your browser, use the `npm run start:dev` instead.
To modify the game for your needs, look at the `pacman-canvas.js` file and make your modifications.
To change the look and feel, edit the `pacman-canvas.css` file or also the `index.htm`file, where everything comes together.
------
Version history
===============
*Version 1.0.5 - 22.03.2021*
* add webpack config
* fix finished game state
* show console logs when started locally
*Version 1.0.4 - 26.12.2020*
* remove highscore reset endpoint
*Version 1.0.3 - 26.12.2020*
* fix speed issue
*Version 1.0.2 - 26.12.2020*
* add get started section in README
* limit to 10 levels for now
* small refactorings
* add score validation in JS
*Version 1.0.1 - 6.10.2020*
* add `bump-version.sh` to make versioning easier
*Version 1.0.0 - 5.9.2020*
* use "default" version number format, go up to 1.0.0
* add `package.json`
* add `server.js`
* you can now run pacman running an express JS server, using `npm start`
* don't use ajax `async: false` anymore to load map config, since it has been marked as deprecated
*Version 0.93 - 8.1.2020*
* add `ads.txt`
*Version 0.92 - 6.3.2018*
* remove navigator.vibrate() calls
*Version 0.91 - 15.01.2016*
* more tests to avoid cheaters
* better highscore form validation
* timer integrated (not in use yet)
* "your screen is too small to play in landscape view" message removed
* fix number of points for eating a ghost
*Version 0.9 - 15.10.2015*
* different difficulties depending on level
* scatter / chase indicated through wall colour
* extended instructions
*Version 0.87 - 08.10.2015*
* fix a bug that allowed resuming a game after game over
*Version 0.86 - 25.05.2015*
* some security fixes to avoid cheaters from adding highscores
*Version 0.84 - 09.11.2014*
* fixed bug that caused game to crash when leaving game area to the right side while holding the right arrow
*Version 0.83 - 07.05.2014*
* not possible to stop by turning into walls anymore
* mute / unmute the game by pressing the "M" key
*Version 0.82 - 02.04.2014*
* small bugfixes
* swipe gestures detection on the whole screen not only game area
*Version 0.81 - 16.03.2014*
* Ghost Modes Scatter & Chase
* Pathfinding AI for Blinky
* Ghosts need to return to Ghost House when dead
*Version 0.8 - 13.11.2013*
* lots of small changes in the backend
* when you go in landscape mode and your screen is too small to display the whole site, you get notified to rotate your phone into portrait mode
* all onClick and onMousedown in HTML removed and replaced by EventListeners in JavaScript
* Pacman Canvas now uses ApplicationCache to cache its content, so you can play the game offline!
*Version 0.78 - 05.11.2013*
* navigation via buttons should be less delayed by using onMouseDown event instead of onClick
* refreshRate is now a game attribute and could be changed easily during the game (not yet implemented in frontend)
*Version 0.77 - 24.05.2013*
* Ghosts start to blink before to undazzle
* Pacman now dies with style
*Version 0.76 - 02.05.2013*
* You can now use the usual arrow keys to control pacman
* fixed 2 small bugs regarding KeyEvents
*Version 0.75 - 28.04.2013*
* You can pause / resume the game by pressing SPACE
* ESC is no longer used to pause / resume, but to go back to the main view
* Game Menu only showing while game is paused
* some css tweaks
* Simple Highscore implemented using Ajax, Json and Sqlite3
*Version 0.74 - 25.04.2013*
* You can pause / resume the game by pressing ESC or clicking into canvas
* Swipe Gestures using hammerjs
* replaced alerts by nice html overlay messages
*Version 0.73 - 17.04.2013*
* You can play on until you lost all your 3 lives
* Ghosts state gets reset everytime they get eaten or new level starts
*Version 0.72 - 30.01.2013*
* Ghost Base Door
* Reset Game after winning
*Version 0.71 - 30.01.2013*
* Ghosts can die too
*Version 0.7 - 29.01.2013*
* Powerpills & Beastmode
*Version 0.63 - 29.01.2013*
* Pills now get loaded over external json file (map.json)
* ghost collisions implemented -> dying
* tried to clean up the code a bit
*Version 0.62 - 23.01.2013*
* disable zoom on Mobile
* change name to Pacman Canvas (Alpha)
*Version 0.61 - 12.01.2013*
* all walls defined (incl. collisions)
*Version 0.6 - 12.01.2013*
* small fixes for mobile view
* sound control (default: muted)
* collision control for walls
* json datastructure design for all game objects (pills, magic pills, walls)
*Version 0.41 - 10.12.2012*
* Mobile Design Fix
* New Icon
*Version 0.40 - 08.12.2012*
* Control Buttons for mobile
* Small Design Updates
*Version 0.30 - 05.12.2012*
* Touch Support via jGestures
* Responsive
*Version 0.20 - 22.11.2012*
* Code Refactored for further development
* Sound added
* Appcache implemented
*Version 0.13 - 29.10.2012*
* Never miss a dot: Pacman now always stays in the grid.
*Version 0.12 - 19.10.2012*
* Pacman is now able to eat the dots. Eating a dot equals 10 points for now.
* LiveScore implemented.
* Game ends when all dots are eaten.
*Version 0.11 - 15.10.2012*
* Placing white Dots and storing them in a Hashtable
* Monster/Ghost Prototype
* Score Prototype
* Pacman had to get smaller (r=15px)
* Display Grid
* Refactoring HTML
*Version 0.10 - 23.08.2012*
* Started cleaning up the code using Objects
* Pacman now turns around when changing directions

1
html/ads.txt Normal file
View File

@ -0,0 +1 @@
google.com, pub-0176206735745791, DIRECT, f08c47fec0942fa0

158
html/bump_version.sh Executable file
View File

@ -0,0 +1,158 @@
#!/bin/bash
#region globalvars
option=$1
abort=false
currentVersion=''
newVersion=''
currentDateTime=$(date +"%Y-%m-%d %T")
currentDate=$(date +"%Y-%m-%d")
#region functions
function showHelp {
echo 'Parameter invalid / missing.'
echo ''
echo 'usage:'
echo ''
echo ' bump_version [patch|minor|major]'
echo ''
}
function checkParameters {
# check if parameter provided
if [ -z $option ];
then
showHelp
abort=true
else
case $option in
patch)
# echo "patch"
;;
minor)
# echo "minor"
;;
major)
# echo "major"
;;
*)
showHelp
abort=true
return
;;
esac
echo "bump ${option} version"
fi
}
# use package.json as the source of truth
function read_current_version {
currentVersion=$(echo "$var1" | (grep version package.json | sed 's/.*"version": "\(.*\)".*/\1/'))
echo "currentVersion=${currentVersion}"
}
function get_new_version {
local currentMajor=$(echo "$var1" | (echo "${currentVersion}" | awk -F'.' '{print $1}'))
local currentMinor=$(echo "$var1" | (echo "${currentVersion}" | awk -F'.' '{print $2}'))
local currentPatch=$(echo "$var1" | (echo "${currentVersion}" | awk -F'.' '{print $3}'))
echo "${currentMajor} ${currentMinor} ${currentPatch}"
case $option in
patch)
let "newPatch = $currentPatch + 1"
newVersion="${currentMajor}.${currentMinor}.${newPatch}"
echo "newVersion=${newVersion}"
;;
minor)
let "newMinor = $currentMinor + 1"
newVersion="${currentMajor}.${newMinor}.0"
echo "newVersion=${newVersion}"
;;
major)
let "newMajor = $currentMajor + 1"
newVersion="${newMajor}.0.0"
echo "newVersion=${newVersion}"
;;
esac
}
function search_replace_in_file {
local file=$1
local search=$2
local replace=$3
sed -i "" "s/${search}/${replace}/g" $file
}
function write_new_version {
echo ""
echo "Update files to ${newVersion} (${currentDateTime}):"
echo " package.json"
local line="\"version\": \".*\""
local rep="\"version\": \"${newVersion}\""
sed -i "" "s/${line}/${rep}/g" package.json
# in package-lock.json we only want to replace the very first occurence
echo " package-lock.json"
sed -e "/${line}/{s//${rep}/;:a" -e '$!N;$!ba' -e '}' package-lock.json > tmp && mv tmp package-lock.json
# TODO: update last_update
echo " web-app-manifest.json"
sed -i "" "s/${line}/${rep}/g" web-app-manifest.json
# TODO: update last_update
echo " manifest.json"
sed -i "" "s/${line}/${rep}/g" manifest.json
# TODO: update last_update
echo " pacman-canvas.webapp"
sed -i "" "s/${line}/${rep}/g" pacman-canvas.webapp
echo " cache.manifest"
local line="# Pacman .*"
local rep="# Pacman ${newVersion} ${currentDateTime}"
sed -i "" "s/${line}/${rep}/g" cache.manifest
echo " index.htm"
local line="<span class=\"app-version\">.*<\/span>"
local rep="<span class=\"app-version\">${newVersion} (${currentDate})<\/span>"
sed -i "" "s/${line}/${rep}/g" index.htm
echo ""
echo "All files up to date. New Version ${newVersion} (${currentDateTime})."
echo "Don't forget to update README.md and to set the git tag."
}
function run {
# local option="${1}"
echo "run ${option}"
checkParameters
if [[ ${abort} == true ]];
then
return
fi
echo "bump version $option"
read_current_version
get_new_version
# TODO: user confirmation
write_new_version
}
#endregion
#region main
run
#endregion

60
html/cache.manifest Normal file
View File

@ -0,0 +1,60 @@
CACHE MANIFEST
# Pacman 1.0.5 2021-03-22 22:19:50
CACHE:
# HTML
index.htm
# CSS
pacman-canvas.css
# external resources
style.css
img/bg-pattern-black.png
# fonts
fonts/PressStart2Play.eot
fonts/PressStart2Play.woff
fonts/PressStart2Play.ttf
# JavaScript
pacman-canvas.js
js/jquery-1.10.2.min.js
js/jquery.hammer.min.js
# data
data/map.json
# images
img/blinky.svg
img/clyde.svg
img/inky.svg
img/pinky.svg
img/dazzled.svg
img/dazzled2.svg
img/dead.svg
img/heart.png
img/audio-icon.png
img/audio-icon-mute.png
img/platzh1rsch-logo.png
img/instructions/instructions_chase.PNG
img/instructions/instructions_scatter.PNG
img/instructions/instructions_powerpill.PNG
# MP3
mp3/die.mp3
mp3/eatghost.mp3
mp3/powerpill.mp3
mp3/theme.mp3
mp3/waka.mp3
# WAV
wav/die.wav
wav/eatghost.wav
wav/powerpill.wav
wav/theme.wav
wav/waka.wav
NETWORK:
*

118
html/data/db-handler.php Normal file
View File

@ -0,0 +1,118 @@
<?php header('Content-Type: application/json');
/* IMPORTANT:
* change this to the main url of where you host the application, otherwise, every entry will be marked as a cheater
*/
$hostdomain = 'pacman.platzh1rsch.ch';
if (isset($_POST['action'])) {
switch ($_POST['action']) {
case 'get':
if (isset($_POST['page'])) {
echo getHighscore($_POST['page']);
} else {
echo getHighscore();
}
break;
case 'add':
if (isset($_POST['name']) || isset($_POST['score']) || isset($_POST['level']))
echo addHighscore($_POST['name'], $_POST['score'], $_POST['level']);
break;
}
} else if (isset($_GET['action'])) {
if ($_GET['action'] == 'get') {
if (isset($_GET['page'])) {
echo getHighscore($_GET['page']);
} else {
echo getHighscore();
}
} else if ($_GET['action'] == 'version') {
echo getVersionInfo();
}
} else echo "define action to call";
function getVersionInfo()
{
$strJsonFileContents = file_get_contents("../package.json");
// Convert to array
$array = json_decode($strJsonFileContents, true);
$response["version"] = $array["version"];
if (!isset($response) || is_null($response)) {
return "[]";
} else {
return json_encode($response);
}
}
function getHighscore($page = 1)
{
$db = new SQLite3('pacman.db');
createDataBase($db);
$results = $db->query('SELECT name, score FROM highscore WHERE cheater = 0 AND name != "" ORDER BY score DESC LIMIT 10 OFFSET ' . ($page - 1) * 10);
while ($row = $results->fetchArray()) {
$tmp["name"] = htmlspecialchars($row['name']);
$tmp["score"] = strval($row['score']);
$response[] = $tmp;
}
if (!isset($response) || is_null($response)) {
return "[]";
} else {
return json_encode($response);
}
}
function addHighscore($name, $score, $level)
{
global $hostdomain;
$db = new SQLite3('pacman.db');
$date = date('Y-m-d h:i:s', time());
createDataBase($db);
$ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
$ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
$remA = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "";
$remH = isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : "";
// some simple checks to avoid cheaters
$ref_assert = preg_match('/http(s)?:\/\/.*' . $hostdomain . '/', $ref) > 0;
$ua_assert = ($ua != "");
$cheater = 0;
if (!$ref_assert || !$ua_assert) {
$cheater = 1;
}
$maxlvlpoints_pills = 104 * 10;
$maxlvlpoints_powerpills = 4 * 50;
$maxlvlpoints_ghosts = 4 * 4 * 100;
$maxlvlpoints = $maxlvlpoints_pills + $maxlvlpoints_powerpills + $maxlvlpoints_ghosts;
// check if score is even possible
if ($level < 1 || $level > 10) {
$cheater = 1;
} else if (($score / $level) > $maxlvlpoints) {
$cheater = 1;
}
$name_clean = htmlspecialchars($name);
$score_clean = htmlspecialchars($score);
$db->exec('INSERT INTO highscore (name, score, level, date, log_referer, log_user_agent, log_remote_addr, log_remote_host, cheater)VALUES(?,?,?,?,?,?,?,?,?)', $name_clean, $score_clean, $level, $date, $ref, $ua, $remA, $remH, $cheater);
$response['status'] = "success";
$response['level'] = $level;
$response['name'] = $name;
$response['score'] = $score;
$response['cheater'] = $cheater;
return json_encode($response);
}
function createDataBase($db)
{
$db->exec('CREATE TABLE IF NOT EXISTS highscore(name VARCHAR(60),score INT, level INT, date DATETIME, log_referer VARCHAR(200), log_user_agent VARCHAR(200), log_remote_addr VARCHAR(200), log_remote_host VARCHAR(200), cheater BOOLEAN)');
}

305
html/data/map.json Normal file
View File

@ -0,0 +1,305 @@
{
"posY" :
[
{
"row": 1,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "wall" },
{ "col": 3, "type": "wall" },
{ "col": 4, "type": "wall" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "wall" },
{ "col": 7, "type": "wall" },
{ "col": 8, "type": "wall" },
{ "col": 9, "type": "wall" },
{ "col": 10, "type": "wall" },
{ "col": 11, "type": "wall" },
{ "col": 12, "type": "wall" },
{ "col": 13, "type": "wall" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "wall" },
{ "col": 16, "type": "wall" },
{ "col": 17, "type": "wall" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 2,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "powerpill" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "pill" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "pill" },
{ "col": 7, "type": "pill" },
{ "col": 8, "type": "pill" },
{ "col": 9, "type": "pill" },
{ "col": 10, "type": "pill" },
{ "col": 11, "type": "pill" },
{ "col": 12, "type": "pill" },
{ "col": 13, "type": "pill" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "pill" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "powerpill" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 3,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "pill" },
{ "col": 3, "type": "wall" },
{ "col": 4, "type": "pill" },
{ "col": 5, "type": "pill" },
{ "col": 6, "type": "pill" },
{ "col": 7, "type": "wall" },
{ "col": 8, "type": "wall" },
{ "col": 9, "type": "pill" },
{ "col": 10, "type": "pill" },
{ "col": 11, "type": "wall" },
{ "col": 12, "type": "wall" },
{ "col": 13, "type": "pill" },
{ "col": 14, "type": "pill" },
{ "col": 15, "type": "pill" },
{ "col": 16, "type": "wall" },
{ "col": 17, "type": "pill" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 4,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "pill" },
{ "col": 3, "type": "wall" },
{ "col": 4, "type": "wall" },
{ "col": 5, "type": "pill" },
{ "col": 6, "type": "wall" },
{ "col": 7, "type": "pill" },
{ "col": 8, "type": "pill" },
{ "col": 9, "type": "pill" },
{ "col": 10, "type": "pill" },
{ "col": 11, "type": "pill" },
{ "col": 12, "type": "pill" },
{ "col": 13, "type": "wall" },
{ "col": 14, "type": "pill" },
{ "col": 15, "type": "wall" },
{ "col": 16, "type": "wall" },
{ "col": 17, "type": "pill" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 5,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "pill" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "wall" },
{ "col": 5, "type": "pill" },
{ "col": 6, "type": "pill" },
{ "col": 7, "type": "pill" },
{ "col": 8, "type": "wall" },
{ "col": 9, "type": "door" },
{ "col": 10, "type": "door" },
{ "col": 11, "type": "wall" },
{ "col": 12, "type": "pill" },
{ "col": 13, "type": "pill" },
{ "col": 14, "type": "pill" },
{ "col": 15, "type": "wall" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "pill" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 6,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "wall" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "wall" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "pill" },
{ "col": 7, "type": "wall" },
{ "col": 8, "type": "null" },
{ "col": 9, "type": "null" },
{ "col": 10, "type": "null" },
{ "col": 11, "type": "null" },
{ "col": 12, "type": "wall" },
{ "col": 13, "type": "pill" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "wall" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "wall" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 7,
"posX": [
{ "col": 1, "type": "pill" },
{ "col": 2, "type": "pill" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "pill" },
{ "col": 5, "type": "pill" },
{ "col": 6, "type": "pill" },
{ "col": 7, "type": "wall" },
{ "col": 8, "type": "wall" },
{ "col": 9, "type": "wall" },
{ "col": 10, "type": "wall" },
{ "col": 11, "type": "wall" },
{ "col": 12, "type": "wall" },
{ "col": 13, "type": "pill" },
{ "col": 14, "type": "pill" },
{ "col": 15, "type": "pill" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "pill" },
{ "col": 18, "type": "pill" }
]
},
{
"row": 8,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "wall" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "wall" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "pill" },
{ "col": 7, "type": "pill" },
{ "col": 8, "type": "pill" },
{ "col": 9, "type": "pill" },
{ "col": 10, "type": "pill" },
{ "col": 11, "type": "pill" },
{ "col": 12, "type": "pill" },
{ "col": 13, "type": "pill" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "wall" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "wall" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 9,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "wall" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "wall" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "wall" },
{ "col": 7, "type": "wall" },
{ "col": 8, "type": "wall" },
{ "col": 9, "type": "pill" },
{ "col": 10, "type": "pill" },
{ "col": 11, "type": "wall" },
{ "col": 12, "type": "wall" },
{ "col": 13, "type": "wall" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "wall" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "wall" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 10,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "pill" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "pill" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "wall" },
{ "col": 7, "type": "pill" },
{ "col": 8, "type": "pill" },
{ "col": 9, "type": "pill" },
{ "col": 10, "type": "pill" },
{ "col": 11, "type": "pill" },
{ "col": 12, "type": "pill" },
{ "col": 13, "type": "wall" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "pill" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "pill" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 11,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "pill" },
{ "col": 3, "type": "wall" },
{ "col": 4, "type": "pill" },
{ "col": 5, "type": "pill" },
{ "col": 6, "type": "pill" },
{ "col": 7, "type": "pill" },
{ "col": 8, "type": "wall" },
{ "col": 9, "type": "wall" },
{ "col": 10, "type": "wall" },
{ "col": 11, "type": "wall" },
{ "col": 12, "type": "pill" },
{ "col": 13, "type": "pill" },
{ "col": 14, "type": "pill" },
{ "col": 15, "type": "pill" },
{ "col": 16, "type": "wall" },
{ "col": 17, "type": "pill" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 12,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "powerpill" },
{ "col": 3, "type": "pill" },
{ "col": 4, "type": "pill" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "wall" },
{ "col": 7, "type": "pill" },
{ "col": 8, "type": "pill" },
{ "col": 9, "type": "pill" },
{ "col": 10, "type": "pill" },
{ "col": 11, "type": "pill" },
{ "col": 12, "type": "pill" },
{ "col": 13, "type": "wall" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "pill" },
{ "col": 16, "type": "pill" },
{ "col": 17, "type": "powerpill" },
{ "col": 18, "type": "wall" }
]
},
{
"row": 13,
"posX": [
{ "col": 1, "type": "wall" },
{ "col": 2, "type": "wall" },
{ "col": 3, "type": "wall" },
{ "col": 4, "type": "wall" },
{ "col": 5, "type": "wall" },
{ "col": 6, "type": "wall" },
{ "col": 7, "type": "wall" },
{ "col": 8, "type": "wall" },
{ "col": 9, "type": "wall" },
{ "col": 10, "type": "wall" },
{ "col": 11, "type": "wall" },
{ "col": 12, "type": "wall" },
{ "col": 13, "type": "wall" },
{ "col": 14, "type": "wall" },
{ "col": 15, "type": "wall" },
{ "col": 16, "type": "wall" },
{ "col": 17, "type": "wall" },
{ "col": 18, "type": "wall" }
]
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
google-site-verification: googlee6aee5a894225e60.html

BIN
html/img/Icon-106x106.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
html/img/Icon-130x130.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
html/img/Icon-150x130.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
html/img/Icon-200x200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
html/img/Icon-300x300.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
html/img/Icon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
html/img/Icon-512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

106
html/img/Pacman-Icon.svg Normal file
View File

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="128"
height="128"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="Pacman-Icon.svg"
inkscape:export-filename="C:\Users\chregi\Documents\GitHub\pacman-canvas\img\Pacman-Icon.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<title
id="title3755">Pacman-Icon</title>
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-101.68133"
inkscape:cy="17.658003"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1600"
inkscape:window-height="838"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Pacman-Icon</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="BG">
<rect
style="fill:#333333;fill-opacity:1;stroke:#000000;stroke-width:0.99040616000000004;stroke-opacity:0"
id="rect4810"
width="127.0096"
height="127.00959"
x="0.49520308"
y="0.49520677"
ry="25" />
</g>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-205.19915,-422.02019)">
<path
sodipodi:type="arc"
style="fill:#ffdc00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0"
id="path2985"
sodipodi:cx="315.71429"
sodipodi:cy="433.79074"
sodipodi:rx="110"
sodipodi:ry="115.71429"
d="m 415.33852,482.85049 a 110,115.71429 0 1 1 -8.95843,-114.58281 l -90.6658,65.52306 z"
transform="matrix(0.47477663,0,0,0.45133087,121.66357,291.58255)"
sodipodi:start="0.43782781"
sodipodi:end="5.6812379" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Auge"
transform="translate(0,-0.0302887)">
<path
sodipodi:type="arc"
style="fill:#333333;fill-opacity:1;stroke:#000000;stroke-opacity:0"
id="path4805"
sodipodi:cx="-65.740738"
sodipodi:cy="50.715473"
sodipodi:rx="13.888889"
sodipodi:ry="13.425926"
d="m -51.851849,50.715473 a 13.888889,13.425926 0 1 1 -27.777778,0 13.888889,13.425926 0 1 1 27.777778,0 z"
transform="matrix(0.69456804,0,0,0.7185187,111.6429,4.3125106)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
html/img/audio-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

50
html/img/blinky.svg Executable file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
id="svg3209"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="Neues Dokument 11">
<title
id="title3238">blinky</title>
<defs
id="defs3211" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="56.727193"
inkscape:cy="-67.066627"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1148"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata3214">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>blinky</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-620.1475,-462.09155)">
<g
id="g3048"
inkscape:label="#blinky"
transform="translate(169.6996,-110.9135)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<title
id="title3056">Blinky</title>
<path
inkscape:label="#Blinky"
style="fill:#ca1111"
d="m 453.98527,630.78254 c -1.20261,-1.71697 -1.55219,-4.9583 -1.53689,-14.25 0.0359,-21.77874 2.19013,-29.87068 9.77706,-36.72501 5.18333,-4.68283 10.07002,-6.27246 19.24739,-6.26115 6.37329,0.008 8.45651,0.47101 13.42172,2.98399 11.10162,5.61871 13.56334,12.02522 14.22783,37.02721 0.37412,14.07623 0.26991,15.17032 -1.60658,16.86853 -2.62623,2.3767 -5.53748,1.59732 -10.77301,-2.8841 -2.27268,-1.94533 -4.53179,-3.53696 -5.02024,-3.53696 -0.48844,0 -2.64574,1.8 -4.79398,4 -2.14824,2.2 -4.66557,4 -5.59406,4 -0.9285,0 -3.86642,-1.8 -6.52873,-4 -5.38287,-4.44815 -6.50891,-4.75708 -8.50477,-2.33328 -1.68026,2.04055 -8.87298,7.33328 -9.96577,7.33328 -0.4363,0 -1.49378,-1.00013 -2.34997,-2.22251 z m 28.75904,-24.89453 c 1.20134,-0.61437 2.89994,-2.01574 3.77466,-3.11415 1.57615,-1.97921 1.61346,-1.97404 4.16388,0.57638 3.54047,3.54047 7.20236,4.28434 11.35124,2.30588 3.99841,-1.90671 4.67607,-5.32912 1.1547,-5.83152 -2.47068,-0.35249 -3.68426,-3.59046 -1.58413,-4.22664 4.84428,-1.46744 4.92389,-1.53759 3.90525,-3.44092 -1.36593,-2.55226 -6.46932,-4.52241 -9.64805,-3.7246 -1.43304,0.35967 -3.73322,1.78163 -5.11151,3.15992 l -2.50598,2.50598 -2.32267,-2.5062 c -4.5492,-4.90867 -12.1154,-4.15202 -15.04029,1.5041 -1.77559,3.43363 -1.79018,5.67231 -0.0573,8.79874 2.44707,4.41505 7.67237,6.16541 11.92024,3.99303 z m -0.93574,-7.33507 c -0.7754,-2.02068 0.3778,-3.54789 2.67902,-3.54789 1.40371,0 1.94098,0.692 1.94098,2.5 0,1.84621 -0.53124,2.5 -2.03139,2.5 -1.11726,0 -2.28213,-0.65345 -2.58861,-1.45211 z"
id="Blinky"
inkscape:connector-curvature="0">
<title
id="title3046">Blinky</title>
</path>
<path
transform="matrix(1.12,0,0,1.0188679,-61.321661,-12.313696)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.12,0,0,1.0188679,-79.535934,-12.544555)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004-1"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-365.34427,-410.69975)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-346.35319,-411.00305)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026-7"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

50
html/img/clyde.svg Executable file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
id="svg3209"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="Inky.svg">
<title
id="title3238">Clyde</title>
<defs
id="defs3211" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="56.727193"
inkscape:cy="-67.066627"
inkscape:document-units="px"
inkscape:current-layer="g3048"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1148"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata3214">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Clyde</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-620.1475,-462.09155)">
<g
id="g3048"
inkscape:label="#blinky"
transform="translate(169.6996,-110.9135)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<title
id="title3056">Blinky</title>
<path
inkscape:label="#Blinky"
style="fill:#ff9955"
d="m 453.98527,630.78254 c -1.20261,-1.71697 -1.55219,-4.9583 -1.53689,-14.25 0.0359,-21.77874 2.19013,-29.87068 9.77706,-36.72501 5.18333,-4.68283 10.07002,-6.27246 19.24739,-6.26115 6.37329,0.008 8.45651,0.47101 13.42172,2.98399 11.10162,5.61871 13.56334,12.02522 14.22783,37.02721 0.37412,14.07623 0.26991,15.17032 -1.60658,16.86853 -2.62623,2.3767 -5.53748,1.59732 -10.77301,-2.8841 -2.27268,-1.94533 -4.53179,-3.53696 -5.02024,-3.53696 -0.48844,0 -2.64574,1.8 -4.79398,4 -2.14824,2.2 -4.66557,4 -5.59406,4 -0.9285,0 -3.86642,-1.8 -6.52873,-4 -5.38287,-4.44815 -6.50891,-4.75708 -8.50477,-2.33328 -1.68026,2.04055 -8.87298,7.33328 -9.96577,7.33328 -0.4363,0 -1.49378,-1.00013 -2.34997,-2.22251 z m 28.75904,-24.89453 c 1.20134,-0.61437 2.89994,-2.01574 3.77466,-3.11415 1.57615,-1.97921 1.61346,-1.97404 4.16388,0.57638 3.54047,3.54047 7.20236,4.28434 11.35124,2.30588 3.99841,-1.90671 4.67607,-5.32912 1.1547,-5.83152 -2.47068,-0.35249 -3.68426,-3.59046 -1.58413,-4.22664 4.84428,-1.46744 4.92389,-1.53759 3.90525,-3.44092 -1.36593,-2.55226 -6.46932,-4.52241 -9.64805,-3.7246 -1.43304,0.35967 -3.73322,1.78163 -5.11151,3.15992 l -2.50598,2.50598 -2.32267,-2.5062 c -4.5492,-4.90867 -12.1154,-4.15202 -15.04029,1.5041 -1.77559,3.43363 -1.79018,5.67231 -0.0573,8.79874 2.44707,4.41505 7.67237,6.16541 11.92024,3.99303 z m -0.93574,-7.33507 c -0.7754,-2.02068 0.3778,-3.54789 2.67902,-3.54789 1.40371,0 1.94098,0.692 1.94098,2.5 0,1.84621 -0.53124,2.5 -2.03139,2.5 -1.11726,0 -2.28213,-0.65345 -2.58861,-1.45211 z"
id="Blinky"
inkscape:connector-curvature="0">
<title
id="title3046">Blinky</title>
</path>
<path
transform="matrix(1.12,0,0,1.0188679,-61.321661,-12.313696)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.12,0,0,1.0188679,-79.535934,-12.544555)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004-1"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-365.34427,-410.69975)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-346.35319,-411.00305)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026-7"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

10464
html/img/dazzled.svg Executable file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 794 KiB

12
html/img/dazzled123.svg Executable file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.5 MiB

10464
html/img/dazzled2.svg Executable file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 794 KiB

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
id="svg3209"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="dazzled2.svg">
<title
id="title3238">blinky</title>
<defs
id="defs3211" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.990248"
inkscape:cx="56.727193"
inkscape:cy="-15.981831"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1600"
inkscape:window-height="838"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata3214">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>blinky</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-620.1475,-462.09155)">
<path
inkscape:connector-curvature="0"
id="Blinky"
d="m 623.68487,519.86904 c -1.20261,-1.71697 -1.55219,-4.9583 -1.53689,-14.25 0.0359,-21.77874 2.19013,-29.87068 9.77706,-36.72501 5.18333,-4.68283 10.07002,-6.27246 19.24739,-6.26115 6.37329,0.008 8.45651,0.47101 13.42172,2.98399 11.10162,5.61871 13.56334,12.02522 14.22783,37.02721 0.37412,14.07623 0.26991,15.17032 -1.60658,16.86853 -2.62623,2.3767 -5.53748,1.59732 -10.77301,-2.8841 -2.27268,-1.94533 -4.53179,-3.53696 -5.02024,-3.53696 -0.48844,0 -2.64574,1.8 -4.79398,4 -2.14824,2.2 -4.66557,4 -5.59406,4 -0.9285,0 -3.86642,-1.8 -6.52873,-4 -5.38287,-4.44815 -6.50891,-4.75708 -8.50477,-2.33328 -1.68026,2.04055 -8.87298,7.33328 -9.96577,7.33328 -0.4363,0 -1.49378,-1.00013 -2.34997,-2.22251 z m 28.75904,-24.89453 c 1.20134,-0.61437 2.89994,-2.01574 3.77466,-3.11415 1.57615,-1.97921 1.61346,-1.97404 4.16388,0.57638 3.54047,3.54047 7.20236,4.28434 11.35124,2.30588 3.99841,-1.90671 4.67607,-5.32912 1.1547,-5.83152 -2.47068,-0.35249 -3.68426,-3.59046 -1.58413,-4.22664 4.84428,-1.46744 4.92389,-1.53759 3.90525,-3.44092 -1.36593,-2.55226 -6.46932,-4.52241 -9.64805,-3.7246 -1.43304,0.35967 -3.73322,1.78163 -5.11151,3.15992 l -2.50598,2.50598 -2.32267,-2.5062 c -4.5492,-4.90867 -12.1154,-4.15202 -15.04029,1.5041 -1.77559,3.43363 -1.79018,5.67231 -0.0573,8.79874 2.44707,4.41505 7.67237,6.16541 11.92024,3.99303 z m -0.93574,-7.33507 c -0.7754,-2.02068 0.3778,-3.54789 2.67902,-3.54789 1.40371,0 1.94098,0.692 1.94098,2.5 0,1.84621 -0.53124,2.5 -2.03139,2.5 -1.11726,0 -2.28213,-0.65345 -2.58861,-1.45211 z"
style="fill:#ffffff"
inkscape:label="#Blinky">
<title
id="title3046">Blinky</title>
</path>
<path
sodipodi:type="arc"
style="fill:#ff0000;fill-opacity:1"
id="path3004"
sodipodi:cx="498.92856"
sodipodi:cy="598.61218"
sodipodi:rx="8.9285717"
sodipodi:ry="9.4642859"
d="m 507.85713,598.61218 a 8.9285717,9.4642859 0 1 1 -17.85714,0 8.9285717,9.4642859 0 1 1 17.85714,0 z"
transform="matrix(1.12,0,0,1.0188679,108.37794,-123.2272)" />
<path
sodipodi:type="arc"
style="fill:#ff0000;fill-opacity:1"
id="path3004-1"
sodipodi:cx="498.92856"
sodipodi:cy="598.61218"
sodipodi:rx="8.9285717"
sodipodi:ry="9.4642859"
d="m 507.85713,598.61218 a 8.9285717,9.4642859 0 1 1 -17.85714,0 8.9285717,9.4642859 0 1 1 17.85714,0 z"
transform="matrix(1.12,0,0,1.0188679,90.163666,-123.45806)" />
<path
sodipodi:type="spiral"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3023"
sodipodi:cx="-171.42857"
sodipodi:cy="90.714287"
sodipodi:expansion="1"
sodipodi:revolution="3"
sodipodi:radius="10.738069"
sodipodi:argument="-18.782988"
sodipodi:t0="0"
d="m -171.42857,90.714287 c 0.53719,0.03581 0.21676,0.7418 -0.0595,0.892857 -0.74871,0.409355 -1.55211,-0.305461 -1.72619,-1.011905 -0.31138,-1.263664 0.76768,-2.387799 1.96429,-2.559524 1.75607,-0.252013 3.23875,1.232729 3.39285,2.916668 0.20541,2.244424 -1.69833,4.095629 -3.86904,4.226189 -2.73162,0.164298 -4.95547,-2.1641 -5.05953,-4.821429 -0.12603,-3.218381 2.62993,-5.816986 5.77381,-5.892856 3.70496,-0.08941 6.67957,3.095795 6.72619,6.726191 0.0538,4.191437 -3.56168,7.542851 -7.67857,7.559523 -4.67787,0.01894 -8.40663,-4.027596 -8.39285,-8.630954 0.0154,-5.164272 4.49351,-9.270768 9.58333,-9.226188 5.65066,0.04949 10.13518,4.959454 10.05952,10.535715"
transform="matrix(0.84223033,0,0,0.88263013,792.90942,407.51373)" />
<path
sodipodi:type="spiral"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3023-1"
sodipodi:cx="-171.42857"
sodipodi:cy="90.714287"
sodipodi:expansion="1"
sodipodi:revolution="3"
sodipodi:radius="10.738069"
sodipodi:argument="-18.782988"
sodipodi:t0="0"
d="m -171.42857,90.714287 c 0.53719,0.03581 0.21676,0.7418 -0.0595,0.892857 -0.74871,0.409355 -1.55211,-0.305461 -1.72619,-1.011905 -0.31138,-1.263664 0.76768,-2.387799 1.96429,-2.559524 1.75607,-0.252013 3.23875,1.232729 3.39285,2.916668 0.20541,2.244424 -1.69833,4.095629 -3.86904,4.226189 -2.73162,0.164298 -4.95547,-2.1641 -5.05953,-4.821429 -0.12603,-3.218381 2.62993,-5.816986 5.77381,-5.892856 3.70496,-0.08941 6.67957,3.095795 6.72619,6.726191 0.0538,4.191437 -3.56168,7.542851 -7.67857,7.559523 -4.67787,0.01894 -8.40663,-4.027596 -8.39285,-8.630954 0.0154,-5.164272 4.49351,-9.270768 9.58333,-9.226188 5.65066,0.04949 10.13518,4.959454 10.05952,10.535715"
transform="matrix(0.84223033,0,0,0.88263013,810.93075,407.36401)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
id="svg3209"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="blinky.svg">
<title
id="title3238">blinky</title>
<defs
id="defs3211" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.990248"
inkscape:cx="56.727193"
inkscape:cy="-15.981831"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1600"
inkscape:window-height="838"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata3214">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>blinky</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-620.1475,-462.09155)">
<path
inkscape:connector-curvature="0"
id="Blinky"
d="m 623.68487,519.86904 c -1.20261,-1.71697 -1.55219,-4.9583 -1.53689,-14.25 0.0359,-21.77874 2.19013,-29.87068 9.77706,-36.72501 5.18333,-4.68283 10.07002,-6.27246 19.24739,-6.26115 6.37329,0.008 8.45651,0.47101 13.42172,2.98399 11.10162,5.61871 13.56334,12.02522 14.22783,37.02721 0.37412,14.07623 0.26991,15.17032 -1.60658,16.86853 -2.62623,2.3767 -5.53748,1.59732 -10.77301,-2.8841 -2.27268,-1.94533 -4.53179,-3.53696 -5.02024,-3.53696 -0.48844,0 -2.64574,1.8 -4.79398,4 -2.14824,2.2 -4.66557,4 -5.59406,4 -0.9285,0 -3.86642,-1.8 -6.52873,-4 -5.38287,-4.44815 -6.50891,-4.75708 -8.50477,-2.33328 -1.68026,2.04055 -8.87298,7.33328 -9.96577,7.33328 -0.4363,0 -1.49378,-1.00013 -2.34997,-2.22251 z m 28.75904,-24.89453 c 1.20134,-0.61437 2.89994,-2.01574 3.77466,-3.11415 1.57615,-1.97921 1.61346,-1.97404 4.16388,0.57638 3.54047,3.54047 7.20236,4.28434 11.35124,2.30588 3.99841,-1.90671 4.67607,-5.32912 1.1547,-5.83152 -2.47068,-0.35249 -3.68426,-3.59046 -1.58413,-4.22664 4.84428,-1.46744 4.92389,-1.53759 3.90525,-3.44092 -1.36593,-2.55226 -6.46932,-4.52241 -9.64805,-3.7246 -1.43304,0.35967 -3.73322,1.78163 -5.11151,3.15992 l -2.50598,2.50598 -2.32267,-2.5062 c -4.5492,-4.90867 -12.1154,-4.15202 -15.04029,1.5041 -1.77559,3.43363 -1.79018,5.67231 -0.0573,8.79874 2.44707,4.41505 7.67237,6.16541 11.92024,3.99303 z m -0.93574,-7.33507 c -0.7754,-2.02068 0.3778,-3.54789 2.67902,-3.54789 1.40371,0 1.94098,0.692 1.94098,2.5 0,1.84621 -0.53124,2.5 -2.03139,2.5 -1.11726,0 -2.28213,-0.65345 -2.58861,-1.45211 z"
style="fill:#0000ff"
inkscape:label="#Blinky">
<title
id="title3046">Blinky</title>
</path>
<path
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1"
id="path3004"
sodipodi:cx="498.92856"
sodipodi:cy="598.61218"
sodipodi:rx="8.9285717"
sodipodi:ry="9.4642859"
d="m 507.85713,598.61218 a 8.9285717,9.4642859 0 1 1 -17.85714,0 8.9285717,9.4642859 0 1 1 17.85714,0 z"
transform="matrix(1.12,0,0,1.0188679,108.37794,-123.2272)" />
<path
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1"
id="path3004-1"
sodipodi:cx="498.92856"
sodipodi:cy="598.61218"
sodipodi:rx="8.9285717"
sodipodi:ry="9.4642859"
d="m 507.85713,598.61218 a 8.9285717,9.4642859 0 1 1 -17.85714,0 8.9285717,9.4642859 0 1 1 17.85714,0 z"
transform="matrix(1.12,0,0,1.0188679,90.163666,-123.45806)" />
<path
sodipodi:type="spiral"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3023"
sodipodi:cx="-171.42857"
sodipodi:cy="90.714287"
sodipodi:expansion="1"
sodipodi:revolution="3"
sodipodi:radius="10.738069"
sodipodi:argument="-18.782988"
sodipodi:t0="0"
d="m -171.42857,90.714287 c 0.53719,0.03581 0.21676,0.7418 -0.0595,0.892857 -0.74871,0.409355 -1.55211,-0.305461 -1.72619,-1.011905 -0.31138,-1.263664 0.76768,-2.387799 1.96429,-2.559524 1.75607,-0.252013 3.23875,1.232729 3.39285,2.916668 0.20541,2.244424 -1.69833,4.095629 -3.86904,4.226189 -2.73162,0.164298 -4.95547,-2.1641 -5.05953,-4.821429 -0.12603,-3.218381 2.62993,-5.816986 5.77381,-5.892856 3.70496,-0.08941 6.67957,3.095795 6.72619,6.726191 0.0538,4.191437 -3.56168,7.542851 -7.67857,7.559523 -4.67787,0.01894 -8.40663,-4.027596 -8.39285,-8.630954 0.0154,-5.164272 4.49351,-9.270768 9.58333,-9.226188 5.65066,0.04949 10.13518,4.959454 10.05952,10.535715"
transform="matrix(0.84223033,0,0,0.88263013,792.90942,407.51373)" />
<path
sodipodi:type="spiral"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3023-1"
sodipodi:cx="-171.42857"
sodipodi:cy="90.714287"
sodipodi:expansion="1"
sodipodi:revolution="3"
sodipodi:radius="10.738069"
sodipodi:argument="-18.782988"
sodipodi:t0="0"
d="m -171.42857,90.714287 c 0.53719,0.03581 0.21676,0.7418 -0.0595,0.892857 -0.74871,0.409355 -1.55211,-0.305461 -1.72619,-1.011905 -0.31138,-1.263664 0.76768,-2.387799 1.96429,-2.559524 1.75607,-0.252013 3.23875,1.232729 3.39285,2.916668 0.20541,2.244424 -1.69833,4.095629 -3.86904,4.226189 -2.73162,0.164298 -4.95547,-2.1641 -5.05953,-4.821429 -0.12603,-3.218381 2.62993,-5.816986 5.77381,-5.892856 3.70496,-0.08941 6.67957,3.095795 6.72619,6.726191 0.0538,4.191437 -3.56168,7.542851 -7.67857,7.559523 -4.67787,0.01894 -8.40663,-4.027596 -8.39285,-8.630954 0.0154,-5.164272 4.49351,-9.270768 9.58333,-9.226188 5.65066,0.04949 10.13518,4.959454 10.05952,10.535715"
transform="matrix(0.84223033,0,0,0.88263013,810.93075,407.36401)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

102
html/img/dead.svg Normal file
View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
id="svg3209"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="blinky.svg">
<title
id="title3238">dead</title>
<defs
id="defs3211" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="56.727193"
inkscape:cy="-67.066627"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1600"
inkscape:window-height="838"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata3214">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>dead</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-620.1475,-462.09155)">
<path
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1"
id="path3004"
sodipodi:cx="498.92856"
sodipodi:cy="598.61218"
sodipodi:rx="8.9285717"
sodipodi:ry="9.4642859"
d="m 507.85713,598.61218 a 8.9285717,9.4642859 0 1 1 -17.85714,0 8.9285717,9.4642859 0 1 1 17.85714,0 z"
transform="matrix(1.12,0,0,1.0188679,108.37794,-123.2272)" />
<path
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1"
id="path3004-1"
sodipodi:cx="498.92856"
sodipodi:cy="598.61218"
sodipodi:rx="8.9285717"
sodipodi:ry="9.4642859"
d="m 507.85713,598.61218 a 8.9285717,9.4642859 0 1 1 -17.85714,0 8.9285717,9.4642859 0 1 1 17.85714,0 z"
transform="matrix(1.12,0,0,1.0188679,90.163666,-123.45806)" />
<path
sodipodi:type="arc"
style="fill:#0000ff;fill-opacity:1"
id="path3026"
sodipodi:cx="482.2847"
sodipodi:cy="598.23547"
sodipodi:rx="2.841054"
sodipodi:ry="2.9673231"
d="m 485.12575,598.23547 a 2.841054,2.9673231 0 1 1 -5.68211,0 2.841054,2.9673231 0 1 1 5.68211,0 z"
transform="matrix(1.7599103,0,0,1.6850204,-195.64467,-521.61325)" />
<path
sodipodi:type="arc"
style="fill:#0000ff;fill-opacity:1"
id="path3026-7"
sodipodi:cx="482.2847"
sodipodi:cy="598.23547"
sodipodi:rx="2.841054"
sodipodi:ry="2.9673231"
d="m 485.12575,598.23547 a 2.841054,2.9673231 0 1 1 -5.68211,0 2.841054,2.9673231 0 1 1 5.68211,0 z"
transform="matrix(1.7599103,0,0,1.6850204,-176.65359,-521.91655)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
html/img/heart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

BIN
html/img/icon-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
html/img/icon-128_old.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

50
html/img/inky.svg Executable file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
id="svg3209"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="pinky">
<title
id="title3238">Inky</title>
<defs
id="defs3211" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="56.727193"
inkscape:cy="-67.066627"
inkscape:document-units="px"
inkscape:current-layer="g3048"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1148"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata3214">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Inky</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-620.1475,-462.09155)">
<g
id="g3048"
inkscape:label="#blinky"
transform="translate(169.6996,-110.9135)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<title
id="title3056">Blinky</title>
<path
inkscape:label="#Blinky"
style="fill:#80e5ff"
d="m 453.98527,630.78254 c -1.20261,-1.71697 -1.55219,-4.9583 -1.53689,-14.25 0.0359,-21.77874 2.19013,-29.87068 9.77706,-36.72501 5.18333,-4.68283 10.07002,-6.27246 19.24739,-6.26115 6.37329,0.008 8.45651,0.47101 13.42172,2.98399 11.10162,5.61871 13.56334,12.02522 14.22783,37.02721 0.37412,14.07623 0.26991,15.17032 -1.60658,16.86853 -2.62623,2.3767 -5.53748,1.59732 -10.77301,-2.8841 -2.27268,-1.94533 -4.53179,-3.53696 -5.02024,-3.53696 -0.48844,0 -2.64574,1.8 -4.79398,4 -2.14824,2.2 -4.66557,4 -5.59406,4 -0.9285,0 -3.86642,-1.8 -6.52873,-4 -5.38287,-4.44815 -6.50891,-4.75708 -8.50477,-2.33328 -1.68026,2.04055 -8.87298,7.33328 -9.96577,7.33328 -0.4363,0 -1.49378,-1.00013 -2.34997,-2.22251 z m 28.75904,-24.89453 c 1.20134,-0.61437 2.89994,-2.01574 3.77466,-3.11415 1.57615,-1.97921 1.61346,-1.97404 4.16388,0.57638 3.54047,3.54047 7.20236,4.28434 11.35124,2.30588 3.99841,-1.90671 4.67607,-5.32912 1.1547,-5.83152 -2.47068,-0.35249 -3.68426,-3.59046 -1.58413,-4.22664 4.84428,-1.46744 4.92389,-1.53759 3.90525,-3.44092 -1.36593,-2.55226 -6.46932,-4.52241 -9.64805,-3.7246 -1.43304,0.35967 -3.73322,1.78163 -5.11151,3.15992 l -2.50598,2.50598 -2.32267,-2.5062 c -4.5492,-4.90867 -12.1154,-4.15202 -15.04029,1.5041 -1.77559,3.43363 -1.79018,5.67231 -0.0573,8.79874 2.44707,4.41505 7.67237,6.16541 11.92024,3.99303 z m -0.93574,-7.33507 c -0.7754,-2.02068 0.3778,-3.54789 2.67902,-3.54789 1.40371,0 1.94098,0.692 1.94098,2.5 0,1.84621 -0.53124,2.5 -2.03139,2.5 -1.11726,0 -2.28213,-0.65345 -2.58861,-1.45211 z"
id="Blinky"
inkscape:connector-curvature="0">
<title
id="title3046">Blinky</title>
</path>
<path
transform="matrix(1.12,0,0,1.0188679,-61.321661,-12.313696)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.12,0,0,1.0188679,-79.535934,-12.544555)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004-1"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-365.34427,-410.69975)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-346.35319,-411.00305)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026-7"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

8
html/img/pinky.svg Executable file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="60"
height="60"
id="svg3209"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="blinky.svg">
<title
id="title3238">pinky</title>
<defs
id="defs3211" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="56.727193"
inkscape:cy="-67.066627"
inkscape:document-units="px"
inkscape:current-layer="g3048"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1148"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata3214">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>pinky</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-620.1475,-462.09155)">
<g
id="g3048"
inkscape:label="#blinky"
transform="translate(169.6996,-110.9135)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<title
id="title3056">Blinky</title>
<path
inkscape:label="#Blinky"
style="fill:#ff00ff"
d="m 453.98527,630.78254 c -1.20261,-1.71697 -1.55219,-4.9583 -1.53689,-14.25 0.0359,-21.77874 2.19013,-29.87068 9.77706,-36.72501 5.18333,-4.68283 10.07002,-6.27246 19.24739,-6.26115 6.37329,0.008 8.45651,0.47101 13.42172,2.98399 11.10162,5.61871 13.56334,12.02522 14.22783,37.02721 0.37412,14.07623 0.26991,15.17032 -1.60658,16.86853 -2.62623,2.3767 -5.53748,1.59732 -10.77301,-2.8841 -2.27268,-1.94533 -4.53179,-3.53696 -5.02024,-3.53696 -0.48844,0 -2.64574,1.8 -4.79398,4 -2.14824,2.2 -4.66557,4 -5.59406,4 -0.9285,0 -3.86642,-1.8 -6.52873,-4 -5.38287,-4.44815 -6.50891,-4.75708 -8.50477,-2.33328 -1.68026,2.04055 -8.87298,7.33328 -9.96577,7.33328 -0.4363,0 -1.49378,-1.00013 -2.34997,-2.22251 z m 28.75904,-24.89453 c 1.20134,-0.61437 2.89994,-2.01574 3.77466,-3.11415 1.57615,-1.97921 1.61346,-1.97404 4.16388,0.57638 3.54047,3.54047 7.20236,4.28434 11.35124,2.30588 3.99841,-1.90671 4.67607,-5.32912 1.1547,-5.83152 -2.47068,-0.35249 -3.68426,-3.59046 -1.58413,-4.22664 4.84428,-1.46744 4.92389,-1.53759 3.90525,-3.44092 -1.36593,-2.55226 -6.46932,-4.52241 -9.64805,-3.7246 -1.43304,0.35967 -3.73322,1.78163 -5.11151,3.15992 l -2.50598,2.50598 -2.32267,-2.5062 c -4.5492,-4.90867 -12.1154,-4.15202 -15.04029,1.5041 -1.77559,3.43363 -1.79018,5.67231 -0.0573,8.79874 2.44707,4.41505 7.67237,6.16541 11.92024,3.99303 z m -0.93574,-7.33507 c -0.7754,-2.02068 0.3778,-3.54789 2.67902,-3.54789 1.40371,0 1.94098,0.692 1.94098,2.5 0,1.84621 -0.53124,2.5 -2.03139,2.5 -1.11726,0 -2.28213,-0.65345 -2.58861,-1.45211 z"
id="Blinky"
inkscape:connector-curvature="0">
<title
id="title3046">Blinky</title>
</path>
<path
transform="matrix(1.12,0,0,1.0188679,-61.321661,-12.313696)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.12,0,0,1.0188679,-79.535934,-12.544555)"
d="m 507.85713,598.61218 c 0,5.22698 -3.99746,9.46429 -8.92857,9.46429 -4.93112,0 -8.92857,-4.23731 -8.92857,-9.46429 0,-5.22698 3.99745,-9.46428 8.92857,-9.46428 4.93111,0 8.92857,4.2373 8.92857,9.46428 z"
sodipodi:ry="9.4642859"
sodipodi:rx="8.9285717"
sodipodi:cy="598.61218"
sodipodi:cx="498.92856"
id="path3004-1"
style="fill:#ffffff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-365.34427,-410.69975)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
<path
transform="matrix(1.7599103,0,0,1.6850204,-346.35319,-411.00305)"
d="m 485.12575,598.23547 c 0,1.63881 -1.27198,2.96733 -2.84105,2.96733 -1.56907,0 -2.84106,-1.32852 -2.84106,-2.96733 0,-1.6388 1.27199,-2.96732 2.84106,-2.96732 1.56907,0 2.84105,1.32852 2.84105,2.96732 z"
sodipodi:ry="2.9673231"
sodipodi:rx="2.841054"
sodipodi:cy="598.23547"
sodipodi:cx="482.2847"
id="path3026-7"
style="fill:#0000ff;fill-opacity:1"
sodipodi:type="arc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
html/img/t-shirt.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

258
html/index.html Normal file
View File

@ -0,0 +1,258 @@
<!DOCTYPE html>
<!--<html lang="en">-->
<html lang="en" manifest="cache.manifest">
<head>
<meta charset="utf-8" />
<title>Pacman in HTML 5 Canvas</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="pacman-canvas.css">
<link rel="manifest" href="manifest.json">
<!-- SEO Stuff -->
<meta name="description" content="Play Pacman Canvas for free on your desktop or mobile. This whole game is open source an was created in HTML5." />
<link rel="canonical" href="http://pacman.platzh1rsch.ch/" />
<meta name="author" content="platzh1rsch.ch" />
<meta name="publisher" content="platzh1rsch.ch" />
<meta name="copyright" content="&copy; Copyright (c) platzh1rsch.ch" />
<meta name="robots" content="index,follow" />
<meta http-equiv="content-language" content="de">
<meta name="language" content="de">
<meta name="page-topic" content="Games/Arcade" />
<meta content="National" name="distribution" />
<meta content="pacman.platzh1rsch.ch" name="target" />
<!-- Facebook Open Graph Information -->
<meta property="og:image" content="http://pacman.platzh1rsch.ch/img/Icon-200x200.png"/>
<meta property="og:title" content="Pacman Canvas in HTML5" />
<meta property="og:description" content="Play Pacman Canvas for free on your desktop or mobile. This whole game is open source an was created in HTML5." />
<meta property="og:url" content="http://pacman.platzh1rsch.ch/" />
<meta property="og:site_name" content="Pacman Canvas in HTML5" />
<meta property="og:locale" content="en_US" />
<!-- site icons -->
<link rel="shortcut icon" href="img/Icon-130x130.png" />
<link rel="apple-touch-icon" href="img/Icon-130x130.png" />
<meta property="og:image" content="http://pacman.platzh1rsch.ch/img/Icon-130x130.png"/>
<!-- AppsFuel verification code -->
<meta name="appsfuel_code" content="83d3cedc1050a5c"/>
<!-- Mobile Viewport -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
<!-- Apple Mobile Web Capability -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- Script -->
<script src="js/jquery-1.10.2.min.js" type="text/javascript"></script>
<script src="js/jquery.hammer.min.js" type="text/javascript"></script>
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-28993174-1']);
_gaq.push(['_setDomainName', 'pacman.platzh1rsch.ch']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="container">
<div class="main">
<!-- Display this message if Javascript is disabled -->
<noscript>
<h2>Enable Javascript!</h2>
<p>This HTML 5 app requires Javascript to run. Please check that Javascript is enabled in your browser.</p>
</noscript>
<!-- Highscore -->
<div class="content" id="highscore-content">
<div class="button" id="back">&lt; back</div>
<div>
<h1>Highscore</h1>
<p>
<ol id="highscore-list">
</ol>
</p>
</div>
</div>
<!-- INSTRUCTIONS -->
<div class="content" id="instructions-content">
<div class="button" id="back">&lt; back</div>
<div>
<h1>Instructions</h1>
<div class="nomobile">
<h2>Controls</h2>
<p>Use your arrow keys or [W,A,S,D] keys to navigate pacman.</p>
<p>To pause / resume the game press [SPACE] or [ESC] or just click into the game area.</p>
</div>
<div class="mobile">
<h2>Controls</h2>
<p>Use swipe gestures to navigate pacman.</p>
<p>Alternatively use the Arrow Buttons underneath the game area to navigate pacman.</p>
<p>To pause / resume the game, touch the game area once.</p>
</div>
<div>
<h2>Ghosts</h2>
<p>Ghosts are creatures that hunt pacman and will kill him if they catch him.</p>
<p>Every ghost has its own strategy to chase down pacman.</p>
<h3>Inky<img src="img/inky.svg" class="pull-right"></h3>
Inky will stay in the ghost house until pacman has eaten at least 30 pills. His home is the bottom right corner.
<h3>Blinky <img src="img/blinky.svg" class="pull-right"></h3>
Blinky is the most agressive of the 4 ghosts. He will start chasing pacman right away, and aim directly at him. His home is the upper right corner.
<h3>Pinky<img src="img/pinky.svg" class="pull-right"></h3>
Pinky will start chasing pacman right away, he will always aim 4 fields ahead and 4 fields left of pacman. His home is the upper left corner.
<h3>Clyde<img src="img/clyde.svg" class="pull-right"></h3>
Inky will stay in the ghost house until pacman has eaten at least 2/3 of all pills. His home is the bottom left corner.
</div>
<div>
<h2>Ghost moods</h2>
The ghosts have two different moods that change the way they act during the game.
<h3>Scatter mood</h3>
<p>This is the default mood. When ghosts are in scatter mood, they will just go to their home corner and stay there.</p>
<img src="img/instructions/instructions_scatter.PNG">
<h3>Chase mood</h3>
<p>After a certain time the ghosts change their mood and want to go chasing pacman. This is indicated through the walls turning red.</p>
<img src="img/instructions/instructions_chase.PNG">
</div>
<div>
<h2>Items</h2>
<h3>Pills</h3>
<p>The goal of every level is, to eat all the white pills without getting catched by the ghosts. One pill results in 10 points.</p>
<h3>Powerpills</h3>
<p>In every level there are 4 powerpills, which are a bit bigger than the regular ones. If Pacman eats those, he will get strong enough to eat the ghosts. You can see this indicated by the ghosts turning blue. One powerpill results in 50 points.</p>
<img src="img/instructions/instructions_powerpill.PNG">
<p>Eating a ghost results in 100 points. The soul of the ghost will return to the ghost house before starting to chase Pacman again.</p>
</div>
</div>
</div>
<!-- main game content -->
<div class="content" id="game-content">
<!-- Google AdSense -->
<div id="adsense">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
style="display:inline-block;width:320px;height:50px"
data-ad-client="ca-pub-0176206735745791"
data-ad-slot="6492298622"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
<!-- main game content -->
<div class="game wrapper">
<div class="score">Score:</div>
<div class="level">Lvl:</div>
<div class="lives">Lives: </div>
<div class="controlSound">
<img src="img/audio-icon-mute.png" id="mute">
</div>
<!-- canvas is splitted into 18x13 fields -->
<div id="canvas-container">
<div id="canvas-overlay-container">
<div id="canvas-overlay-content">
<div id="title">Pacman Canvas</div>
<div><p id="text">Click to Play</p></div>
</div>
</div>
<canvas id="myCanvas" width="540" height="390">
<p>Canvas not supported</p>
</canvas>
</div>
<div class="controls" id="game-buttons">
<!-- Will be moved to Instructions
<p class="nomobile">Use W-A-S-D keys to navigate Pac-Man</p>
-->
<!-- OLD Buttons -->
<div>
<span id="up" class="controlButton">&uarr;</span>
</div>
<div>
<span id="left" class="controlButton">&larr;</span>
<span id="down" class="controlButton">&darr;</span>
<span id="right" class="controlButton">&rarr;</span>
</div>
</div>
<!-- inGame Controls End -->
<!-- Game Menu -->
<div class="controls" id="menu-buttons">
<ul>
<li class="button" id="newGame">New Game</li>
</ul>
</div>
<!-- Game Menu End -->
</div>
<div class="description nomobile">
<p>This whole thing was written in HTML5, CSS3 and Javascript (using small bits of jquery). For the basics I was following the <a href="http://devhammer.net/blog/exploring-html5-canvas-part-1---introduction" target="_blank">"Exploring HTML5 Canvas"</a> Tutorials (Part 1 - 6) by Devhammer. Thanks for the great Tutorial!</a>
<p>For some other stuff, like how to write objectorientated javascript I was following the tutorials over at <a href="http://www.codecademy.com/" target="_blank">http://www.codecademy.com/</a>, which is a really great site to learn Javascript and also other languages.</a>
<p>If you understand German you can also read my blogpost about this site: <a href="http://blog.platzh1rsch.ch/2012/08/pacman-in-html5-canvas.html">"Pacman in HTML5 Canvas"</a>.</p>
<span id="audio">
<audio id="theme" preload="auto">
<source src="wav/theme.wav" type="audio/wav">
<source src="mp3/theme.mp3" type="audio/mpeg">
</audio>
<audio id="waka" preload="auto">
<source src="wav/waka.wav" type="audio/wav">
<source src="mp3/waka.mp3" type="audio/mpeg">
</audio>
<audio id="die" preload="auto">
<source src="wav/die.wav" type="audio/wav">
<source src="mp3/die.mp3" type="audio/mpeg">
</audio>
<audio id="powerpill" preload="auto">
<source src="wav/powerpill.wav" type="audio/wav">
<source src="mp3/powerpill.mp3" type="audio/mpeg">
</audio>
</span>
</div>
</div>
</div>
</div>
<script src="pacman-canvas.js" type="text/javascript"></script>
</body>
</html>

6
html/js/jquery-1.10.2.min.js vendored Normal file

File diff suppressed because one or more lines are too long

8
html/js/jquery.hammer.min.js vendored Normal file

File diff suppressed because one or more lines are too long

0
html/js/pacman/ghost.js Normal file
View File

0
html/js/pacman/pacman.js Normal file
View File

419
html/js/virtualjoystick.js Normal file
View File

@ -0,0 +1,419 @@
var VirtualJoystick = function(opts)
{
opts = opts || {};
this._container = opts.container || document.body;
this._strokeStyle = opts.strokeStyle || 'cyan';
this._stickEl = opts.stickElement || this._buildJoystickStick();
this._baseEl = opts.baseElement || this._buildJoystickBase();
this._mouseSupport = opts.mouseSupport !== undefined ? opts.mouseSupport : false;
this._stationaryBase = opts.stationaryBase || false;
this._baseX = this._stickX = opts.baseX || 0
this._baseY = this._stickY = opts.baseY || 0
this._limitStickTravel = opts.limitStickTravel || false
this._stickRadius = opts.stickRadius !== undefined ? opts.stickRadius : 100
this._useCssTransform = opts.useCssTransform !== undefined ? opts.useCssTransform : false
this._container.style.position = "relative"
this._container.appendChild(this._baseEl)
this._baseEl.style.position = "absolute"
this._baseEl.style.display = "none"
this._container.appendChild(this._stickEl)
this._stickEl.style.position = "absolute"
this._stickEl.style.display = "none"
this._pressed = false;
this._touchIdx = null;
if(this._stationaryBase === true){
this._baseEl.style.display = "";
this._baseEl.style.left = (this._baseX - this._baseEl.width /2)+"px";
this._baseEl.style.top = (this._baseY - this._baseEl.height/2)+"px";
}
this._transform = this._useCssTransform ? this._getTransformProperty() : false;
this._has3d = this._check3D();
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
this._$onTouchStart = __bind(this._onTouchStart , this);
this._$onTouchEnd = __bind(this._onTouchEnd , this);
this._$onTouchMove = __bind(this._onTouchMove , this);
this._container.addEventListener( 'touchstart' , this._$onTouchStart , false );
this._container.addEventListener( 'touchend' , this._$onTouchEnd , false );
this._container.addEventListener( 'touchmove' , this._$onTouchMove , false );
if( this._mouseSupport ){
this._$onMouseDown = __bind(this._onMouseDown , this);
this._$onMouseUp = __bind(this._onMouseUp , this);
this._$onMouseMove = __bind(this._onMouseMove , this);
this._container.addEventListener( 'mousedown' , this._$onMouseDown , false );
this._container.addEventListener( 'mouseup' , this._$onMouseUp , false );
this._container.addEventListener( 'mousemove' , this._$onMouseMove , false );
}
}
VirtualJoystick.prototype.destroy = function()
{
this._container.removeChild(this._baseEl);
this._container.removeChild(this._stickEl);
this._container.removeEventListener( 'touchstart' , this._$onTouchStart , false );
this._container.removeEventListener( 'touchend' , this._$onTouchEnd , false );
this._container.removeEventListener( 'touchmove' , this._$onTouchMove , false );
if( this._mouseSupport ){
this._container.removeEventListener( 'mouseup' , this._$onMouseUp , false );
this._container.removeEventListener( 'mousedown' , this._$onMouseDown , false );
this._container.removeEventListener( 'mousemove' , this._$onMouseMove , false );
}
}
/**
* @returns {Boolean} true if touchscreen is currently available, false otherwise
*/
VirtualJoystick.touchScreenAvailable = function()
{
return 'createTouch' in document ? true : false;
}
/**
* microevents.js - https://github.com/jeromeetienne/microevent.js
*/
;(function(destObj){
destObj.addEventListener = function(event, fct){
if(this._events === undefined) this._events = {};
this._events[event] = this._events[event] || [];
this._events[event].push(fct);
return fct;
};
destObj.removeEventListener = function(event, fct){
if(this._events === undefined) this._events = {};
if( event in this._events === false ) return;
this._events[event].splice(this._events[event].indexOf(fct), 1);
};
destObj.dispatchEvent = function(event /* , args... */){
if(this._events === undefined) this._events = {};
if( this._events[event] === undefined ) return;
var tmpArray = this._events[event].slice();
for(var i = 0; i < tmpArray.length; i++){
var result = tmpArray[i].apply(this, Array.prototype.slice.call(arguments, 1))
if( result !== undefined ) return result;
}
return undefined
};
})(VirtualJoystick.prototype);
//////////////////////////////////////////////////////////////////////////////////
// //
//////////////////////////////////////////////////////////////////////////////////
VirtualJoystick.prototype.deltaX = function(){ return this._stickX - this._baseX; }
VirtualJoystick.prototype.deltaY = function(){ return this._stickY - this._baseY; }
VirtualJoystick.prototype.up = function(){
if( this._pressed === false ) return false;
var deltaX = this.deltaX();
var deltaY = this.deltaY();
if( deltaY >= 0 ) return false;
if( Math.abs(deltaX) > 2*Math.abs(deltaY) ) return false;
return true;
}
VirtualJoystick.prototype.down = function(){
if( this._pressed === false ) return false;
var deltaX = this.deltaX();
var deltaY = this.deltaY();
if( deltaY <= 0 ) return false;
if( Math.abs(deltaX) > 2*Math.abs(deltaY) ) return false;
return true;
}
VirtualJoystick.prototype.right = function(){
if( this._pressed === false ) return false;
var deltaX = this.deltaX();
var deltaY = this.deltaY();
if( deltaX <= 0 ) return false;
if( Math.abs(deltaY) > 2*Math.abs(deltaX) ) return false;
return true;
}
VirtualJoystick.prototype.left = function(){
if( this._pressed === false ) return false;
var deltaX = this.deltaX();
var deltaY = this.deltaY();
if( deltaX >= 0 ) return false;
if( Math.abs(deltaY) > 2*Math.abs(deltaX) ) return false;
return true;
}
//////////////////////////////////////////////////////////////////////////////////
// //
//////////////////////////////////////////////////////////////////////////////////
VirtualJoystick.prototype._onUp = function()
{
this._pressed = false;
this._stickEl.style.display = "none";
if(this._stationaryBase == false){
this._baseEl.style.display = "none";
this._baseX = this._baseY = 0;
this._stickX = this._stickY = 0;
}
}
VirtualJoystick.prototype._onDown = function(x, y)
{
this._pressed = true;
if(this._stationaryBase == false){
this._baseX = x;
this._baseY = y;
this._baseEl.style.display = "";
this._move(this._baseEl.style, (this._baseX - this._baseEl.width /2), (this._baseY - this._baseEl.height/2));
}
this._stickX = x;
this._stickY = y;
if(this._limitStickTravel === true){
var deltaX = this.deltaX();
var deltaY = this.deltaY();
var stickDistance = Math.sqrt( (deltaX * deltaX) + (deltaY * deltaY) );
if(stickDistance > this._stickRadius){
var stickNormalizedX = deltaX / stickDistance;
var stickNormalizedY = deltaY / stickDistance;
this._stickX = stickNormalizedX * this._stickRadius + this._baseX;
this._stickY = stickNormalizedY * this._stickRadius + this._baseY;
}
}
this._stickEl.style.display = "";
this._move(this._stickEl.style, (this._stickX - this._stickEl.width /2), (this._stickY - this._stickEl.height/2));
}
VirtualJoystick.prototype._onMove = function(x, y)
{
if( this._pressed === true ){
this._stickX = x;
this._stickY = y;
if(this._limitStickTravel === true){
var deltaX = this.deltaX();
var deltaY = this.deltaY();
var stickDistance = Math.sqrt( (deltaX * deltaX) + (deltaY * deltaY) );
if(stickDistance > this._stickRadius){
var stickNormalizedX = deltaX / stickDistance;
var stickNormalizedY = deltaY / stickDistance;
this._stickX = stickNormalizedX * this._stickRadius + this._baseX;
this._stickY = stickNormalizedY * this._stickRadius + this._baseY;
}
}
this._move(this._stickEl.style, (this._stickX - this._stickEl.width /2), (this._stickY - this._stickEl.height/2));
}
}
//////////////////////////////////////////////////////////////////////////////////
// bind touch events (and mouse events for debug) //
//////////////////////////////////////////////////////////////////////////////////
VirtualJoystick.prototype._onMouseUp = function(event)
{
return this._onUp();
}
VirtualJoystick.prototype._onMouseDown = function(event)
{
event.preventDefault();
var x = event.clientX;
var y = event.clientY;
return this._onDown(x, y);
}
VirtualJoystick.prototype._onMouseMove = function(event)
{
var x = event.clientX;
var y = event.clientY;
return this._onMove(x, y);
}
//////////////////////////////////////////////////////////////////////////////////
// comment //
//////////////////////////////////////////////////////////////////////////////////
VirtualJoystick.prototype._onTouchStart = function(event)
{
// if there is already a touch inprogress do nothing
if( this._touchIdx !== null ) return;
// notify event for validation
var isValid = this.dispatchEvent('touchStartValidation', event);
if( isValid === false ) return;
// dispatch touchStart
this.dispatchEvent('touchStart', event);
event.preventDefault();
// get the first who changed
var touch = event.changedTouches[0];
// set the touchIdx of this joystick
this._touchIdx = touch.identifier;
// forward the action
var x = touch.pageX;
var y = touch.pageY;
return this._onDown(x, y)
}
VirtualJoystick.prototype._onTouchEnd = function(event)
{
// if there is no touch in progress, do nothing
if( this._touchIdx === null ) return;
// dispatch touchEnd
this.dispatchEvent('touchEnd', event);
// try to find our touch event
var touchList = event.changedTouches;
for(var i = 0; i < touchList.length && touchList[i].identifier !== this._touchIdx; i++);
// if touch event isnt found,
if( i === touchList.length) return;
// reset touchIdx - mark it as no-touch-in-progress
this._touchIdx = null;
//??????
// no preventDefault to get click event on ios
event.preventDefault();
return this._onUp()
}
VirtualJoystick.prototype._onTouchMove = function(event)
{
// if there is no touch in progress, do nothing
if( this._touchIdx === null ) return;
// try to find our touch event
var touchList = event.changedTouches;
for(var i = 0; i < touchList.length && touchList[i].identifier !== this._touchIdx; i++ );
// if touch event with the proper identifier isnt found, do nothing
if( i === touchList.length) return;
var touch = touchList[i];
event.preventDefault();
var x = touch.pageX;
var y = touch.pageY;
return this._onMove(x, y)
}
//////////////////////////////////////////////////////////////////////////////////
// build default stickEl and baseEl //
//////////////////////////////////////////////////////////////////////////////////
/**
* build the canvas for joystick base
*/
VirtualJoystick.prototype._buildJoystickBase = function()
{
var canvas = document.createElement( 'canvas' );
canvas.width = 126;
canvas.height = 126;
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.strokeStyle = this._strokeStyle;
ctx.lineWidth = 6;
ctx.arc( canvas.width/2, canvas.width/2, 40, 0, Math.PI*2, true);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = this._strokeStyle;
ctx.lineWidth = 2;
ctx.arc( canvas.width/2, canvas.width/2, 60, 0, Math.PI*2, true);
ctx.stroke();
return canvas;
}
/**
* build the canvas for joystick stick
*/
VirtualJoystick.prototype._buildJoystickStick = function()
{
var canvas = document.createElement( 'canvas' );
canvas.width = 86;
canvas.height = 86;
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.strokeStyle = this._strokeStyle;
ctx.lineWidth = 6;
ctx.arc( canvas.width/2, canvas.width/2, 40, 0, Math.PI*2, true);
ctx.stroke();
return canvas;
}
//////////////////////////////////////////////////////////////////////////////////
// move using translate3d method with fallback to translate > 'top' and 'left'
// modified from https://github.com/component/translate and dependents
//////////////////////////////////////////////////////////////////////////////////
VirtualJoystick.prototype._move = function(style, x, y)
{
if (this._transform) {
if (this._has3d) {
style[this._transform] = 'translate3d(' + x + 'px,' + y + 'px, 0)';
} else {
style[this._transform] = 'translate(' + x + 'px,' + y + 'px)';
}
} else {
style.left = x + 'px';
style.top = y + 'px';
}
}
VirtualJoystick.prototype._getTransformProperty = function()
{
var styles = [
'webkitTransform',
'MozTransform',
'msTransform',
'OTransform',
'transform'
];
var el = document.createElement('p');
var style;
for (var i = 0; i < styles.length; i++) {
style = styles[i];
if (null != el.style[style]) {
return style;
}
}
}
VirtualJoystick.prototype._check3D = function()
{
var prop = this._getTransformProperty();
// IE8<= doesn't have `getComputedStyle`
if (!prop || !window.getComputedStyle) return module.exports = false;
var map = {
webkitTransform: '-webkit-transform',
OTransform: '-o-transform',
msTransform: '-ms-transform',
MozTransform: '-moz-transform',
transform: 'transform'
};
// from: https://gist.github.com/lorenzopolidori/3794226
var el = document.createElement('div');
el.style[prop] = 'translate3d(1px,1px,1px)';
document.body.insertBefore(el, null);
var val = getComputedStyle(el).getPropertyValue(map[prop]);
document.body.removeChild(el);
var exports = null != val && val.length && 'none' != val;
return exports;
}

23
html/manifest.json Normal file
View File

@ -0,0 +1,23 @@
{
"manifest_version": 2,
"name": "Pacman Canvas",
"version": "1.0.5",
"short_name": "Pacman Canvas",
"description": "An old classic, rewritten in HTML5",
"author": "Platzh1rsch",
"icons": {
"128": "img/icon-128.png"
},
"offline_enabled": true,
"app": {
"urls": ["http://pacman.platzh1rsch.ch/"],
"launch": {
"web_url": "http://pacman.platzh1rsch.ch"
}
}
}

BIN
html/mp3/die.mp3 Normal file

Binary file not shown.

BIN
html/mp3/eatghost.mp3 Normal file

Binary file not shown.

BIN
html/mp3/powerpill.mp3 Normal file

Binary file not shown.

BIN
html/mp3/theme.mp3 Normal file

Binary file not shown.

BIN
html/mp3/waka.mp3 Normal file

Binary file not shown.

7575
html/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

31
html/package.json Normal file
View File

@ -0,0 +1,31 @@
{
"name": "pacman-canvas",
"version": "1.0.5",
"description": "pacman-canvas =============",
"main": "pacman-canvas.js",
"scripts": {
"start": "node server.js",
"test": "jest",
"start:dev": "webpack serve --env NODE_ENV=local"
},
"repository": {
"type": "git",
"url": "git+https://github.com/platzhersh/pacman-canvas.git"
},
"author": "platzh1rsch",
"license": "ISC",
"bugs": {
"url": "https://github.com/platzhersh/pacman-canvas/issues"
},
"homepage": "https://github.com/platzhersh/pacman-canvas#readme",
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"@webpack-cli/serve": "^1.6.0",
"jest": "^26.6.3",
"webpack": "^5.27.2",
"webpack-cli": "^4.5.0",
"webpack-dev-server": "^3.11.2"
}
}

210
html/pacman-canvas.css Normal file
View File

@ -0,0 +1,210 @@
/* Google Web Fonts */
@font-face {
font-family: 'Press Start 2P';
font-style: normal;
font-weight: 400;
src: url('fonts/PressStart2Play.eot');
src: url('fonts/PressStart2Play.eot?iefix') format('eot'),
url('fonts/PressStart2Play.woff') format('woff'),
url('fonts/PressStart2Play.ttf') format('truetype');
}
/* ---------------- */
body {
background-color: #000;
color: white;
font-family: 'Press Start 2P', cursive;
}
/* Links */
.main a, .main a:link, .main a:active, .main a:visited {
padding: 5px;
background: #c80a0a;
color: rgb(255, 255, 255);
}
* { box-shadow: none !important; }
.content, h1, h2, h3, p, div {
font-family: 'Press Start 2P', cursive;
font-weight: normal;
}
.content[id*=-content]:not(#game-content) {
display: none;
overflow-y: auto;
overflow-x: hidden;
}
.content img {
max-width: 100%;
}
.pull-right {
float: right;
}
.button {
background: #c80a0a;
cursor: pointer;
padding: 8px;
}
#menu-buttons .button { background: rgba(0,0,0,0.4); }
#menu-buttons .button:hover, .button:hover { background: rgba(255,255,255,0.2); }
.button#back {
position: relative;
top: -25px;
display: inline-block;
}
.button#score-submit {
vertical-align: middle;
}
#highscore-form { margin-top: 8px; }
input[type="text"]:hover, input[type="text"]:focus, input[type="password"]:hover, input[type="password"]:focus, textarea:hover, textarea:focus {
border: 1px #c80a0a solid;
}
#highscore-list {}
#score { float: right; }
#myCanvas { border: none; display: block; background: rgb(0,0,0); width: 100%; height: auto;}
#canvas-container { position: relative;}
#canvas-overlay-container {
position: absolute;
background: rgba(0,0,0,0.7);
height: 100%;
width: 720px;
max-width: 100%;
padding: 1em;
box-sizing: border-box;
}
#canvas-overlay-content {
position: absolute;
top: 33%;
left: 0;
margin-top: 0;
max-width: 100%;
text-align: center;
width: 720px;
max-width: 100%;
padding: 1em;
box-sizing: border-box;
}
#canvas-overlay-content #title {
text-transform: uppercase;
font-size: 150%;
}
#invalid-score {
margin-top: 2em;
}
.canvas { position:absolute; padding-top: 20px;}
.main {width: 100%; max-width: 720px; margin: 10px auto; position: static; left: auto;}
.content { width: 100%; max-width: 720px; text-align: left; margin: 0;}
.container {text-align: center; margin:0; padding: 0;}
.wrapper { padding:0;}
.game { max-width: 720px; margin: auto; }
.about { font-size: 10px; margin-top: 20px; text-align: center; display: none;}
body, html { font-size: 15px; }
div.audio {}
audio {display: block; }
.score { width: 180px; }
.score, .lives, .level { display: inline-block; }
/* ---------- Controls ------------------------*/
.controls { text-align: center; margin-top: 15px;}
.controls-section {
height: auto;
width: 47%;
display: inline-block;
margin: 0;
text-align: left;
}
.controls-left { }
.controls-right .controlButton { position: relative; right: -65%; }
/* Arrow Keys - only displayed when game isn't paused */
#game-buttons { display: none; }
/* Game Menu - displayed when game is paused */
#menu-buttons ul, .controls#menu-buttons ul li{ list-style: none; padding: 0;}
#menu-buttons ul li {
height: 40px;
line-height: 40px;
font-size: 120%;
}
.controlSound {
background: url('img/audio-icon.png');
width: 73px;
height: 50px;
position: relative;
bottom: 5px;
background-size: 100%;
height: 25px;
width: 36px;
float: right;
}
#mute {
display: none;
width: 36px;
height: 25px;
}
.controlButton {
display: inline-block;
width: 90px;
height: 90px;
margin: 5px;
background: none repeat scroll 0% 0% #C80A0A;
line-height: 70px;
border-radius: 50%;
font-weight: bold;
font-size: 60px;
cursor: pointer;
}
.controlButton:hover, .controlButton:active {
background: #c00202;
}
.description { display: none; }
@media screen and (max-width: 1050px) {
html, body { background: rgb(0,0,0);}
}
@media screen and (max-width: 650px) {
.game { width: 93%;}
.content { max-width: none; }
#menu-buttons .button { background: rgba(255,255,255,0.1); }
.button:hover { background: rgba(255,255,255,0.3); }
.button#back { top: 0; }
}
@media screen and (max-width: 400px) {
.nomobile {display: none; }
.mobile {display: block; }
html, body {
overflow-x: hidden;
height: 100%;
}
.main { margin: 10px auto; }
.content { min-height: 0; }
.controlButton {
width: 60px;
height: 60px;
line-height: 40px;
font-size: 40px;
}
.controls-right .controlButton { right: -55%; }
/*canvas#myCanvas { margin: 5px auto; } */
}

1637
html/pacman-canvas.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
test('dummy test', () => {
expect((1 + 2)).toBe(3);
});

14
html/pacman-canvas.webapp Normal file
View File

@ -0,0 +1,14 @@
{
"name": "Pacman Canvas",
"description": "An old classic, rewritten in HTML5",
"launch_path": "/",
"version": "1.0.5",
"developer": {
"name": "platzh1rsch",
"url": "http://platzh1rsch.ch"
},
"icons": {
"128": "/img/icon-128.png"
},
"default_locale": "en"
}

20
html/server.js Normal file
View File

@ -0,0 +1,20 @@
var express = require('express');
var app = express();
var path = require('path');
var myLogger = function (req, res, next) {
console.log('GET ' + req.path)
next()
}
app.use(myLogger);
app.use(express.static('.'))
// viewed at http://localhost:8080
app.get('/', function (req, res, next) {
res.sendFile(path.join(__dirname + '/index.htm'));
});
var PORT = process.env.PORT || 8080;
app.listen(PORT, () => console.log('Server started at http://localhost:' + PORT));

499
html/style.css Normal file
View File

@ -0,0 +1,499 @@
/**********************************************************************************
.__ __ .__ ____ .__
______ | | _____ _/ |________| |__/_ |______ ______ ____ | |__
\____ \| | \__ \\ __\___ / | \| \_ __ \/ ___// ___\| | \
| |_> > |__/ __ \| | / /| Y \ || | \/\___ \\ \___| Y \
| __/|____(____ /__| /_____ \___| /___||__| /____ >\___ >___| / .ch
|__| \/ \/ \/ \/ \/
**********************************************************************************/
@font-face {
font-family: 'Socialico';
src: url(fonts/Socialico.otf) format('otf'),
url(fonts/Socialico.ttf) format('ttf');
src: local('Socialico'), local(Socialico),
url(fonts/Socialico.otf) format('opentype');
font-weight: normal;
font-style: normal;
}
a img { border: none; }
h1, h2, h3 {
font-family: 'Press Start 2P', cursive;
font-family: 'Codystar', cursive;
font-family: 'Acme', sans-serif;
text-transform: uppercase;
}
h1 { font-size: 2em; }
h2 { font-size: 1.7em; }
h3 { font-size: 1.5em; }
html, body {
width:100%;
font-family: 'Quando', serif;
font-size: 14px;
margin: 0;
padding: 0;
min-height: 100%;
height: 100%;
line-height: 23px;
background: url('img/bg-pattern-black.png') repeat;
text-align: center;
}
body {
overflow-x: hidden;
overflow-y: scroll;
}
div.layout {
margin: 0;
padding: 0;
}
aside { background-color: rgba(255, 255, 255, 0.1); }
aside > * { margin: 0 15px; padding: 15px 0; }
.wrapper { width: 100%; }
.mobile { display: none; }
.sidebar {
display: inline-block;
width: 320px;
float: left;
background: url(bg-pattern-green.png) repeat;
height: 100%;
position: fixed;
left: 0;
top: 0;
font-family: 'Acme', sans-serif;
text-transform: uppercase;
/*color: rgb(31,52,4); - dark green */
color: rgba(0,0,0,0.55);
text-align: left;
-webkit-box-shadow: 2px 2px 5px rgba(50, 50, 50, 0.75);
-moz-box-shadow: 2px 2px 5px rgba(50, 50, 50, 0.75);
box-shadow: 2px 2px 5px rgba(50, 50, 50, 0.75);
}
::selection {
background: rgba(24, 106, 12,0.7); /* Safari */
}
::-moz-selection {
background: rgba(24, 106, 12,0.7); /* Firefox */
}
/*---------------------------------------------------------------------
Sidebar: Navigation
*/
ul.nav {
list-style: none outside none;
font-size: 15px;
padding: 0;
margin: 0;
}
ul.nav.sub {
background-color: rgba(0,0,0,0.3);
background/*\**/: url(img/bg/black_30.png)\9;
display: none;
}
ul.nav.sub.active {
display: block;
}
ul.nav li {
line-height: 40px;
list-style: none outside none;
padding-left: 2em;
transition-property: background-color, padding-left;
transition-duration: 0.7s;
}
ul.nav.sub li{
padding-left: 2.8em;
}
ul.nav li:hover { background-color: rgba(255,255,255,0.2); background/*\**/: url(img/bg/white_20.png)\9; *background: url(img/bg/white_20.png); padding-left: 2.5em;}
ul.nav li.active { background-color: rgba(255,255,255,0.1); background/*\**/: url(img/bg/white_20.png)\9; *background: url(img/bg/white_20.png);}
ul.nav a, ul.nav a:link, ul.nav a:active, ul.nav a:visited, ul.nav a:hover, ul.nav a:focus { color: rgb(31,52,4); text-decoration: none; font-size: 1.5em;}
.main {
display: inline-block;
position: static;
margin: 0 auto;
text-align: left;
}
.header { display: none;}
.header, .content, .footer {
margin: 30px;
max-width: 700px;
background: rgba(0,0,0,0.4);
background/*\**/: url(img/bg/black_40.png)\9;
color: rgba(255,255,255,0.9);
color/*\**/: rgb(250,250,250)\9;
padding: 4em;
width: 700px;
-webkit-box-shadow: 2px 2px 5px rgba(50, 50, 50, 0.75);
-moz-box-shadow: 2px 2px 5px rgba(50, 50, 50, 0.75);
box-shadow: 2px 2px 5px rgba(50, 50, 50, 0.75);
}
.main a, .main a:link, .main a:active, .main a:visited {
/*color: rgba(20,20,20,0.9);
background: rgba(250,250,250,0.6);*/
/*color: rgba(255,255,255,0.8);
background: #367e20;*/
color: #367e20;
text-decoration: none;
}
.main a:hover, .main a:focus {
/*color: rgba(20,20,20,0.9);
text-decoration: none;
background: rgba(250,250,250,0.5);*/
text-decoration: underline;
color: #367e20;
}
.content {
min-height: 400px;
}
.logo {
width: 220px;
display: block;
margin: 30px auto 10px auto;
}
.social{
font-family: 'Socialico';
text-transform: none;
font-size: 40px;
text-align:center;
line-height: 55px;
vertical-align: top;
}
.social a, .social a:link, .social a:active, .social a:visited, .social a:hover, .social a:focus {
/*color: rgb(31, 52, 4); - dark green */
color: rgba(0,0,0,0.55);
text-decoration: none;
transition-property: opacity;
transition-duration: 0.3s;
}
.social a:hover {opacity: 0.8;}
/*---------------------------------------------------------------------
Boxes
*/
.box2, .box3 {
display: inline-block;
margin-right: 5px !important;
vertical-align: top;
}
.box2 {
width: 50%;
max-width: 320px;
}
.box3 {
width: 33%;
max-width: 205px;
}
div + .box2, div + box3 { margin: 5px !important;}
.portfolio-tile {
width: 200px;
height: 200px;
border: 1px solid rgba(0,0,0,0.5);
background: rgba(0,0,0,0.5);
display: inline-block;
margin-right: 10px;
margin-bottom: 10px;
}
.portfolio-tile:hover {
opacity: 0.8;
}
.portfolio-tile div {
visibility: hidden;
display: inline-block;
height: 35px;
width: 100%;
top: 165px;
line-height: 25px;
position: relative;
background: rgba(0,0,0,0.6);
background-size: 100%;
}
.portfolio-tile:hover div {
visibility: visible;
}
span.portfolio-label {
margin: auto 10px;
line-height: 35px;
height: 35px;
display: block;
vertical-align: middle;
color: #fff !important;
}
@media screen and (max-width: 1500px) {
.main {
position:absolute;
left: 320px;
}
}
@media screen and (max-width: 1040px) {
.box2 { width: 45%;}
.box3 { width: 27%;}
.portfolio-tile { width: 175px; height: 175px; }
.portfolio-tile div { top: 140px; }
}
@media screen and (max-width: 800px) {
.portfolio-tile { width: 150px; height: 150px; margin: 0 7px 7px 0;}
.portfolio-tile div { top: 115px; }
}
@media screen and (max-width: 650px) {
.portfolio-tile {
width: 200px;
height: 200px;
left: 50%;
position: relative;
margin-left: -100px;
display: block;
}
.portfolio-tile div {
top: 165px;
visibility: visible;
}
}
@media screen and (max-width: 320px) {
.box2 { width: 42%;}
.box3 { width: 25%;}
}
/*---------------------------------------------------------------------
Tables
*/
table {
width: 100%;
background-color: rgb(255,255,255);
color: rgba(0,0,0,0.9);
padding: 0;
border-spacing: 0;
/* padding: 1em; */
margin: 0.5em 0px !important;
overflow: auto;
}
td {
margin: 0;
padding: 1em;
}
thead {
font-weight: bold;
background: url(bg-pattern-green.png) repeat;
text-transform: uppercase;
}
tbody tr:nth-child(even){
background-color: #efefef;
}
/*---------------------------------------------------------------------
Forms
*/
input, select, textarea {
padding: 0.4em;
margin: 0.4em;
}
input[type=button], input[type=submit] {
background: #326a21;
text-transform: uppercase;
/*font-family: 'Acme',sans-serif;*/
border-radius: 15px;
color: #fff;
border: none;
}
input[type=text], input[type=password], textarea {
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset;
}
input[type=button]:hover, input[type=button]:focus, input[type=submit]:hover, input[type=submit]:focus {
background: #367e20;
cursor: pointer;
}
input[type=text]:hover, input[type=text]:focus, input[type=password]:hover, input[type=password]:focus, textarea:hover, textarea:focus {
border: 1px solid #009600;
}
/*---------------------------------------------------------------------
Swipe.js - Javascript Slider
*/
.swipe {
margin: 1em 0;
}
.swipe ul { padding: 0;}
.swipe li div {
padding: 1em;
background: rgba(255,255,255,0.2);
border-radius: 8px;
}
/* Mobile CSS - Medium (Tablets, small Screens) */
@media screen and (max-width: 1050px) {
.main {
background: rgba(0,0,0,0.4);
background/*\**/: url(img/bg/black_40.png)\9;
background-attachment: fixed;
}
.header, .content, .footer {
margin: 0;
max-width: none;
width: auto;
height:100%;
background: none;
}
}
/* Mobile CSS - Small (Smartphones) */
@media screen and (max-width: 650px) {
html, body { height: auto;}
.main { background: none; }
body { background: rgba(0,0,0,0.4);
background/*\**/: url(img/bg/black_40.png)\9;
}
h1 {
font-size: 1.8em;
}
.mobile {
display: block;
}
.nomobile {
display: none !important;
}
.logo {
height: 90px;
width: auto;
/*display: inline-block;
float: left;*/
margin: 5px auto 5px auto;
}
.sidebar {
width: 100%;
height: auto;
position:relative;
}
.header, .content, .footer {
margin: 0;
max-width: 650px;
/*padding: 5px 10px;*/
padding: 5px 0;
}
.main {
position: relative;
left: 0;
width: 100%;
overflow-x: hidden;
}
.header > *, .content > *, .footer > * {
margin: 5px 10px;
}
.footer { position: relative; margin-bottom: 0; height: 40px;}
ul.nav {
margin: 0;
text-align: center;
}
ul.nav.sub {
margin: 0 auto;
background: rgba(0,0,0,0.4);
}
ul.nav li, ul.nav.sub li{
padding: 0 0.5em;
margin: 0;
display: inline-block;
background: none;
}
ul.nav li:hover, ul.nav.sub li:hover {
padding: 0 0.5em;
}
}
@media screen and (max-width: 360px) {
ul.nav.sub li { display: block; }
.box2, .box3 { display: block; width: 100%;}
}
@media screen and (max-width: 320px) {
ul.nav li { margin: 0; padding: 0 0.3em;}
ul.nav li:hover, ul.nav.sub li:hover { padding: 0 0.3em; }
}
#adsense {
text-align: center;
display: block;
}
#adsense .adsbygoogle {
margin-left: auto;
margin-right: auto;
}

BIN
html/wav/die.wav Normal file

Binary file not shown.

BIN
html/wav/eatghost.wav Normal file

Binary file not shown.

BIN
html/wav/powerpill.wav Normal file

Binary file not shown.

BIN
html/wav/theme.wav Normal file

Binary file not shown.

BIN
html/wav/waka.wav Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
{
"verification_key": "eca78f4d-14f3-4fe7-8b44-3e0006a9a9c7",
"version": "1.0.5",
"type": "web",
"last_update": "2018-03-06 16:45:11+0000"
}

16
html/webpack.config.js Normal file
View File

@ -0,0 +1,16 @@
const path = require('path');
module.exports = (env) => {
console.log('NODE_ENV: ', env.NODE_ENV);
return {
entry: './',
mode: 'development',
devServer: {
port: 4200,
hot: true,
open: true,
openPage: 'index.htm'
}
}
};

2
start_nginx.sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/sh
/usr/sbin/nginx -g "daemon off;"