Commit 5a2134ed authored by Peter Pentchev's avatar Peter Pentchev

Imported Upstream version 1.2c

parents
# Makefile by kaw
# Requires PDCSDL, set PDCSDLDIR to point to a compiled version.
PDCSVER=3.4
PDCSDLDIR = ./PDCurses-$(PDCSVER)
PACKAGENAME = asciiportal-linux64
WINDOWSZIP = asciiportal.zip
GPPOPTS = -O2
all: asciiportal
clean:
rm -f *.o
rm -f asciiportal
fullclean: clean
rm -rf $(PACKAGENAME)
rm -f $(PACKAGENAME).tar.gz
rm -rf $(PDCSDLDIR)
package: fullclean asciiportal
strip asciiportal
upx asciiportal
mkdir $(PACKAGENAME)
unzip -d $(PACKAGENAME) $(WINDOWSZIP)
cp Makefile $(PACKAGENAME)/source
rm $(PACKAGENAME)/*.exe
rm $(PACKAGENAME)/*.bat
rm $(PACKAGENAME)/*.dll
cp asciiportal $(PACKAGENAME)/
tar cvfz $(PACKAGENAME).tar.gz $(PACKAGENAME)
%.o: %.cpp $(PDCSDLDIR)
g++ -I $(PDCSDLDIR) -c $(GPPOPTS) $<
asciiportal: al_input.o ap_draw.o ap_play.o ap_sound.o main.o menu.o $(PDCSDLDIR)/sdl1/libpdcurses.a
g++ $^ -lSDL -lSDL_mixer -o $@
$(PDCSDLDIR)/sdl1/libpdcurses.a: $(PDCSDLDIR)
cd `dirname $@` && make
$(PDCSDLDIR): PDCurses-$(PDCSVER).tar.gz
tar xvfz $<
PDCurses-$(PDCSVER).tar.gz:
wget http://sourceforge.net/projects/pdcurses/files/pdcurses/$(PDCSVER)/PDCurses-$(PDCSVER).tar.gz/download
if [[ ! -f $@ ]]; then echo "Download of $@ failed, please provide file."; exit; fi
This diff is collapsed.
// ASCIIpOrtal ver 1.2 by Joseph Larson
// Copyright (c) 2009 Joseph Larson
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// The source links with SDL, PDCurses compiled for SDL rendering (PDCSDL)
// and SDL mixer.
#ifndef AP_DRAW_H_INCLUDED
#define AP_DRAW_H_INCLUDED
int color_pair(int);
void fillscreen (int);
int displaystats (statstype, int);
void startscrollmessage (std::string);
void statusmessage (std::string);
void stopmessages ();
void scrollmessage ();
int findobj(XY);
int screenchar(int);
void map_screen (int, XY, XY, int, std::vector<std::vector<int> >&, int);
void draw_screen_angle (int player, int angle);
void draw_rotate (int, int);
void draw_screen (int);
void graphics_init (int, int, int, int, std::string);
void graphics_deinit ();
#endif // AP_DRAW_H_INCLUDED
This diff is collapsed.
// ASCIIpOrtal ver 1.2 by Joseph Larson
// Copyright (c) 2009 Joseph Larson
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// The source links with SDL, PDCurses compiled for SDL rendering (PDCSDL)
// and SDL mixer.
#ifndef AP_INPUT_H_INCLUDED
#define AP_INPUT_H_INCLUDED
int getinput ();
void flushinput ();
void restms(int);
int pollevent ();
int pauserun (int);
#endif // AP_INPUT_H_INCLUDED
This diff is collapsed.
// ASCIIpOrtal ver 1.2 by Joseph Larson
// Copyright (c) 2009 Joseph Larson
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// The source links with SDL, PDCurses compiled for SDL rendering (PDCSDL)
// and SDL mixer.
#ifndef AP_PLAY_H_INCLUDED
#define AP_PLAY_H_INCLUDED
int setup_level (int, std::string);
int hitswall(int, int);
int hitsobj(int, int, int);
int still_alive (int);
void fireportal (int, int);
int sc (int x);
int move_object (int);
int physics ();
int move_player (int);
int play (std::string);
#endif // AP_PLAY_H_INCLUDED
// ASCIIpOrtal ver 1.2 by Joseph Larson
// Copyright (c) 2009 Joseph Larson
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// The source links with SDL, PDCurses compiled for SDL rendering (PDCSDL)
// and SDL mixer.
#include <string>
#include <curses.h>
#include "asciiportal.h"
#ifndef __NOSOUND__
#ifndef __NOSLD__
#include "SDL/SDL.h"
#include "SDL/SDL_mixer.h"
using namespace std;
#include "ap_sound.h"
const int num_music_files = 5;
string music_files[num_music_files] = {
"ascii.ogg",
"ascii_threat2.ogg",
"ascii_threat3.ogg",
"yorkiimusic.ogg",
"ascii_threat4.ogg"
};
string sound_files[MAXSound] = {
"stub.wav", // SILENT
"win.wav", // WIN
"sizzle.wav", // SIZZLE
"collapseportals.wav", // COLAPSEPORTALS
"crush.wav", // CRUSH
"switchhit.wav", // SWITCHHIT
"dooropen.wav", // DOOROPEN
"doorclose.wav", // DOORCLOSE
"dispenser.wav", // DUPLICATE
"keyhit.wav", // MENUBEEP
"menuselect.wav", // MENUSELECT
"gunshot.wav", // GUNSHOT
"portalshot.wav", // PORTALCREATE
"portalmiss.wav", // PORTALFAIL
"portalthrough.wav", // THROUGH
"glad1.wav", // VOICE
"glad2.wav", // VOICE2
"glad3.wav", // VOICE3
"glad4.wav", // VOICE
"glad5.wav", // VOICE2
"glad6.wav", // VOICE3
"glad7.wav", // VOICE
"glad8.wav", // VOICE2
"glad9.wav", // VOICE3
"glad10.wav", // VOICE3
};
string current_music = music_files[0];
Mix_Chunk* soundEffects[MAXSound];
Mix_Music* ambience;
int sound_init () {
string name;
if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 1024 ) == -1 ) return false; //Initialize SDL_mixer
for (int c = 0; c < MAXSound; c++) {
#ifdef WIN32
name = "media\\" + sound_files[c];
#else
name = "media/" + sound_files[c];
#endif
soundEffects[c] = Mix_LoadWAV(name.c_str());
name.clear();
}
#ifdef WIN32
name = "media\\" + music_files[0];
#else
name = "media/" + music_files[0];
#endif
ambience = Mix_LoadMUS(name.c_str ());
name.clear();
if (ambience == NULL) return 0;
return 1;
}
int default_ambience (int selection) {
string name;
if ((selection < 0) || (selection > num_music_files)) selection = 0;
if (current_music == music_files[selection]) return 2;
if( Mix_PlayingMusic() == 0 ) Mix_HaltMusic();
Mix_FreeMusic(ambience);
#ifdef WIN32
name = "media\\" + music_files[selection];
#else
name = "media/" + music_files[selection];
#endif
ambience = Mix_LoadMUS(name.c_str ());
if (ambience == NULL) return 0;
current_music = music_files[selection];
return 1;
}
int load_ambience (string mappack, string filename) {
string name;
if (filename == current_music) return 2;
if( Mix_PlayingMusic() == 0 ) Mix_HaltMusic();
Mix_FreeMusic(ambience);
#ifdef WIN32
name = mappack + "\\" + filename;
#else
name = mappack + "/" + filename;
#endif
ambience = Mix_LoadMUS(name.c_str ());
if (ambience == NULL) {
default_ambience(0);
return 0;
}
current_music = filename;
return 1;
}
int start_ambience () {
if (Mix_PlayingMusic() == 1 ) return 2;
if (Mix_PlayMusic( ambience, -1 ) == -1 ) return 0;
return 1;
}
void stop_ambience () {
Mix_HaltMusic();
}
void toggle_ambience () {
if( Mix_PausedMusic() == 1 ) Mix_ResumeMusic();
else Mix_PauseMusic();
}
int play_sound (int c) {
if (Mix_PlayChannel( -1, soundEffects[c], 0 ) == -1) return 0;
return 1;
}
void deinit_sound () {
Mix_FreeMusic( ambience );
for (int c = 0; c < MAXSound; c++) Mix_FreeChunk(soundEffects[c]);
Mix_CloseAudio();
}
#endif
#endif
// ASCIIpOrtal ver 1.2 by Joseph Larson
// Copyright (c) 2009 Joseph Larson
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// The source links with SDL, PDCurses compiled for SDL rendering (PDCSDL)
// and SDL mixer.
#ifndef AP_SOUND_H_INCLUDED
#define AP_SOUND_H_INCLUDED
enum Sounds {
SILENT, WIN, SIZZLE, PORTALCOLLAPSE, CRUSH, SWITCHHIT, DOOROPEN, DOORCLOSE, DUPLICATE,
MENUBEEP, MENUCHOICE, GUNSHOT, PORTALCREATE, PORTALFAIL, THROUGH,
VOICE, VOICE2, VOICE3, VOICE4, VOICE5, VOICE6, VOICE7, VOICE8, VOICE9, VOICE0,
MAXSound
};
int sound_init ();
int default_ambience (int);
int load_ambience (std::string, std::string);
int start_ambience ();
void stop_ambience ();
void toggle_ambience ();
int play_sound (int);
void deinit_sound ();
#endif
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="asciiportal" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Release">
<Option output="bin\Release\asciiportal" prefix_auto="1" extension_auto="1" />
<Option object_output="obj\Release\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
<Add directory="c:\CodeBlocks\pdcurs33\win32" />
<Add directory="c:\CodeBlocks\pdcurs33" />
<Add directory="C:\CodeBlocks\SDL-1.2.13\lib" />
<Add directory="C:\CodeBlocks\SDL-1.2.13" />
</Compiler>
<ResourceCompiler>
<Add directory="c:\CodeBlocks\pdcurs33\win32" />
<Add directory="c:\CodeBlocks\pdcurs33" />
<Add directory="C:\CodeBlocks\SDL-1.2.13\lib" />
<Add directory="C:\CodeBlocks\SDL-1.2.13" />
</ResourceCompiler>
<Linker>
<Add option="-s" />
<Add library="C:\CodeBlocks\pdcurs33\sdl1\libpdc_sdl.a" />
<Add library="C:\CodeBlocks\SDL-1.2.13\lib\libSDL.dll.a" />
<Add library="C:\CodeBlocks\SDL-1.2.13\lib\libSDLmain.a" />
<Add directory="c:\CodeBlocks\pdcurs33\win32" />
<Add directory="c:\CodeBlocks\pdcurs33" />
<Add directory="C:\CodeBlocks\SDL-1.2.13\lib" />
<Add directory="C:\CodeBlocks\SDL-1.2.13" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add directory="C:\CodeBlocks\SDL-1.2.13\include" />
</Compiler>
<Linker>
<Add option="-lmingw32 -lSDLmain -lSDL -lSDL_mixer" />
<Add library="C:\CodeBlocks\pdcurs33\sdl1\libpdc_sdl.a" />
<Add library="C:\CodeBlocks\SDL-1.2.13\lib\libSDL.dll.a" />
<Add library="c:\CodeBlocks\SDL-1.2.13\lib\SDL_mixer.lib" />
<Add directory="C:\CodeBlocks\SDL-1.2.13\lib" />
</Linker>
<Unit filename="ap_draw.cpp" />
<Unit filename="ap_draw.h" />
<Unit filename="ap_input.cpp" />
<Unit filename="ap_input.h" />
<Unit filename="ap_play.cpp" />
<Unit filename="ap_play.h" />
<Unit filename="ap_sound.cpp" />
<Unit filename="ap_sound.h" />
<Unit filename="asciiportal.h" />
<Unit filename="main.cpp" />
<Unit filename="menu.cpp" />
<Unit filename="menu.h" />
<Extensions>
<code_completion />
<debugger />
</Extensions>
</Project>
</CodeBlocks_project_file>
// ASCIIpOrtal ver 1.2 by Joseph Larson
// Copyright (c) 2009 Joseph Larson
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// The source links with SDL, PDCurses compiled for SDL rendering (PDCSDL)
// and SDL mixer.
#ifndef ASCIIPORTAL_H_INCLUDED
#define ASCIIPORTAL_H_INCLUDED
//#define __NOSDL__
//#define __NOSOUND__
//#define __dingoo__
//#define __GP2X__
unsigned long long int get_microseconds();
enum GameObjs {
NONE, GOAL, LADDER, NORMAL, NONSTICK, LTREAD, RTREAD,
FFIELD, PFIELD, XFIELD, SPIKE,
MAXWall,
DUPLICATOR, SHOT1, SHOT2, PORTAL1, PORTAL2,
SWITCH, SWITCHON, DOOR, DOOR3, DOOR2, DOOR1,
BOX, BOULDER, PLAYER, TEXTTRIGGER, FLASH,
MAXObjects, // defined for ease of reference
PAUSE, MENUDIM, MENUSELECT, HELPMENU, TEXTFIELD,
MAXColors
};
class XY { // very simple class for keeping XY cooridnate pairs.
public:
int x; int y;
};
class object {
public:
XY coord;
int type, tick;
XY d;
};
class statstype {
public:
int numportals;
int numdeaths;
int numticks;
int numsteps;
void clear() {
numportals = 0;
numdeaths = 0;
numsteps = 0;
numticks = 0;
};
};
int loadmaps (std::string);
#endif // ASCIIPORTAL_H_INCLUDED
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN#############N#############N#############N NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN N N N NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN N N N NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN N N N NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN N N N NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN $ i h NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN $ i h NNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN @ $ & i & h NNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNN####"""""###########I#############H###########NNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# N $ $ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# N $1111$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# N $&&&&$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# N $&&&&$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# N $&&&&$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# $&&&&$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# $&&&&$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# $&&&&$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# $&&&&$ #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# ###### #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# N #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN# Q N #NNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#NNN""""""""""""""""""""""""NNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
message1:This is our storage. It may need some cleaning.
NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNN<<<<<<<NN
NNNNNNNNNNNNNNNN=======NN
NNNNNNNNNNNNNNNNlllllllNN
NN" <<<<<<<NN
NN##L##K##J##I##H###NNNNN
N
N
N
N
N
N
N
NNN&N
NNN=N
NNNgN
NNN N
NNN N
NNN N
NNN NNNNNNNNNNNNNNNN##"##NNNNNNNNNN
NNN NN NNNN
NNN NN 11111 NNNN
NNN NNNBNNNkjihlkjih$$+$$NNNBNBNNNNN
### #######hijklhijk + NNNNNNNNNNN
+ hijklhijk + b N
+ hijklhijk + b Q N
+#G##$$####NNNNNNNNN#####NNNNNNNNNNN
+ N
+ @ N
#######N
message1:One to the left and two to the right.
\ No newline at end of file
name:Portile7
message:I'm not trying to kill you. The boulders are.
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNN <
NNNNNNNNNNNNNNNNNNNNNNNNNNNN#=#NNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNN# #NNN
#######NNNNNNNNNNNNNNNNNNNNN# #NNN
#11111#NNNNNNNNNNNNNNNNNNNNN# #NNN
#11111####################### ##########
# @ 11% a #
#### % a Q #
NNN####% ######################A#######
NNNNNN#####
message1:Here's a hint. When you cross the field shoot a portal straight up, step up, and shoot a portal quickly on the ground in front of you. Then use your portal select to shoot move that portal to the ceiling, step forward a few steps, and move the portal back to the floor in front of you before you get hit by another boulder. Keep moving forward until you win.
\ No newline at end of file
name:Portile17
message:You're doing very well. I almost think you might survive this.
NNNNNNNNNN
# N
# N
# NNNNNNNNNNNN
# $$$ NN# #
# $$$ NN# #
# $Q NN# #N##########
# $$$$ NN# $$$ #N# #
# NN#$$$$ #N# #
# #N# #
############$$$$$ #N# $$$ #
NNNNNNNNNNN# ###$$$$ #
NNNNNNNNNNN# #
NNNNNNNNNNN############$$$$$ #
NNNNNNNNNNNNNNNNNNNNNN# #
NNNNNNNNNNNNNNNNNNNNNN# @ #
NNNNNNNNNNNNNNNNNNNNNN##########
\ No newline at end of file
message:Aim straight down before you hit the edge, fire, then move quicky as you fall.
########################################
# #
# @#
# (((((((((((((((((((((((((###
# #NNNNNNNNNNNNNNNNNNNNNNNNNNN
# #NNNNNNNNNNNNNNNNNNNNNNNNNNN
# #NNNNNNNNNNNNNNNNNNNNNNNNNNN
# #NNNNNNNNNNNNNNNNNNNNNNNNNNN
# #NNNNNNNNNNNNNNNNNNNNNNNNNNN
########### #NNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNN#"#NNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNN#"#NNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNN# #NNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNN# #######################NNNNN
NNNNNNNNNN# a N
NNNNNNNNNN# a Q N
NNNNNNNNNN####################A####NNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
name:Portile21
###########
#111111 #
#111111 #
#111111 #
# #
# #
# #
# @ ### #
#####N### #