diff --git a/.classpath b/.classpath index eab132d..fb50116 100644 --- a/.classpath +++ b/.classpath @@ -1,22 +1,6 @@ - - - - - - - - - - - - - - - - - + diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 3037395..0000000 --- a/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -bin - -build - -classes - -dist - -docs - -player.txt -DetailedInfo.txt -DetailedInfo.xml -*.png \ No newline at end of file diff --git a/.project b/.project index 0a18c3e..6305906 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - cs8803p3 + SuperPuzzle diff --git a/README.TXT b/README.TXT deleted file mode 100644 index b0f6a69..0000000 --- a/README.TXT +++ /dev/null @@ -1,12 +0,0 @@ -Adaptive Mario Instructions ---------------------------- - -Unzip the attached archive 'CS8803_P3.zip' and change to the new directory. - -To build Adaptive Mario: run 'ant clean' then 'ant' in this directory. - -To run Adaptive Mario: change to the 'dist' directory, then run java -jar CS8803_P3.jar - -For full instructions, see writeup/CS8803_P3.PDF. - -For assistance, please contact Woody Folsom or Marshall Gillson . \ No newline at end of file diff --git a/build.xml b/build.xml deleted file mode 100644 index b7941a6..0000000 --- a/build.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - simple example build file - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/grammars/overland.grm b/grammars/overland.grm deleted file mode 100644 index 5931caa..0000000 --- a/grammars/overland.grm +++ /dev/null @@ -1,45 +0,0 @@ -#VAR name = LevelComponent.TYPE -VAR S = LEVEL -VAR LAND_SEGMENT = LEVEL_SEGMENT -VAR LO_HI = LO_HI -VAR HI_LO = HI_LO -VAR LO_PATH = LO_PATH -VAR HI_PATH = HI_PATH -VAR lo_path = FLAT_LO -VAR hi_path = FLAT_HI - -### -#Coin Dive (Some empty blocks. The user climbs them and runs off; coins line their path as they fall back to the ground.) -#Free power-up. (Sets the player up to get a power-up with little or no challenge.) -#Straight. (A straight stretch of land with maybe one enemy and maybe some coins or blocks.) -#Single Pit (A pit that the user must jump over; rocks on either side.) -#Bowling Alley (A red koopa right before a long line of enemies. Kill them all in a row by throwing the shell.) -#Cannon Line (A stack of 2-3 canons.) -#Maze (A... y’know... maze.) -#Lemming Trap (A little pit with a few enemies that jump down into it.) -#Platform Jump (A bunch of platforms to jump between.) -#Pipe Jump (A bunch of thin pipes to jump between. This can be rendered much easier, because sometimes the space between the pipes is filled.) -### - -VAR coin_dive = COIN_DIVE -VAR power_up = POWER_UP -VAR single_pit = SINGLE_PIT -VAR bowling_alley = BOWLING_ALLEY -VAR cannon_line = CANNON_LINE -VAR maze = MAZE -VAR lemming_trap = LEMMING_TRAP -VAR platform_jump = PLATFORM_JUMP -VAR pipe_jump = PIPE_JUMP -VAR CHALLENGE = CHALLENGE - -#RULE name -> {probabilities}, (clause) [+,|] (clause)... -RULE S -> LAND_SEGMENT + LAND_SEGMENT -RULE LAND_SEGMENT -> {0.25,0.65,0.10}, (LO_HI + HI_LO) | (LO_PATH) | (LAND_SEGMENT + LAND_SEGMENT) -RULE LO_HI -> LO_PATH + CHALLENGE -RULE HI_LO -> CHALLENGE + LO_PATH -#RULE HI_PATH -> {0.10,0.60,0.30}, (HI_PATH + HI_PATH) | (hi_path + CHALLENGE + hi_path) | (hi_path) -RULE LO_PATH -> {0.10,0.60,0.30}, (LO_PATH + LO_PATH) | (lo_path + CHALLENGE + lo_path) | (lo_path) -RULE CHALLENGE -> {0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10}, coin_dive | power_up | lo_path | single_pit | bowling_alley | cannon_line | maze | lemming_trap | platform_jump | pipe_jump - -#START variable name -START = S \ No newline at end of file diff --git a/lib/antlr-3.4-complete-no-antlrv2.jar b/lib/antlr-3.4-complete-no-antlrv2.jar deleted file mode 100644 index bf0ad01..0000000 Binary files a/lib/antlr-3.4-complete-no-antlrv2.jar and /dev/null differ diff --git a/lib/drools-api-5.2.0.M1.jar b/lib/drools-api-5.2.0.M1.jar deleted file mode 100644 index 302c4d5..0000000 Binary files a/lib/drools-api-5.2.0.M1.jar and /dev/null differ diff --git a/lib/drools-compiler-5.3.0.Final.jar b/lib/drools-compiler-5.3.0.Final.jar deleted file mode 100644 index d6a1a5c..0000000 Binary files a/lib/drools-compiler-5.3.0.Final.jar and /dev/null differ diff --git a/lib/drools-core-5.3.0.Final.jar b/lib/drools-core-5.3.0.Final.jar deleted file mode 100644 index 65ddb7b..0000000 Binary files a/lib/drools-core-5.3.0.Final.jar and /dev/null differ diff --git a/lib/drools-decisiontables-5.3.0.Final.jar b/lib/drools-decisiontables-5.3.0.Final.jar deleted file mode 100644 index 101d740..0000000 Binary files a/lib/drools-decisiontables-5.3.0.Final.jar and /dev/null differ diff --git a/lib/drools-jsr94-5.3.0.Final.jar b/lib/drools-jsr94-5.3.0.Final.jar deleted file mode 100644 index 2bab5e9..0000000 Binary files a/lib/drools-jsr94-5.3.0.Final.jar and /dev/null differ diff --git a/lib/ecj.jar b/lib/ecj.jar deleted file mode 100644 index 683475a..0000000 Binary files a/lib/ecj.jar and /dev/null differ diff --git a/lib/jdom.jar b/lib/jdom.jar deleted file mode 100644 index 288e64c..0000000 Binary files a/lib/jdom.jar and /dev/null differ diff --git a/lib/junit-4.10.jar b/lib/junit-4.10.jar deleted file mode 100644 index bf5c0b9..0000000 Binary files a/lib/junit-4.10.jar and /dev/null differ diff --git a/lib/knowledge-api-5.3.0.Final.jar b/lib/knowledge-api-5.3.0.Final.jar deleted file mode 100644 index dd33d24..0000000 Binary files a/lib/knowledge-api-5.3.0.Final.jar and /dev/null differ diff --git a/lib/mvel2-2.1.Beta8.jar b/lib/mvel2-2.1.Beta8.jar deleted file mode 100644 index 1bbc05f..0000000 Binary files a/lib/mvel2-2.1.Beta8.jar and /dev/null differ diff --git a/lib/slf4j-api-1.6.4.jar b/lib/slf4j-api-1.6.4.jar deleted file mode 100644 index 4d23f41..0000000 Binary files a/lib/slf4j-api-1.6.4.jar and /dev/null differ diff --git a/lib/xstream-1.4.2.jar b/lib/xstream-1.4.2.jar deleted file mode 100644 index fa8e2ed..0000000 Binary files a/lib/xstream-1.4.2.jar and /dev/null differ diff --git a/lib/xuggle-xuggler.jar b/lib/xuggle-xuggler.jar deleted file mode 100644 index 1c94174..0000000 Binary files a/lib/xuggle-xuggler.jar and /dev/null differ diff --git a/readme.txt b/readme.txt deleted file mode 100644 index a3760bf..0000000 --- a/readme.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder. \ No newline at end of file diff --git a/res/Thumbs.db b/res/Thumbs.db deleted file mode 100644 index 55ece13..0000000 Binary files a/res/Thumbs.db and /dev/null differ diff --git a/res/abkey.png b/res/abkey.png deleted file mode 100644 index e2bd814..0000000 Binary files a/res/abkey.png and /dev/null differ diff --git a/res/bgsheet.png b/res/bgsheet.png deleted file mode 100644 index 0891db3..0000000 Binary files a/res/bgsheet.png and /dev/null differ diff --git a/res/endscene.gif b/res/endscene.gif deleted file mode 100644 index 73aa011..0000000 Binary files a/res/endscene.gif and /dev/null differ diff --git a/res/enemysheet.png b/res/enemysheet.png deleted file mode 100644 index 4a4880b..0000000 Binary files a/res/enemysheet.png and /dev/null differ diff --git a/res/firemariosheet.png b/res/firemariosheet.png deleted file mode 100644 index 16eeace..0000000 Binary files a/res/firemariosheet.png and /dev/null differ diff --git a/res/font.gif b/res/font.gif deleted file mode 100644 index 213d7a0..0000000 Binary files a/res/font.gif and /dev/null differ diff --git a/res/gameovergost.gif b/res/gameovergost.gif deleted file mode 100644 index 5199a2e..0000000 Binary files a/res/gameovergost.gif and /dev/null differ diff --git a/res/itemsheet.png b/res/itemsheet.png deleted file mode 100644 index 056880b..0000000 Binary files a/res/itemsheet.png and /dev/null differ diff --git a/res/keys.png b/res/keys.png deleted file mode 100644 index f72373e..0000000 Binary files a/res/keys.png and /dev/null differ diff --git a/res/logo.gif b/res/logo.gif deleted file mode 100644 index 3fd6fd2..0000000 Binary files a/res/logo.gif and /dev/null differ diff --git a/res/mapsheet.png b/res/mapsheet.png deleted file mode 100644 index 6e776a7..0000000 Binary files a/res/mapsheet.png and /dev/null differ diff --git a/res/mariosheet.png b/res/mariosheet.png deleted file mode 100644 index 9577595..0000000 Binary files a/res/mariosheet.png and /dev/null differ diff --git a/res/mus/smb3map1.mid b/res/mus/smb3map1.mid deleted file mode 100644 index e48140b..0000000 Binary files a/res/mus/smb3map1.mid and /dev/null differ diff --git a/res/mus/smb3ovr1.mid b/res/mus/smb3ovr1.mid deleted file mode 100644 index f0230fa..0000000 Binary files a/res/mus/smb3ovr1.mid and /dev/null differ diff --git a/res/mus/smb3undr.mid b/res/mus/smb3undr.mid deleted file mode 100644 index dc68de7..0000000 Binary files a/res/mus/smb3undr.mid and /dev/null differ diff --git a/res/mus/smwfortress.mid b/res/mus/smwfortress.mid deleted file mode 100644 index ccf3fda..0000000 Binary files a/res/mus/smwfortress.mid and /dev/null differ diff --git a/res/mus/smwovr1.mid b/res/mus/smwovr1.mid deleted file mode 100644 index 3c8b724..0000000 Binary files a/res/mus/smwovr1.mid and /dev/null differ diff --git a/res/mus/smwovr2.mid b/res/mus/smwovr2.mid deleted file mode 100644 index 5e6c9d4..0000000 Binary files a/res/mus/smwovr2.mid and /dev/null differ diff --git a/res/mus/smwtitle.mid b/res/mus/smwtitle.mid deleted file mode 100644 index 5e79707..0000000 Binary files a/res/mus/smwtitle.mid and /dev/null differ diff --git a/res/particlesheet.png b/res/particlesheet.png deleted file mode 100644 index 45c282e..0000000 Binary files a/res/particlesheet.png and /dev/null differ diff --git a/res/racoonmariosheet.png b/res/racoonmariosheet.png deleted file mode 100644 index 4dae024..0000000 Binary files a/res/racoonmariosheet.png and /dev/null differ diff --git a/res/smallmariosheet.png b/res/smallmariosheet.png deleted file mode 100644 index 52aae25..0000000 Binary files a/res/smallmariosheet.png and /dev/null differ diff --git a/res/snd/1-up.wav b/res/snd/1-up.wav deleted file mode 100644 index 6b94a69..0000000 Binary files a/res/snd/1-up.wav and /dev/null differ diff --git a/res/snd/breakblock.wav b/res/snd/breakblock.wav deleted file mode 100644 index 60c85bc..0000000 Binary files a/res/snd/breakblock.wav and /dev/null differ diff --git a/res/snd/bump.wav b/res/snd/bump.wav deleted file mode 100644 index 5ab8c03..0000000 Binary files a/res/snd/bump.wav and /dev/null differ diff --git a/res/snd/cannon.wav b/res/snd/cannon.wav deleted file mode 100644 index 500c4c2..0000000 Binary files a/res/snd/cannon.wav and /dev/null differ diff --git a/res/snd/coin.wav b/res/snd/coin.wav deleted file mode 100644 index eb4baa0..0000000 Binary files a/res/snd/coin.wav and /dev/null differ diff --git a/res/snd/death.wav b/res/snd/death.wav deleted file mode 100644 index 206db23..0000000 Binary files a/res/snd/death.wav and /dev/null differ diff --git a/res/snd/exit.wav b/res/snd/exit.wav deleted file mode 100644 index 6f9c8fc..0000000 Binary files a/res/snd/exit.wav and /dev/null differ diff --git a/res/snd/fireball.wav b/res/snd/fireball.wav deleted file mode 100644 index 61c2f19..0000000 Binary files a/res/snd/fireball.wav and /dev/null differ diff --git a/res/snd/jump.wav b/res/snd/jump.wav deleted file mode 100644 index c2833ea..0000000 Binary files a/res/snd/jump.wav and /dev/null differ diff --git a/res/snd/kick.wav b/res/snd/kick.wav deleted file mode 100644 index e3248f1..0000000 Binary files a/res/snd/kick.wav and /dev/null differ diff --git a/res/snd/message.wav b/res/snd/message.wav deleted file mode 100644 index b05ca41..0000000 Binary files a/res/snd/message.wav and /dev/null differ diff --git a/res/snd/pipe.wav b/res/snd/pipe.wav deleted file mode 100644 index 2d4186e..0000000 Binary files a/res/snd/pipe.wav and /dev/null differ diff --git a/res/snd/powerdown.wav b/res/snd/powerdown.wav deleted file mode 100644 index 662b534..0000000 Binary files a/res/snd/powerdown.wav and /dev/null differ diff --git a/res/snd/powerup.wav b/res/snd/powerup.wav deleted file mode 100644 index 694421a..0000000 Binary files a/res/snd/powerup.wav and /dev/null differ diff --git a/res/snd/sprout.wav b/res/snd/sprout.wav deleted file mode 100644 index f8ee602..0000000 Binary files a/res/snd/sprout.wav and /dev/null differ diff --git a/res/snd/stagestart.wav b/res/snd/stagestart.wav deleted file mode 100644 index 41531bf..0000000 Binary files a/res/snd/stagestart.wav and /dev/null differ diff --git a/res/snd/stomp.wav b/res/snd/stomp.wav deleted file mode 100644 index d460545..0000000 Binary files a/res/snd/stomp.wav and /dev/null differ diff --git a/res/test.lvl b/res/test.lvl deleted file mode 100644 index 97a1c29..0000000 Binary files a/res/test.lvl and /dev/null differ diff --git a/res/tiles.dat b/res/tiles.dat deleted file mode 100644 index d558418..0000000 Binary files a/res/tiles.dat and /dev/null differ diff --git a/res/title.gif b/res/title.gif deleted file mode 100644 index 2c309aa..0000000 Binary files a/res/title.gif and /dev/null differ diff --git a/res/tweak.gif b/res/tweak.gif deleted file mode 100644 index 61073c6..0000000 Binary files a/res/tweak.gif and /dev/null differ diff --git a/res/worldmap.png b/res/worldmap.png deleted file mode 100644 index 467ad81..0000000 Binary files a/res/worldmap.png and /dev/null differ diff --git a/rules/LevelTunerRules.drl b/rules/LevelTunerRules.drl deleted file mode 100644 index b318ba9..0000000 --- a/rules/LevelTunerRules.drl +++ /dev/null @@ -1,33 +0,0 @@ -package dk.itu.mario.level; - -rule "NoviceJumper" - when - playerProfile : PlayerProfile( jumpSkill <= 20 ) // condition - then - System.out.println("PlayerProfile indicates NoviceJumper. Disabling Pipe challenge."); // consequence - playerProfile.setDisabled(LevelComponent.TYPE.PIPE_JUMP); -end - -rule "BeginnerJumper" - when - playerProfile : PlayerProfile( jumpSkill > 20 ) // condition - then - System.out.println("PlayerProfile indicates Beginner (or better) Jumper. Pipe challenge enabled!"); // consequence - playerProfile.setEnabled(LevelComponent.TYPE.PIPE_JUMP); -end - -rule "NoviceRunner" - when - playerProfile : PlayerProfile( runSkill <= 20 ) // condition - then - System.out.println("PlayerProfile indicates NoviceRunner. Disabling Maze challenge."); // consequence - playerProfile.setDisabled(LevelComponent.TYPE.MAZE); -end - -rule "BeginnerRunner" - when - playerProfile : PlayerProfile( runSkill > 20 ) // condition - then - System.out.println("PlayerProfile indicates Beginner (or better) Runner. Maze challenge enabled!"); // consequence - playerProfile.setEnabled(LevelComponent.TYPE.MAZE); -end \ No newline at end of file diff --git a/src/dk/itu/.DS_Store b/src/dk/itu/.DS_Store deleted file mode 100644 index 1286b83..0000000 Binary files a/src/dk/itu/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/.DS_Store b/src/dk/itu/mario/.DS_Store deleted file mode 100644 index f290035..0000000 Binary files a/src/dk/itu/mario/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/MarioInterface/.DS_Store b/src/dk/itu/mario/MarioInterface/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/src/dk/itu/mario/MarioInterface/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/MarioInterface/Constraints.java b/src/dk/itu/mario/MarioInterface/Constraints.java deleted file mode 100644 index d2d0877..0000000 --- a/src/dk/itu/mario/MarioInterface/Constraints.java +++ /dev/null @@ -1,10 +0,0 @@ -package dk.itu.mario.MarioInterface; - -public interface Constraints { - // the submitted level should has exactly the following information - public static int levelWidth= 320; - public static int gaps = 10; - public static int turtels = 7; - public static int coinBlocks = 10; - -} diff --git a/src/dk/itu/mario/MarioInterface/GamePlay.java b/src/dk/itu/mario/MarioInterface/GamePlay.java deleted file mode 100644 index a2a30f0..0000000 --- a/src/dk/itu/mario/MarioInterface/GamePlay.java +++ /dev/null @@ -1,107 +0,0 @@ -package dk.itu.mario.MarioInterface; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -public class GamePlay implements Serializable { - - private static final long serialVersionUID = 1L; - public static final GamePlay DEFAULT_PROFILE = new GamePlay(); - public boolean isDefault = false; - - public int completionTime; // counts only the current run on the level, - // excluding death games - public int totalTime;// sums all the time, including from previous games if - // player died - public int jumpsNumber; // total number of jumps - public int duckNumber; // total number of ducks - public int timeSpentDucking; // time spent in ducking mode - public int timesPressedRun;// number of times the run key pressed - public int timeSpentRunning; // total time spent running - public int timeRunningRight; // total time spent running to the right - public int timeRunningLeft;// total time spent running to the left - public int emptyBlocksDestroyed; // number of empty blocks destroyed - public int coinsCollected; // number of coins collected - public int coinBlocksDestroyed; // number of coin block destroyed - public int powerBlocksDestroyed; // number of power block destroyed - public int kickedShells; // number of shells Mario kicked - public int enemyKillByFire; // number of enemies killed by shooting them - public int enemyKillByKickingShell; // number of enemies killed by kicking a - // shell on them - public int totalTimeLittleMode; // total time spent in little mode - public int totalTimeLargeMode; // total time spent in large mode - public int totalTimeFireMode; // total time spent in fire mode - public int timesSwichingPower; // number of Times Switched Between Little, - // Large or Fire Mario - public double aimlessJumps; // number of jumps without a reason - public double percentageBlocksDestroyed; // percentage of all blocks - // destroyed - public double percentageCoinBlocksDestroyed; // percentage of coin blocks - // destroyed - public double percentageEmptyBlockesDestroyed; // percentage of empty blocks - // destroyed - public double percentagePowerBlockDestroyed; // percentage of power blocks - // destroyed - public double timesOfDeathByFallingIntoGap; // number of death by falling - // into a gap - public int totalEnemies; // total number of enemies - public int totalEmptyBlocks; // total number of empty blocks - public int totalCoinBlocks; // total number of coin blocks - public int totalpowerBlocks; // total number of power blocks - public int totalCoins; // total number of coins - public int timesOfDeathByRedTurtle; // number of times Mario died by red - // turtle - public int timesOfDeathByGoomba; // number of times Mario died by Goomba - public int timesOfDeathByGreenTurtle; // number of times Mario died by green - // turtle - public int timesOfDeathByArmoredTurtle; // number of times Mario died by - // Armored turtle - public int timesOfDeathByJumpFlower; // number of times Mario died by Jump - // Flower - public int timesOfDeathByCannonBall; // number of time Mario died by Cannon - // Ball - public int timesOfDeathByChompFlower; // number of times Mario died by Chomp - // Flower - public int RedTurtlesKilled; // number of Red Turtle Mario killed - public int GreenTurtlesKilled;// number of Green Turtle Mario killed - public int ArmoredTurtlesKilled; // number of Armored Turtle Mario killed - public int GoombasKilled; // number of Goombas Mario killed - public int CannonBallKilled; // number of Cannon Ball Mario killed - public int JumpFlowersKilled; // number of Jump Flower Mario killed - public int ChompFlowersKilled; // number of Chomp Flower Mario killed - - public void write(String fileName) { - ObjectOutputStream out = null; - try { - FileOutputStream fos = new FileOutputStream(fileName); - out = new ObjectOutputStream(fos); - out.writeObject(this); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - - public static GamePlay read(String fileName) { - FileInputStream fis = null; - ObjectInputStream in = null; - GamePlay gp = null; - try { - fis = new FileInputStream(fileName); - in = new ObjectInputStream(fis); - gp = (GamePlay) in.readObject(); - } catch (Exception e) { - // TODO Auto-generated catch block - // e.printStackTrace(); - System.out.println("Unable to read from GamePlay file: " + fileName - + ", initializing a new GamePlay instance."); - gp = GamePlay.DEFAULT_PROFILE; - gp.isDefault = true; - } - return gp; - } -} diff --git a/src/dk/itu/mario/MarioInterface/LevelGenerator.java b/src/dk/itu/mario/MarioInterface/LevelGenerator.java deleted file mode 100644 index 8ae12bd..0000000 --- a/src/dk/itu/mario/MarioInterface/LevelGenerator.java +++ /dev/null @@ -1,11 +0,0 @@ -package dk.itu.mario.MarioInterface; - -import dk.itu.mario.engine.DataRecorder; - -public interface LevelGenerator { - public int generateLevelDifficulty (GamePlay playerMetrics, DataRecorder detailedInfo); - public int generateLevelType (GamePlay playerMetrics, DataRecorder detailedInfo); - public LevelInterface generateLevel (GamePlay playerMetrics); - public LevelInterface generateLevel (String detailedInfo); - public LevelInterface generateLevel (GamePlay playerMetrics, DataRecorder detailedInfo); -} diff --git a/src/dk/itu/mario/MarioInterface/LevelInterface.java b/src/dk/itu/mario/MarioInterface/LevelInterface.java deleted file mode 100644 index 9a2cb59..0000000 --- a/src/dk/itu/mario/MarioInterface/LevelInterface.java +++ /dev/null @@ -1,41 +0,0 @@ -package dk.itu.mario.MarioInterface; - -import dk.itu.mario.engine.sprites.SpriteTemplate; - -public interface LevelInterface { - - public static byte[] TILE_BEHAVIORS = new byte[256]; - - public static final int TYPE_OVERGROUND = 0; - public static final int TYPE_UNDERGROUND = 1; - public static final int TYPE_CASTLE = 2; - - public static final int BIT_BLOCK_UPPER = 1 << 0; - public static final int BIT_BLOCK_ALL = 1 << 1; - public static final int BIT_BLOCK_LOWER = 1 << 2; - public static final int BIT_SPECIAL = 1 << 3; //mashroom or flower - public static final int BIT_BUMPABLE = 1 << 4; - public static final int BIT_BREAKABLE = 1 << 5; - public static final int BIT_PICKUPABLE = 1 << 6; - public static final int BIT_ANIMATED = 1 << 7; - - public void tick(); - - //Map of WIDTH * HEIGHT that contains the level's design - public byte[][] getMap(); - - //Map of WIDTH * HEIGHT and contains the placement and type enemies - public SpriteTemplate[][] getSpriteTemplates(); - - public int getWidth(); - - public int getHeight(); - - //These are the place where the level ends - public int getxExit(); - - public int getyExit(); - - public String getName(); - -} diff --git a/src/dk/itu/mario/engine/.DS_Store b/src/dk/itu/mario/engine/.DS_Store deleted file mode 100644 index 416e06e..0000000 Binary files a/src/dk/itu/mario/engine/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/engine/ArgParser.java b/src/dk/itu/mario/engine/ArgParser.java deleted file mode 100644 index f2fd9c5..0000000 --- a/src/dk/itu/mario/engine/ArgParser.java +++ /dev/null @@ -1,27 +0,0 @@ -package dk.itu.mario.engine; - -public class ArgParser { - public static ParsedArgs parse(String[] cmdLineArgs) { - ParsedArgs parsedArgs = new ParsedArgs(); - for (int i = 0; i < cmdLineArgs.length; i++) { - if (cmdLineArgs[i].toUpperCase().startsWith("GENERATOR=")) { - String generatorClass = cmdLineArgs[i].split("=")[1]; - parsedArgs.setGeneratorClass(generatorClass); - System.out.println("Generator class set to: " + generatorClass); - } else if (cmdLineArgs[i].toUpperCase().startsWith("SEED=")) { - String levelRandSeed = cmdLineArgs[i].split("=")[1]; - if (parsedArgs.setLevelRandSeed(levelRandSeed)) { - System.out.println("Level randomizer seed set to: " + levelRandSeed); - } else { - System.out.println("Unable to parse value of levelRandSeed: " - + levelRandSeed +". Keeping default value of: " - + parsedArgs.getLevelRandSeed()); - } - } else if (cmdLineArgs[i].toUpperCase().startsWith("VIDEO=")) { - String videoFileName = cmdLineArgs[i].split("=")[1]; - parsedArgs.setVideoFileName(videoFileName); - } - } - return parsedArgs; - } -} diff --git a/src/dk/itu/mario/engine/Art.java b/src/dk/itu/mario/engine/Art.java deleted file mode 100644 index 686fee7..0000000 --- a/src/dk/itu/mario/engine/Art.java +++ /dev/null @@ -1,192 +0,0 @@ -package dk.itu.mario.engine; - -import java.awt.AlphaComposite; -import java.awt.Graphics2D; -import java.awt.GraphicsConfiguration; -import java.awt.Image; -import java.awt.Transparency; -import java.awt.image.BufferedImage; -import java.io.IOException; - -import javax.imageio.ImageIO; -import javax.sound.midi.MidiSystem; -import javax.sound.midi.Sequence; -import javax.sound.midi.Sequencer; - - -import dk.itu.mario.engine.sonar.SonarSoundEngine; -import dk.itu.mario.engine.sonar.sample.SonarSample; -import java.io.InputStream; - - -public class Art -{ - public static final int SAMPLE_BREAK_BLOCK = 0; - public static final int SAMPLE_GET_COIN = 1; - public static final int SAMPLE_MARIO_JUMP = 2; - public static final int SAMPLE_MARIO_STOMP = 3; - public static final int SAMPLE_MARIO_KICK = 4; - public static final int SAMPLE_MARIO_POWER_UP = 5; - public static final int SAMPLE_MARIO_POWER_DOWN = 6; - public static final int SAMPLE_MARIO_DEATH = 7; - public static final int SAMPLE_ITEM_SPROUT = 8; - public static final int SAMPLE_CANNON_FIRE = 9; - public static final int SAMPLE_SHELL_BUMP = 10; - public static final int SAMPLE_LEVEL_EXIT = 11; - public static final int SAMPLE_MARIO_1UP = 12; - public static final int SAMPLE_MARIO_FIREBALL = 13; - - public static Image[][] mario; - public static Image[][] smallMario; - public static Image[][] fireMario; - public static Image[][] enemies; - public static Image[][] items; - public static Image[][] level; - public static Image[][] particles; - public static Image[][] font; - public static Image[][] bg; - public static Image[][] map; - public static Image[][] endScene; - public static Image[][] gameOver; - public static Image logo; - public static Image titleScreen; - public static Image keys, abkey; - - public static SonarSample[] samples = new SonarSample[100]; - - private static Sequence[] songs = new Sequence[10]; - private static Sequencer sequencer; - - public static boolean mute = false; - private static final String PREFIX="/res"; - - - public static void init(GraphicsConfiguration gc, SonarSoundEngine sound) - { - try - { - mario = cutImage(gc, PREFIX+"/mariosheet.png", 32, 32); - smallMario = cutImage(gc, PREFIX+"/smallmariosheet.png", 16, 16); - fireMario = cutImage(gc, PREFIX+"/firemariosheet.png", 32, 32); - enemies = cutImage(gc, PREFIX+"/enemysheet.png", 16, 32); - items = cutImage(gc,PREFIX+ "/itemsheet.png", 16, 16); - level = cutImage(gc, PREFIX+"/mapsheet.png", 16, 16); - map = cutImage(gc, PREFIX+"/worldmap.png", 16, 16); - particles = cutImage(gc, PREFIX+"/particlesheet.png", 8, 8); - bg = cutImage(gc,PREFIX+ "/bgsheet.png", 32, 32); - logo = getImage(gc, PREFIX+"/logo.gif"); - titleScreen = getImage(gc, PREFIX+"/title.gif"); - font = cutImage(gc, PREFIX+"/font.gif", 8, 8); - endScene = cutImage(gc,PREFIX+ "/endscene.gif", 96, 96); - gameOver = cutImage(gc, PREFIX+"/gameovergost.gif", 96, 64); - keys = getImage(gc, PREFIX+"/keys.png"); - abkey = getImage(gc, PREFIX+"/abkey.png"); - - if (sound != null) - { - samples[SAMPLE_BREAK_BLOCK] = sound.loadSample(PREFIX+"/snd/breakblock.wav"); - samples[SAMPLE_GET_COIN] = sound.loadSample(PREFIX+"/snd/coin.wav"); - samples[SAMPLE_MARIO_JUMP] = sound.loadSample(PREFIX+"/snd/jump.wav"); - samples[SAMPLE_MARIO_STOMP] = sound.loadSample(PREFIX+"/snd/stomp.wav"); - samples[SAMPLE_MARIO_KICK] = sound.loadSample(PREFIX+"/snd/kick.wav"); - samples[SAMPLE_MARIO_POWER_UP] = sound.loadSample(PREFIX+"/snd/powerup.wav"); - samples[SAMPLE_MARIO_POWER_DOWN] = sound.loadSample(PREFIX+"/snd/powerdown.wav"); - samples[SAMPLE_MARIO_DEATH] = sound.loadSample(PREFIX+"/snd/death.wav"); - samples[SAMPLE_ITEM_SPROUT] = sound.loadSample(PREFIX+"/snd/sprout.wav"); - samples[SAMPLE_CANNON_FIRE] = sound.loadSample(PREFIX+"/snd/cannon.wav"); - samples[SAMPLE_SHELL_BUMP] = sound.loadSample(PREFIX+"/snd/bump.wav"); - samples[SAMPLE_LEVEL_EXIT] = sound.loadSample(PREFIX+"/snd/exit.wav"); - samples[SAMPLE_MARIO_1UP] = sound.loadSample(PREFIX+"/snd/1-up.wav"); - samples[SAMPLE_MARIO_FIREBALL] = sound.loadSample(PREFIX+"/snd/fireball.wav"); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - - try - { - sequencer = MidiSystem.getSequencer(); - sequencer.open(); - songs[0] = MidiSystem.getSequence(Art.class.getResourceAsStream(PREFIX+"/mus/smb3map1.mid")); - songs[1] = MidiSystem.getSequence(Art.class.getResourceAsStream(PREFIX+"/mus/smwovr1.mid")); - songs[2] = MidiSystem.getSequence(Art.class.getResourceAsStream(PREFIX+"/mus/smb3undr.mid")); - songs[3] = MidiSystem.getSequence(Art.class.getResourceAsStream(PREFIX+"/mus/smwfortress.mid")); - songs[4] = MidiSystem.getSequence(Art.class.getResourceAsStream(PREFIX+"/mus/smwtitle.mid")); - } - catch (Exception e) - { - sequencer = null; - e.printStackTrace(); - } - } - - private static Image getImage(GraphicsConfiguration gc, String imageName) throws IOException - { - InputStream p=Art.class.getResourceAsStream(imageName); - BufferedImage source = ImageIO.read(p); - Image image = gc.createCompatibleImage(source.getWidth(), source.getHeight(), Transparency.BITMASK); - Graphics2D g = (Graphics2D) image.getGraphics(); - g.setComposite(AlphaComposite.Src); - g.drawImage(source, 0, 0, null); - g.dispose(); - return image; - } - - private static Image[][] cutImage(GraphicsConfiguration gc, String imageName, int xSize, int ySize) throws IOException - { - Image source = getImage(gc, imageName); - Image[][] images = new Image[source.getWidth(null) / xSize][source.getHeight(null) / ySize]; - for (int x = 0; x < source.getWidth(null) / xSize; x++) - { - for (int y = 0; y < source.getHeight(null) / ySize; y++) - { - Image image = gc.createCompatibleImage(xSize, ySize, Transparency.BITMASK); - Graphics2D g = (Graphics2D) image.getGraphics(); - g.setComposite(AlphaComposite.Src); - g.drawImage(source, -x * xSize, -y * ySize, null); - g.dispose(); - images[x][y] = image; - } - } - - return images; - } - - public static void startMusic(int song) - { - if(!mute){ - stopMusic(); - if (sequencer != null) - { - try - { - sequencer.open(); - sequencer.setSequence((Sequence)null); - sequencer.setSequence(songs[song]); - sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY); - sequencer.start(); - } - catch (Exception e) - { - } - } - } - } - - public static void stopMusic() - { - if (sequencer != null) - { - try - { - sequencer.stop(); - sequencer.close(); - } - catch (Exception e) - { - } - } - } -} diff --git a/src/dk/itu/mario/engine/BgRenderer.java b/src/dk/itu/mario/engine/BgRenderer.java deleted file mode 100644 index e218989..0000000 --- a/src/dk/itu/mario/engine/BgRenderer.java +++ /dev/null @@ -1,103 +0,0 @@ -package dk.itu.mario.engine; - -import java.awt.*; -import java.util.Random; - - -import dk.itu.mario.level.Level; - - -public class BgRenderer -{ - private int xCam; - private int yCam; - private Image image; - private Graphics2D g; - private static final Color transparent = new Color(0, 0, 0, 0); - private Level level; - - private Random random = new Random(); - public boolean renderBehaviors = false; - - private int width; - private int height; - private int distance; - - public BgRenderer(Level level, GraphicsConfiguration graphicsConfiguration, int width, int height, int distance) - { - this.distance = distance; - this.width = width; - this.height = height; - - this.level = level; - image = graphicsConfiguration.createCompatibleImage(width, height, Transparency.BITMASK); - g = (Graphics2D) image.getGraphics(); - g.setComposite(AlphaComposite.Src); - - updateArea(0, 0, width, height); - } - - public void setCam(int xCam, int yCam) - { - xCam /= distance; - yCam /= distance; - int xCamD = this.xCam - xCam; - int yCamD = this.yCam - yCam; - this.xCam = xCam; - this.yCam = yCam; - - g.setComposite(AlphaComposite.Src); - g.copyArea(0, 0, width, height, xCamD, yCamD); - - if (xCamD < 0) - { - if (xCamD < -width) xCamD = -width; - updateArea(width + xCamD, 0, -xCamD, height); - } - else if (xCamD > 0) - { - if (xCamD > width) xCamD = width; - updateArea(0, 0, xCamD, height); - } - - if (yCamD < 0) - { - if (yCamD < -width) yCamD = -width; - updateArea(0, height + yCamD, width, -yCamD); - } - else if (yCamD > 0) - { - if (yCamD > width) yCamD = width; - updateArea(0, 0, width, yCamD); - } - } - - private void updateArea(int x0, int y0, int w, int h) - { - g.setBackground(transparent); - g.clearRect(x0, y0, w, h); - int xTileStart = (x0 + xCam) / 32; - int yTileStart = (y0 + yCam) / 32; - int xTileEnd = (x0 + xCam + w) / 32; - int yTileEnd = (y0 + yCam + h) / 32; - for (int x = xTileStart; x <= xTileEnd; x++) - { - for (int y = yTileStart; y <= yTileEnd; y++) - { - int b = level.getBlock(x, y) & 0xff; - g.drawImage(Art.bg[b % 8][b / 8], (x << 5) - xCam, (y << 5) - yCam-16, null); - } - } - } - - public void render(Graphics g, int tick, float alpha) - { - g.drawImage(image, 0, 0, null); - } - - public void setLevel(Level level) - { - this.level = level; - updateArea(0, 0, width, height); - } -} diff --git a/src/dk/itu/mario/engine/ConstraintsChecker.java b/src/dk/itu/mario/engine/ConstraintsChecker.java deleted file mode 100644 index d4c035f..0000000 --- a/src/dk/itu/mario/engine/ConstraintsChecker.java +++ /dev/null @@ -1,56 +0,0 @@ -package dk.itu.mario.engine; - -import dk.itu.mario.level.Level; -import dk.itu.mario.MarioInterface.Constraints; -import dk.itu.mario.engine.sprites.SpriteTemplate; - -public final class ConstraintsChecker { - - public static boolean check(Level level){ - if(level.getWidth() != Constraints.levelWidth) - return false; - //check the number of gaps - int levelGaps = 0, bcoins = 0; - for (int i = 0; i < level.getWidth(); i++) { - if (level.getBlock(i, level.getHeight()) == 0){ - levelGaps++; - while (i 0) - if (! (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_SPECIAL) > 0)) - bcoins++; - } - } -// if(bcoins != Constraints.coinBlocks) -// return false; - return true; - } - -} diff --git a/src/dk/itu/mario/engine/DataRecorder.java b/src/dk/itu/mario/engine/DataRecorder.java deleted file mode 100644 index 289b42e..0000000 --- a/src/dk/itu/mario/engine/DataRecorder.java +++ /dev/null @@ -1,1170 +0,0 @@ -package dk.itu.mario.engine; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; - -import com.thoughtworks.xstream.annotations.XStreamOmitField; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.engine.sprites.BulletBill; -import dk.itu.mario.engine.sprites.Enemy; -import dk.itu.mario.engine.sprites.FlowerEnemy; -import dk.itu.mario.engine.sprites.Mario; -import dk.itu.mario.engine.sprites.Shell; -import dk.itu.mario.engine.sprites.Sprite; -import dk.itu.mario.engine.sprites.SpriteTemplate; -import dk.itu.mario.level.RandomLevel; -import dk.itu.mario.scene.LevelScene; - -public class DataRecorder { - public static final DataRecorder BLANK_RECORD = new DataRecorder(); - - public boolean recording = true; - private boolean []keys, keyPressed; - - @XStreamOmitField - private RandomLevel level; - - @XStreamOmitField - private LevelScene levelScene; - - /** - * Time variables to record - */ - private int timeStart, timeEnd; - private int completionTime; //counts only the current run on the level, excluding death games - private int totalTime; //sums all the time, including from previous games if player died - - /** - * Jump variables to record - */ - private int totalJumpTime, startJumpTime, endJumpTime; - private int timesJumped; - public boolean isInAir; - - /** - * Duck variables to record - */ - private int totalDuckTime, startDuckTime, endDuckTime; - private int timesDucked; - - /** - * Running variables to record - */ - private int totalRunTime, startRunTime, endRunTime; - private int timesRun; - - /** - * Switching variables to record - */ - private int totalRightTime, totalLeftTime, startRightTime, endRightTime, startLeftTime, endLeftTime; - private int direction; - - /** - * How many kills the player has - */ - private int[] kills; - private int fireKills; - private int suicideKills; - private int stompKills; - private int shellKills; - - /** - * How many times dit the player die to the specific cause (monster or jump) - */ - private int[] deaths; - - /** - * How many coins did the player collect - */ - private int collectedCoins; - - /** - * How many blocks did the player destroy - */ - private int blocksEmptyDestroyed, blocksCoinDestroyed, blocksPowerDestroyed; - - /** - * How many shells the player has kicked - */ - private int shellsUnleashed; - - /** - * Power up time, how much time mario spent in what form - */ - private int totalLittleTime = 0; - private int startLittleTime = 0; - private int endLittleTime = 0; - - private int totalLargeTime = 0; - private int startLargeTime = 0; - private int endLargeTime = 0; - - private int totalFireTime = 0; - private int startFireTime = 0; - private int endFireTime = 0; - - private int switchedPower = 0; - - private boolean levelWon; - public String detailedLog = ""; - - public String getDetailedLog(){ - return detailedLog; - } - - /** - * For use by BLANK_RECORD - */ - private DataRecorder() {; - } - - public DataRecorder(LevelScene levelScene, RandomLevel level, boolean []keys){ - this.levelScene = levelScene; - this.level = level; - this.keys = keys; - - keyPressed = new boolean[keys.length]; - - reset(); - } - - public void reset(){ - kills = new int[7]; - deaths = new int[10]; //added one for the hole death and one for time death and one for shell - - //time reset - completionTime = 0; - timeStart = 0; - timeEnd = 0; - totalTime = 0; - - //jump reset - timesJumped = 0; - totalJumpTime = 0; - startJumpTime = 0; - endJumpTime = 0; - isInAir = false; - - //duck reset - timesDucked = 0; - totalDuckTime = 0; - startDuckTime = 0; - endDuckTime = 0; - - //run reset - timesRun = 0; - totalRunTime = 0; - startRunTime = 0; - endRunTime = 0; - - //switch reset - totalRightTime = 0; - totalLeftTime = 0; - startRightTime = 0; - startLeftTime = 0; - endRightTime = 0; - endLeftTime = 0; - - //coins reset - collectedCoins = 0; - - //blocks reset - blocksEmptyDestroyed = 0; - blocksCoinDestroyed = 0; - blocksPowerDestroyed = 0; - - //shell reset - shellsUnleashed = 0; - - //kill types - fireKills = 0; - suicideKills = 0; - stompKills = 0; - shellKills = 0; - - //power up types - totalLittleTime = 0; - startLittleTime = 0; - endLittleTime = 0; - - totalLargeTime = 0; - startLargeTime = 0; - endLargeTime = 0; - - totalFireTime = 0; - startFireTime = 0; - endFireTime = 0; - - switchedPower = 0; - - levelWon = false; - } - - public void tickRecord(){ - keysRecord(); - } - - public void levelWon(){ - levelWon = true; - } - - public boolean getLevelWon(){ - return levelWon; - } - - public void startTime(){ - if(timeStopped == true){ - timeStopped = false; - timeStart = 2982 - levelScene.timeLeft; - detailedLog += "StartTime = "+ timeStart; - detailedLog += "\n"; - } - } - - private boolean timeStopped = true; - - public void endTime(){ - if(timeStopped == false){ - timeStopped = true; - - timeEnd = 2982 - levelScene.timeLeft; - totalTime += timeEnd-timeStart; - - completionTime = timeEnd-timeStart; - detailedLog += "Totaltime = "+completionTime; - detailedLog += "\n"; - } - } - - /** - * Closes all of the recording, this should commit the data? - */ - public void stopRecord(){ - if(recording){ - recording = false; - - //time at current point - recordJumpLand(); - endTime(); - - switch(direction){ - case 1: - endRightMoveRecord(); - break; - case -1: - endLeftMoveRecord(); - break; - } - - if(levelScene.mario.running){ - endRunningRecord(); - } - - if(levelScene.mario.ducking){ - endDuckRecord(); - } - - if(Mario.large && !Mario.fire){ - endLargeRecord(); - } - - if(Mario.fire){ - endFireRecord(); - } - - if(!Mario.fire && !Mario.large){ - endLittleRecord(); - } - } - } - - public void startRightMoveRecord(){ - startRightTime = 2982 - levelScene.timeLeft; - direction = 1; - } - - public void startLeftMoveRecord(){ - startLeftTime = 2982 - levelScene.timeLeft; - direction = -1; - } - - public void endRightMoveRecord(){ - endRightTime = 2982 - levelScene.timeLeft; - - totalRightTime += endRightTime - startRightTime; - detailedLog += "RightMove: StTime = "+startRightTime +" EdTime = "+totalRightTime; - detailedLog += "\n"; - } - - public void endLeftMoveRecord(){ - endLeftTime = 2982 - levelScene.timeLeft; - - totalLeftTime += endLeftTime - startLeftTime; - detailedLog += "LeftMove: StTime = "+startLeftTime +" EdTime = "+totalLeftTime; - detailedLog += "\n"; - - } - - public void startDuckRecord(){ - if(!levelScene.mario.ducking){ - timesDucked++; - - startDuckTime = 2982 - levelScene.timeLeft; - - System.out.println("START DUCK"); - } - } - - public void endDuckRecord(){ - if(levelScene.mario.ducking){ - endDuckTime = 2982 - levelScene.timeLeft; - - totalDuckTime += endDuckTime - startDuckTime; - - System.out.println("END DUCK"); - - System.out.println("END DUCK"); - - detailedLog += "Duck: StTime = "+startDuckTime +" EdTime = "+endDuckTime; - detailedLog += "\n"; - - } - } - - private boolean littleRecording = false; - - public void startLittleRecord(){ - if(!littleRecording){ - littleRecording = true; - - switchedPower++; - - System.out.println("------------------- "+switchedPower+" -------------------"); - - startLittleTime = 2982 - levelScene.timeLeft; - - System.out.println("LITTLE START: " + startLittleTime); - } - } - - public void endLittleRecord(){ - if(littleRecording){ - littleRecording = false; - endLittleTime = 2982 - levelScene.timeLeft; - - totalLittleTime += endLittleTime - startLittleTime; - - System.out.println("LITTLE END: "+endLittleTime); - System.out.println("TOTAL LITTLE END: " + totalLittleTime); - System.out.println("LITTLE END: "+endLittleTime); - detailedLog += "LittleState: StTime = "+startLittleTime +" EdTime = "+endLittleTime; - detailedLog += "\n"; - } - } - - public void startLargeRecord(){ - switchedPower++; - - System.out.println("------------------- "+switchedPower+" -------------------"); - - startLargeTime = 2982 - levelScene.timeLeft; - - System.out.println("LARGE START"); - } - - public void endLargeRecord(){ - endLargeTime = 2982 - levelScene.timeLeft; - - totalLargeTime += endLargeTime - startLargeTime; - - System.out.println("LARGE END"); - - detailedLog += "LargeState: StTime = "+startLargeTime +" EdTime = "+endLargeTime; - detailedLog += "\n"; - - - } - - public void startFireRecord(){ - switchedPower++; - - System.out.println("------------------- "+switchedPower+" -------------------"); - - startFireTime = 2982 - levelScene.timeLeft; - - System.out.println("FIRE START"); - } - - public void endFireRecord(){ - endFireTime = 2982 - levelScene.timeLeft; - - totalFireTime += endFireTime - startFireTime; - - System.out.println("FIRE END"); - detailedLog += "FireState: StTime = "+startFireTime +" EdTime = "+endFireTime; - detailedLog += "\n"; - } - - public void startRunningRecord(){ - if(!levelScene.mario.running){ - timesRun++; - - startRunTime = 2982 - levelScene.timeLeft; - - System.out.println("START RUN"); - } - } - - public void endRunningRecord(){ - if(levelScene.mario.running){ - - System.out.println("END RUN"); - - endRunTime = 2982 - levelScene.timeLeft; - - totalRunTime += endRunTime - startRunTime; - - detailedLog += "RunState: StTime = "+startRunTime +" EdTime = "+endRunTime; - detailedLog += "\n"; - - } - } - - public void fireKillRecord(Sprite sprite){ - killRecord(sprite); - if(sprite instanceof FlowerEnemy){ - detailedLog += "FireKill: EnemyType = FlowerEnemy time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - } - else if(sprite instanceof BulletBill){// cannon shot - } - else if(sprite instanceof Shell){ - } - else if(sprite instanceof Enemy){ - Enemy enemy = (Enemy)sprite; - detailedLog += "FireKill: EnemyType ="+ enemy.type +"time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - } - fireKills++; - System.out.println(" fire kill "); - } - - public void shellKillRecord(Sprite sprite){ - killRecord(sprite); - if(sprite instanceof FlowerEnemy){ - detailedLog += "ShellKill: EnemyType = FlowerEnemy time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - } - else if(sprite instanceof BulletBill){//cannon shot - } - else if(sprite instanceof Shell){ - detailedLog += "ShellKill: EnemyType = Turtle time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - } - else if(sprite instanceof Enemy){ - Enemy enemy = (Enemy)sprite; - detailedLog += "ShellKill: EnemyType = "+enemy.type+" time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - } - - shellKills++; - System.out.println(" shell kill "); - } - - public void killSuicideRecord(Sprite sprite){ - killRecord(sprite); - suicideKills++; - System.out.println(" suicide "); - } - - public void killStompRecord(Sprite sprite){ - killRecord(sprite); - if(sprite instanceof FlowerEnemy){ - detailedLog += "StompKill: EnemyType = FlowerEnemy time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - - } - else if(sprite instanceof BulletBill){// cannon shot - detailedLog += "StompKill: EnemyType = BulletBill time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - } - else if(sprite instanceof Shell){ -// levelScene.levelRecorder.enemyR.interact.add(new DataEntry(EnemyRecorder.GREEN_TURTLE, EnemyRecorder.UNLEASHED, 2982 - levelScene.timeLeft,x,y)); - } - else if(sprite instanceof Enemy){ - Enemy enemy = (Enemy)sprite; - detailedLog += "StompKill: EnemyType = "+enemy.type+" time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - - } - stompKills++; - System.out.println(" stomp "); - } - - public void killRecord(Sprite sprite){ - //something goes wrong with the type of the flower enemy, this is special case - if(sprite instanceof FlowerEnemy){ - - kills[SpriteTemplate.JUMP_FLOWER]++; - } - else if(sprite instanceof BulletBill){ - kills[5]++; - } - else if(sprite instanceof Shell){ - //not sure what to do with shells - } - else if(sprite instanceof Enemy){ - Enemy enemy = (Enemy)sprite; - - kills[enemy.type]++; - } - - printKills(); - } - - public void blockEmptyDestroyRecord(){ - - blocksEmptyDestroyed++; - } - - public void blockCoinDestroyRecord(){ - detailedLog += "BlockCoinDestroy: time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - blocksCoinDestroyed++; - } - - public void blockPowerDestroyRecord(){ - detailedLog += "BlockPowerDestroy: time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - blocksPowerDestroyed++; - } - - public void dieRecord(Sprite sprite){ - if(sprite instanceof FlowerEnemy){ - detailedLog += "Die: EnemyType = FlowerEnemy "; - detailedLog += "\n"; - deaths[SpriteTemplate.JUMP_FLOWER]++; - } - else if(sprite instanceof BulletBill){ - detailedLog += "Die: EnemyType = BulletBill "; - detailedLog += "\n"; - deaths[5]++; - } - else if(sprite instanceof Shell){ - //not sure what to do with shells - detailedLog += "Die: EnemyType = TurtleShell "; - detailedLog += "\n"; - deaths[9]++; - } - else if(sprite instanceof Enemy){ - Enemy enemy = (Enemy)sprite; - deaths[enemy.type]++; - detailedLog += "Die: EnemyType = "+enemy.type; - detailedLog += "\n"; - - } - - - } - - public void dieTimeRecord(){ - //time - deaths[7]++; - - } - - public void dieJumpRecord(){ - //jump - deaths[8]++; - detailedLog += "Die: Gap "; - detailedLog += "\n"; - - } - - public void shellUnleashedRecord(){ - shellsUnleashed++; - System.out.println(" shell unleased"); - detailedLog += "UnleashShell: time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - } - - private void keysRecord(){ - if(keys[Mario.KEY_LEFT] && !keyPressed[Mario.KEY_LEFT]){ - keyPressed[Mario.KEY_LEFT] = true; - } - else if(!keys[Mario.KEY_LEFT]){ - keyPressed[Mario.KEY_LEFT] = false; - } - } - - public void recordJump(){ - if(isInAir){ - timesJumped++; - startJumpTime = 2982 -levelScene.timeLeft; - } - } - - public void recordJumpLand(){ - if(isInAir){ - isInAir = false; - endJumpTime = 2982-levelScene.timeLeft; - - totalJumpTime += endJumpTime - startJumpTime; - - detailedLog += "Jump: StTime = "+ startJumpTime +" EdTime = "+endJumpTime; - detailedLog += "\n"; - } - } - - public void recordCoin(){ - detailedLog += "CollectCoin: time = "+ (2982 - levelScene.timeLeft); - detailedLog += "\n"; - collectedCoins++; - } - - private int convertTime(int time){ - return (int)Math.floor((time+15-1)/15); - } - - public void printAll(){ - - printKills(); - printTime(); - printJump(); - printDuck(); - printRun(); - printSwitching(); - - System.out.println("total fire: " + convertTime( totalFireTime) + " total large: " + convertTime(totalLargeTime) + " total little: " + convertTime(totalLittleTime)); - } - - private void printSwitching(){ - printStart("Switch Variables"); - System.out.println("Time Spent Moving Right: " + convertTime(totalRightTime) + " ("+Math.round((double)convertTime(totalRightTime)/(double)convertTime(totalTime)*(double)100)+"%)"); - System.out.println("Time Spent Moving Left: " + convertTime(totalLeftTime) + " ("+Math.round((double)convertTime(totalLeftTime)/(double)convertTime(totalTime)*(double)100)+"%)"); - System.out.println("Time Spent Standing Still: " + (convertTime(totalTime)-convertTime(totalLeftTime)-convertTime(totalRightTime)) + " ("+Math.round((double)(convertTime(totalTime)-convertTime(totalLeftTime)-convertTime(totalRightTime))/(double)convertTime(totalTime)*(double)100)+"%)"); - - printEnd(); - } - - private void printJump(){ - printStart("Jump Variables"); - System.out.println("Number of Times Jumped: " + timesJumped); - System.out.println("Time Spent Jumping: " + convertTime(totalJumpTime) + " ("+Math.round((double)convertTime(totalJumpTime)/(double)convertTime(totalTime)*(double)100)+"%)"); - printEnd(); - } - - private void printRun(){ - printStart("Run Variables"); - System.out.println("Number of Times Run: " + timesRun); - System.out.println("Time Spent Running: " + convertTime(totalRunTime) + " ("+Math.round((double)convertTime(totalRunTime)/(double)convertTime(totalTime)*100)+"%)"); - printEnd(); - } - - private void printDuck(){ - printStart("Duck Variables"); - System.out.println("Number of Times Ducked: " + timesDucked); - System.out.println("Time Spent Ducking: " + convertTime(totalDuckTime) + " ("+Math.round((double)convertTime(totalDuckTime)/(double)convertTime(totalTime)*(double)100)+"%)"); - printEnd(); - } - - private void printTime(){ - printStart("Time Variables"); - System.out.println("Total Completion Time: " + convertTime(totalTime)); - System.out.println("Total Last Time: " + convertTime(completionTime)); - printEnd(); - } - - private void printDeaths() { - printStart("Player Died Against"); - int deathsTotal = 0; - - for(int i=0;i"); - - System.out.print(title); - - for(int i=0;i<50/2-title.length()/2 - tweak;++i) - System.out.print("<"); - - System.out.print("\n"); - - } - - private void printEnd(){ - System.out.println("------------------- "+switchedPower+" -------------------"); - - for(int i=0;i<50;++i) - System.out.print("-"); - - System.out.print("\n"); - } - - public void fillGamePlayMetrics(RandomLevel level){ - GamePlay gpm = new GamePlay(); - gpm.completionTime = getCompletionTime(); - gpm.totalTime = getTotalTime(); - gpm.jumpsNumber = getTimesJumped(); - gpm.timeSpentDucking = getTotalDuckTime(); - gpm.duckNumber = getTimesDucked(); - gpm.timeSpentRunning = getTotalRunTime(); - gpm.timesPressedRun = getTimesRun(); - gpm.timeRunningRight = getTotalRightTime(); - gpm.timeRunningLeft = getTotalLeftTime(); - gpm.coinsCollected = getCoinsCollected(); - gpm.totalCoins = level.COINS; - gpm.emptyBlocksDestroyed = getBlocksEmptyDestroyed(); - gpm.totalEmptyBlocks = level.BLOCKS_EMPTY; - gpm.coinBlocksDestroyed = getBlocksCoinDestroyed(); - gpm.totalCoinBlocks = level.BLOCKS_COINS; - gpm.powerBlocksDestroyed = getBlocksPowerDestroyed(); - gpm.totalpowerBlocks = level.BLOCKS_POWER; - gpm.kickedShells = getShellsUnleashed(); //kicked - gpm.enemyKillByFire = getKillsFire();//Number of Kills by Shooting Enemy - gpm.enemyKillByKickingShell = getKillsShell();//Number of Kills by Kicking Shell on Enemy - gpm.totalEnemies = level.ENEMIES; - - gpm.totalTimeLittleMode = getTotalLittleTime(); - gpm.totalTimeLargeMode = getTotalLargeTime();//Time Spent Being Large Mario - gpm.totalTimeFireMode = getTotalFireTime();//Time Spent Being Fire Mario - gpm.timesSwichingPower = getSwitchedPower();//Number of Times Switched Between Little, Large or Fire Mario - gpm.aimlessJumps = J();//aimless jumps - gpm.percentageBlocksDestroyed = nb();//percentage of all blocks destroyed - gpm.percentageCoinBlocksDestroyed = ncb();//percentage of coin blocks destroyed - gpm.percentageEmptyBlockesDestroyed = neb();//percentage of empty blocks destroyed - gpm.percentagePowerBlockDestroyed = np();//percentage of power blocks destroyed - gpm.timesOfDeathByFallingIntoGap = dg();//number of death by falling into a gap - gpm.timesOfDeathByRedTurtle = deaths[SpriteTemplate.RED_TURTLE]; - gpm.timesOfDeathByGreenTurtle = deaths[SpriteTemplate.GREEN_TURTLE]; - gpm.timesOfDeathByGoomba = deaths[SpriteTemplate.GOOMPA]; - gpm.timesOfDeathByArmoredTurtle = deaths[SpriteTemplate.ARMORED_TURTLE]; - gpm.timesOfDeathByJumpFlower = deaths[SpriteTemplate.JUMP_FLOWER]; - gpm.timesOfDeathByCannonBall = deaths[SpriteTemplate.CANNON_BALL]; - gpm.timesOfDeathByChompFlower = deaths[SpriteTemplate.CHOMP_FLOWER]; - - gpm.RedTurtlesKilled = kills[SpriteTemplate.RED_TURTLE]; - gpm.GreenTurtlesKilled = kills[SpriteTemplate.GREEN_TURTLE]; - gpm.GoombasKilled = kills[SpriteTemplate.GOOMPA]; - gpm.ArmoredTurtlesKilled = kills[SpriteTemplate.ARMORED_TURTLE]; - gpm.JumpFlowersKilled = kills[SpriteTemplate.JUMP_FLOWER]; - gpm.CannonBallKilled = kills[SpriteTemplate.CANNON_BALL]; - gpm.ChompFlowersKilled = kills[SpriteTemplate.CHOMP_FLOWER]; - gpm.write("player.txt"); - System.out.println(detailedLog); - write(detailedLog); - writeXML(); - } - - - - private void write(String detailedLog2) { - try { - FileWriter file = new FileWriter(new File("DetailedInfo.txt")); - file.write(detailedLog); - file.close(); - } catch (IOException e) { - - e.printStackTrace(); - } - - } - - private void writeXML() { - try { - FileWriter file = new FileWriter(new File("DetailedInfo.xml")); - file.write(toXML()); - file.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - } - - public int getCompletionTime(){ - return convertTime(completionTime); - } - - /** - * Sums all the time, including from previous games if player died - * @return - */ - public int getTotalTime(){ - return convertTime(totalTime); - } - - public int getTotalJumpTime(){ - return convertTime(totalJumpTime); - } - - public int getTimesJumped(){ - return timesJumped; - } - - public int getTotalDuckTime(){ - return convertTime(totalDuckTime); - } - - public int getTimesDucked(){ - return timesDucked; - } - - public int getTotalRunTime(){ - return convertTime(totalRunTime); - } - - public int getTimesRun(){ - return timesRun; - } - - public int getTotalRightTime(){ - return convertTime(totalRightTime); - } - - public int getTotalLeftTime(){ - return convertTime(totalLeftTime); - } - - public int getCoinsCollected(){ - return collectedCoins; - } - - public int getBlocksEmptyDestroyed(){ - return blocksEmptyDestroyed; - } - - public int getBlocksCoinDestroyed(){ - return blocksCoinDestroyed; - } - - public int getBlocksPowerDestroyed(){ - return blocksPowerDestroyed; - } - - public int getKills(int monster){ - return kills[monster]; - } - - public int getDeaths(int cause){ - return deaths[cause]; - } - - public int getShellsUnleashed(){ - return shellsUnleashed; - } - - public int getKillsStomp(){ - return stompKills; - } - - public int getKillsFire(){ - return fireKills; - } - - public int getKillsShell(){ - return shellKills; - } - - public int getKillsSuicide(){ - return suicideKills; - } - - public int getTotalLittleTime(){ - return convertTime(totalLittleTime); - } - - public int getTotalLargeTime(){ - return convertTime(totalLargeTime); - } - - public int getTotalFireTime(){ - return convertTime(totalFireTime); - } - - public int getSwitchedPower(){ - return switchedPower; - } - - - /** - * The total time taken to complete a level - * @return - */ - public double tc(){ - return (double)getTotalTime(); - } - - public double tL(){ - return (double)getTotalLeftTime()/(double)getTotalTime(); - } - - /** - * time in large form - * @return - */ - public double tl(){ - return (double)getTotalLargeTime()/(double)getTotalTime(); - } - - public static DataRecorder fromXML(File file) throws IOException { - return (DataRecorder) XStreamFactory.getInstance().fromXML(file); - } - - public String toXML() { - return XStreamFactory.getInstance().toXML(this); - } - - /** - * Time in tiny mario form - * @return - */ - public double tt(){ - return (double)getTotalLittleTime()/(double)getTotalTime(); - } - - /** - * Time spent running in percent - * @return - */ - public double tr(){ - return (double)getTotalRunTime()/(double)getTotalTime(); - } - - /** - * Time spent in powerup form - * @return - */ - public double tp(){ - return 1-((double)getTotalLittleTime()/(double)getTotalTime()); - } - - /** - * Time spent in fire mario form - * @return - */ - public double tf(){ - return (double)getTotalFireTime()/(double)getTotalTime(); - } - - public double tR(){ - return (double)getTotalRightTime()/(double)getTotalTime(); - } - - public double ks(){ - if(getKillsStomp()+getKillsFire() == 0){ - return 0; - } - else - return (double)getKillsStomp()/(double)(getKillsStomp()+getKillsFire()); - } - - public double kf(){ - if(getKillsFire()+getKillsStomp() == 0) - return 0; - else - return (double)getKillsFire()/(double)(getKillsFire()+getKillsStomp()); - } - - public double tll(){ - return getCompletionTime(); - } - - public double ts(){ - return 1-((getTotalLeftTime()+getTotalRightTime())/getTotalTime()); - } - - /** - * This is also called J' but cant be called that due to special character - * @return double of aimless jumps - */ - public double J(){ - return getTimesJumped()-getKillsStomp()-getBlocksEmptyDestroyed()-getBlocksCoinDestroyed()-getBlocksPowerDestroyed(); - } - - public double nm(){ - return getSwitchedPower(); - } - - public double nd(){ - return getTimesDucked(); - } - - /** - * Percentage of all blocks destroyed - * @return - */ - public double nb(){ - double n = 0; - if( level.BLOCKS_EMPTY != 0) - n+= getBlocksEmptyDestroyed()/level.BLOCKS_EMPTY; - if(level.BLOCKS_POWER != 0) - n+= getBlocksPowerDestroyed()/level.BLOCKS_POWER; - if( level.BLOCKS_COINS != 0) - n+= getBlocksCoinDestroyed()/level.BLOCKS_COINS; - - return n; - } - - public double ncb(){ - if( level.BLOCKS_COINS != 0) - return getBlocksCoinDestroyed()/level.BLOCKS_COINS; - else - return 0; - } - - public double neb(){ - if( level.BLOCKS_EMPTY != 0) - return getBlocksEmptyDestroyed()/level.BLOCKS_EMPTY; - else - return 0; - } - - public double np(){ - if( level.BLOCKS_POWER != 0) - return getBlocksPowerDestroyed()/level.BLOCKS_POWER; - else - return 0; - } - - /** - * Deaths by falling into gaps - * @return - */ - public double dg(){ - return getDeaths(8); - } - - /** - * Percentage of deaths by falling into gaps - * @return - */ - public double dj(){ - int tDeaths = 0; - - for(int i=0;i 1) - return 1; - else if(out < 0) - return 0; - else - return out; - } -} diff --git a/src/dk/itu/mario/engine/LevelFactory.java b/src/dk/itu/mario/engine/LevelFactory.java deleted file mode 100644 index 25ac4e5..0000000 --- a/src/dk/itu/mario/engine/LevelFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package dk.itu.mario.engine; - -import java.util.*; - -import dk.itu.mario.level.Level; - -public abstract class LevelFactory { - - private static Map levels = new HashMap(); - - public static void register(String name,Level level){ - levels.put(name, level); - } - - public static Level retrieve(String name){ - return levels.get(name); - } - - public static Iterator getKeyset(){ - return levels.keySet().iterator(); - } - - public static Map getLevelsMap(){ - return levels; - } -} diff --git a/src/dk/itu/mario/engine/LevelRenderer.java b/src/dk/itu/mario/engine/LevelRenderer.java deleted file mode 100644 index 0cc4686..0000000 --- a/src/dk/itu/mario/engine/LevelRenderer.java +++ /dev/null @@ -1,212 +0,0 @@ -package dk.itu.mario.engine; - -import java.awt.*; -import java.util.Random; - - -import dk.itu.mario.level.Level; - - -public class LevelRenderer -{ - private int xCam; - private int yCam; - private Image image; - private Graphics2D g; - private static final Color transparent = new Color(0, 0, 0, 0); - private Level level; - - private Random random = new Random(); - public boolean renderBehaviors = false; - - public int width; - public int height; - - public LevelRenderer(Level level, GraphicsConfiguration graphicsConfiguration, int width, int height) - { - this.width = width; - this.height = height; - - this.level = level; - image = graphicsConfiguration.createCompatibleImage(width, height, Transparency.BITMASK); - g = (Graphics2D) image.getGraphics(); - g.setComposite(AlphaComposite.Src); - - updateArea(0, 0, width, height); - } - - public void setCam(int xCam, int yCam) - { - int xCamD = this.xCam - xCam; - int yCamD = this.yCam - yCam; - this.xCam = xCam; - this.yCam = yCam; - - g.setComposite(AlphaComposite.Src); - g.copyArea(0, 0, width, height, xCamD, yCamD); - - if (xCamD < 0) - { - if (xCamD < -width) xCamD = -width; - updateArea(width + xCamD, 0, -xCamD, height); - } - else if (xCamD > 0) - { - if (xCamD > width) xCamD = width; - updateArea(0, 0, xCamD, height); - } - - if (yCamD < 0) - { - if (yCamD < -width) yCamD = -width; - updateArea(0, height + yCamD, width, -yCamD); - } - else if (yCamD > 0) - { - if (yCamD > width) yCamD = width; - updateArea(0, 0, width, yCamD); - } - } - - private void updateArea(int x0, int y0, int w, int h) - { - g.setBackground(transparent); - g.clearRect(x0, y0, w, h); - int xTileStart = (x0 + xCam) / 16; - int yTileStart = (y0 + yCam) / 16; - int xTileEnd = (x0 + xCam + w) / 16; - int yTileEnd = (y0 + yCam + h) / 16; - for (int x = xTileStart; x <= xTileEnd; x++) - { - for (int y = yTileStart; y <= yTileEnd; y++) - { - int b = level.getBlock(x, y) & 0xff; - if (((Level.TILE_BEHAVIORS[b]) & Level.BIT_ANIMATED) == 0) - { - g.drawImage(Art.level[b % 16][b / 16], (x << 4) - xCam, (y << 4) - yCam, null); - } - } - } - } - - public void render(Graphics g, int tick, float alpha) - { - g.drawImage(image, 0, 0, null); - - for (int x = xCam / 16; x <= (xCam + width) / 16; x++) - for (int y = yCam / 16; y <= (yCam + height) / 16; y++) - { - byte b = level.getBlock(x, y); - - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_ANIMATED) > 0) - { - int animTime = (tick / 3) % 4; - - if ((b % 16) / 4 == 0 && b / 16 == 1) - { - animTime = (tick / 2 + (x + y) / 8) % 20; - if (animTime > 3) animTime = 0; - } - if ((b % 16) / 4 == 3 && b / 16 == 0) - { - animTime = 2; - } - int yo = 0; -// if (x >= 0 && y >= 0 && x < level.getWidth() && y < level.getyHeight()) yo = level.data[x][y]; - if (yo > 0) yo = (int) (Math.sin((yo - alpha) / 4.0f * Math.PI) * 8); - g.drawImage(Art.level[(b % 16) / 4 * 4 + animTime][b / 16], (x << 4) - xCam, (y << 4) - yCam - yo, null); - } - - /* else if (b == Level.TILE_BONUS) - { - int animTime = (tick / 3) % 4; - int yo = 0; - if (x >= 0 && y >= 0 && x < level.width && y < level.height) yo = level.data[x][y]; - if (yo > 0) yo = (int) (Math.sin((yo - alpha) / 4.0f * Math.PI) * 8); - g.drawImage(Art.mapSprites[(4 + animTime)][0], (x << 4) - xCam, (y << 4) - yCam - yo, null); - }*/ - - if (renderBehaviors) - { - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_BLOCK_UPPER) > 0) - { - g.setColor(Color.RED); - g.fillRect((x << 4) - xCam, (y << 4) - yCam, 16, 2); - } - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_BLOCK_ALL) > 0) - { - g.setColor(Color.RED); - g.fillRect((x << 4) - xCam, (y << 4) - yCam, 16, 2); - g.fillRect((x << 4) - xCam, (y << 4) - yCam + 14, 16, 2); - g.fillRect((x << 4) - xCam, (y << 4) - yCam, 2, 16); - g.fillRect((x << 4) - xCam + 14, (y << 4) - yCam, 2, 16); - } - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_BLOCK_LOWER) > 0) - { - g.setColor(Color.RED); - g.fillRect((x << 4) - xCam, (y << 4) - yCam + 14, 16, 2); - } - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_SPECIAL) > 0) - { - g.setColor(Color.PINK); - g.fillRect((x << 4) - xCam + 2 + 4, (y << 4) - yCam + 2 + 4, 4, 4); - } - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_BUMPABLE) > 0) - { - g.setColor(Color.BLUE); - g.fillRect((x << 4) - xCam + 2, (y << 4) - yCam + 2, 4, 4); - } - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_BREAKABLE) > 0) - { - g.setColor(Color.GREEN); - g.fillRect((x << 4) - xCam + 2 + 4, (y << 4) - yCam + 2, 4, 4); - } - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_PICKUPABLE) > 0) - { - g.setColor(Color.YELLOW); - g.fillRect((x << 4) - xCam + 2, (y << 4) - yCam + 2 + 4, 4, 4); - } - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_ANIMATED) > 0) - { - } - } - - } - - - } - - public void repaint(int x, int y, int w, int h) - { - updateArea(x * 16 - xCam, y * 16 - yCam, w * 16, h * 16); - } - - public void setLevel(Level level) - { - this.level = level; - updateArea(0, 0, width, height); - } - - public void renderExit0(Graphics g, int tick, float alpha, boolean bar) - { - for (int y = level.getyExit() - 8; y < level.getyExit(); y++) - { - g.drawImage(Art.level[12][y == level.getyExit() - 8 ? 4 : 5], (level.getxExit() << 4) - xCam - 16, (y << 4) - yCam, null); - } - int yh = level.getyExit() * 16 - (int) ((Math.sin((tick + alpha) / 20) * 0.5 + 0.5) * 7 * 16) - 8; - if (bar) - { - g.drawImage(Art.level[12][3], (level.getxExit() << 4) - xCam - 16, yh - yCam, null); - g.drawImage(Art.level[13][3], (level.getxExit() << 4) - xCam, yh - yCam, null); - } - } - - - public void renderExit1(Graphics g, int tick, float alpha) - { - for (int y = level.getyExit() - 8; y < level.getyExit(); y++) - { - g.drawImage(Art.level[13][y == level.getyExit() - 8 ? 4 : 5], (level.getxExit() << 4) - xCam + 16, (y << 4) - yCam, null); - } - } -} diff --git a/src/dk/itu/mario/engine/MarioComponent.java b/src/dk/itu/mario/engine/MarioComponent.java deleted file mode 100644 index 4911857..0000000 --- a/src/dk/itu/mario/engine/MarioComponent.java +++ /dev/null @@ -1,342 +0,0 @@ -package dk.itu.mario.engine; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.GraphicsConfiguration; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.awt.image.VolatileImage; -import java.io.File; -import java.util.Random; - -import javax.imageio.ImageIO; -import javax.sound.sampled.LineUnavailableException; -import javax.swing.JComponent; - -import dk.itu.mario.MarioInterface.LevelGenerator; -import dk.itu.mario.engine.sonar.FakeSoundEngine; -import dk.itu.mario.engine.sonar.SonarSoundEngine; -import dk.itu.mario.engine.sprites.Mario; -import dk.itu.mario.scene.LevelScene; -import dk.itu.mario.scene.LevelSceneCustom; -import dk.itu.mario.scene.LoseScene; -import dk.itu.mario.scene.Scene; -import dk.itu.mario.scene.WinScene; - -public class MarioComponent extends JComponent implements Runnable, - KeyListener, FocusListener, MouseListener { - - private static final long serialVersionUID = 739318775993206607L; - public static final int TICKS_PER_SECOND = 24; - public static final int EVOLVE_VERSION = 4; - public static final int GAME_VERSION = 4; - - private boolean running = false; - private boolean screenshotTaken = false; - private boolean useScale2x = false; - private boolean isCustom = false; - private int width, height; - private GraphicsConfiguration graphicsConfiguration; - private LevelGenerator levelGenerator; - private Scene scene; - private SonarSoundEngine sound; - private Scale2x scale2x = new Scale2x(320, 240); - - public MarioComponent(int width, int height, boolean isCustomized, - LevelGenerator levelGenerator) { - addFocusListener(this); - addMouseListener(this); - addKeyListener(this); - - this.setFocusable(true); - this.setEnabled(true); - this.width = width; - this.height = height; - this.isCustom = isCustomized; - - Dimension size = new Dimension(width, height); - setPreferredSize(size); - setMinimumSize(size); - setMaximumSize(size); - - try { - sound = new SonarSoundEngine(64); - } catch (LineUnavailableException e) { - e.printStackTrace(); - sound = new FakeSoundEngine(); - } - this.setFocusable(true); - this.levelGenerator = levelGenerator; - LevelScene.bothPlayed = false; - } - - private void toggleKey(int keyCode, boolean isPressed) { - if (scene == null) { - return; - } - if (keyCode == KeyEvent.VK_LEFT) { - scene.toggleKey(Mario.KEY_LEFT, isPressed); - } - if (keyCode == KeyEvent.VK_RIGHT) { - scene.toggleKey(Mario.KEY_RIGHT, isPressed); - } - if (keyCode == KeyEvent.VK_DOWN) { - scene.toggleKey(Mario.KEY_DOWN, isPressed); - } - if (keyCode == KeyEvent.VK_UP) { - scene.toggleKey(Mario.KEY_UP, isPressed); - } - if (keyCode == KeyEvent.VK_A) { - scene.toggleKey(Mario.KEY_SPEED, isPressed); - } - if (keyCode == KeyEvent.VK_S) { - scene.toggleKey(Mario.KEY_JUMP, isPressed); - } - if (keyCode == KeyEvent.VK_ENTER) { - scene.toggleKey(Mario.KEY_ENTER, isPressed); - } - if (isPressed && keyCode == KeyEvent.VK_F1) { - useScale2x = !useScale2x; - } - if (keyCode == KeyEvent.VK_D) { - if (!isPressed) { - screenshotTaken = false; - } else if (!screenshotTaken) { - screenshotTaken = true; - takeScreenShot(); - } - } - - if (isPressed && keyCode == KeyEvent.VK_ESCAPE) { - try { - System.exit(1); - } catch (Exception e) { - System.out.println("Unable to exit."); - } - } - } - - private void takeScreenShot() { - System.out.println("Taking screenshot."); - Point loc = getLocationOnScreen(); - - Rectangle screenRect = new Rectangle(loc.x, loc.y, getWidth(), getHeight()); - - try { - - Robot robot = new Robot(); - BufferedImage bufferedImg = robot.createScreenCapture(screenRect); - File tempFile = File.createTempFile("screenshot", ".png", new File(".")); - ImageIO.write(bufferedImg, "png", - tempFile); - System.out.println("Screeshot saved to current working directory: " + tempFile.getName()); - } catch (Exception ex) { - ex.printStackTrace(System.out); - } - } - - public void paint(Graphics g) { - super.paint(g); - } - - public void update(Graphics g) { - } - - public void start() { - if (!running) { - running = true; - new Thread(this, "Game Thread").start(); - } - } - - public void stop() { - Art.stopMusic(); - running = false; - } - - public void run() { - //while (true) { - graphicsConfiguration = getGraphicsConfiguration(); - - Art.init(graphicsConfiguration, sound); - - VolatileImage image = createVolatileImage(320, 240); - Graphics g = getGraphics(); - Graphics og = image.getGraphics(); - - int lastTick = -1; - - long startTime = System.nanoTime(); - - float time = (System.nanoTime() - startTime) / 1000000000f; - float now = time; - float averagePassedTime = 0; - - boolean naiveTiming = true; - - // /Not sure I understand the weird dichotomy between LevelScene and - // LevelInterface... - randomLevel = new LevelSceneCustom(graphicsConfiguration, this, - new Random().nextLong(), 0, 0, isCustom, levelGenerator); - - Mario.fire = false; - Mario.large = false; - Mario.coins = 0; - Mario.lives = 3; - - randomLevel.init(); - randomLevel.setSound(sound); - scene = randomLevel; - // / - - while (running) { - float lastTime = time; - time = (System.nanoTime() - startTime) / 1000000000f; - float passedTime = time - lastTime; - - if (passedTime < 0) - naiveTiming = false; // Stop relying on nanotime if it starts - // skipping around in time (ie running - // backwards at least once). This - // sometimes happens on dual core amds. - averagePassedTime = averagePassedTime * 0.9f + passedTime * 0.1f; - - if (naiveTiming) { - now = time; - } else { - now += averagePassedTime; - } - - int tick = (int) (now * TICKS_PER_SECOND); - - if (lastTick == -1) - lastTick = tick; - - while (lastTick < tick) { - scene.tick(); - - lastTick++; - } - - float alpha = (float) (now * TICKS_PER_SECOND - tick); - sound.clientTick(alpha); - - og.setColor(Color.WHITE); - og.fillRect(0, 0, 320, 240); - - scene.render(og, alpha); - - if (!this.hasFocus() && tick / 4 % 2 == 0) { - String msg = "CLICK TO PLAY"; - - drawString(og, msg, 160 - msg.length() * 4 + 1, 110 + 1, 0); - drawString(og, msg, 160 - msg.length() * 4, 110, 7); - } - og.setColor(Color.BLACK); - - if (width != 320 || height != 240) { - - if (useScale2x) { - g.drawImage(scale2x.scale(image), 0, 0, null); - } else { - g.drawImage(image, 0, 0, 640, 480, null); - - } - } else { - g.drawImage(image, 0, 0, null); - } - - try { - Thread.sleep(5); - } catch (InterruptedException e) { - } - } - - Art.stopMusic(); - //} - } - - private void drawString(Graphics g, String text, int x, int y, int c) { - char[] ch = text.toCharArray(); - for (int i = 0; i < ch.length; i++) { - g.drawImage(Art.font[ch[i] - 32][c], x + i * 8, y, null); - } - } - - public void keyPressed(KeyEvent arg0) { - toggleKey(arg0.getKeyCode(), true); - } - - public void keyReleased(KeyEvent arg0) { - toggleKey(arg0.getKeyCode(), false); - } - - public void keyTyped(KeyEvent arg0) { - } - - public void focusGained(FocusEvent arg0) { - } - - public void focusLost(FocusEvent arg0) { - } - - public void levelWon() { - } - - public static final int OPTIMIZED_FIRST = 0; - public static final int MINIMIZED_FIRST = 1; - - private LevelScene randomLevel; - - public void lose() { - scene = new LoseScene(); - scene.setSound(sound); - scene.init(); - } - - public void win() { - scene = new WinScene(); - scene.setSound(sound); - scene.init(); - } - - public void mouseClicked(MouseEvent e) { - } - - public void mouseEntered(MouseEvent e) { - // TODO Auto-generated method stub - } - - public void mouseExited(MouseEvent e) { - // TODO Auto-generated method stub - } - - public void mousePressed(MouseEvent e) { - // TODO Auto-generated method stub - } - - public void mouseReleased(MouseEvent e) { - - while (!hasFocus()) { - System.out.println("FORCE IT"); - requestFocus(); - } - } - - /** - * Must return the actual fill of the viewable components - */ - public Dimension getPreferredSize() { - return new Dimension(width, height); - } - -} diff --git a/src/dk/itu/mario/engine/ParsedArgs.java b/src/dk/itu/mario/engine/ParsedArgs.java deleted file mode 100644 index b58aaae..0000000 --- a/src/dk/itu/mario/engine/ParsedArgs.java +++ /dev/null @@ -1,89 +0,0 @@ -package dk.itu.mario.engine; - -import dk.itu.mario.MarioInterface.LevelGenerator; -import dk.itu.mario.level.generator.CustomizedLevelGenerator; -import dk.itu.mario.level.generator.MyLevelGenerator; -import dk.itu.mario.level.generator.PCGLevelGenerator; -import dk.itu.mario.level.generator.RandomLevelGenerator; - -public class ParsedArgs { - public static final String NO_GEN_ERR = "Generator class not specified (use generator=... argument)."; - - //Default values per Play class: - private boolean custom = false; - private boolean videoCaptureEnabled = false; - private int levelRandSeed = (int) (Math.random() * Integer.MAX_VALUE); - private String generatorClass = "PCGLevel"; - private String videoFileName = "LevelGenerator"; - - public LevelGenerator createLevelGenerator() { - if (generatorClass == null) { - throw new UnsupportedOperationException(NO_GEN_ERR); - } - if ("MyLevel".equals(generatorClass)) { - return new MyLevelGenerator(); - } else if ("PCGLevel".equals(generatorClass)) { - return new PCGLevelGenerator(); - } else if ("CustomizedLevel".equalsIgnoreCase(generatorClass)) { - return new CustomizedLevelGenerator(); - } else if ("RandomLevel".equalsIgnoreCase(generatorClass)) { - return new RandomLevelGenerator(); - } else { - throw new UnsupportedOperationException("Cannot create LevelFactory for unrecognized class:" + generatorClass); - } - } - - public String getGeneratorClass() { - return generatorClass; - } - - public int getLevelRandSeed() { - return levelRandSeed; - } - - public String getVideoFileName() { - return videoFileName; - } - - public boolean isCustom() { - return custom; - } - - public boolean isGeneratorClassSet() { - return generatorClass != null; - } - - public boolean isVideoCaptureEnabled() { - return videoCaptureEnabled; - } - - public void setGeneratorClass(String generatorClass) { - if (generatorClass == null) { - throw new UnsupportedOperationException(NO_GEN_ERR); - } - - this.generatorClass = generatorClass; - - if ("MyLevel".equals(generatorClass)) { - custom = true; - } else if ("CustomizedLevel".equalsIgnoreCase(generatorClass)) { - custom = true; - } else { - custom = false; - } - } - - public void setVideoFileName(String videoFileName) { - this.videoFileName = videoFileName; - this.videoCaptureEnabled = true; - } - - public boolean setLevelRandSeed(String randSeedString) { - try { - levelRandSeed = Integer.valueOf(randSeedString); - return true; - } catch (NumberFormatException nfe) { - return false; - } - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/Play.java b/src/dk/itu/mario/engine/Play.java deleted file mode 100644 index 16be749..0000000 --- a/src/dk/itu/mario/engine/Play.java +++ /dev/null @@ -1,30 +0,0 @@ -package dk.itu.mario.engine; - -import java.awt.Dimension; -import java.awt.Toolkit; - -import javax.swing.JFrame; - -public class Play { - - public static void main(String[] args) { - - JFrame frame = new JFrame("Mario Experience Showcase"); - ParsedArgs parsedArgs = ArgParser.parse(args); - MarioComponent mario = new MarioComponent(640, 480, parsedArgs.isCustom(), parsedArgs.createLevelGenerator()); - - frame.setContentPane(mario); - frame.setResizable(false); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.pack(); - - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation((screenSize.width - frame.getWidth()) / 2, - (screenSize.height - frame.getHeight()) / 2); - - frame.setVisible(true); - - mario.start(); - } - -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/Scale2x.java b/src/dk/itu/mario/engine/Scale2x.java deleted file mode 100644 index 820c1b9..0000000 --- a/src/dk/itu/mario/engine/Scale2x.java +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Scale2x.java - * - * Written by Markus Persson of Mojang Specifications for a super mario programming contest. - * Implements the Scale2x algorithm described here: http://scale2x.sourceforge.net/algorithm.html - * Works on any input image size, and uses a fancy border hack to prevent range checking. - * It's fast enough for real time use on smaller images (320x240 and thereabouts) - * - * This code is public domain. Do whatever you want with it. - */ -package dk.itu.mario.engine; - -import java.awt.Graphics; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferInt; - - -public class Scale2x -{ - private int width; - private int height; - - private BufferedImage sourceImage; - private int[] sourcePixels; - private Graphics sourceGraphics; - - private BufferedImage targetImage; - private int[] targetPixels; - - /** - * Creates a new Scale2x object. The new object will scale images of the specified size to images - * that are twice as large.
- * - * @param width The width of the images to be scaled - * @param height The height of the images to be scaled - */ - public Scale2x(int width, int height) - { - this.width = width; - this.height = height; - - // A border of one pixel in each direction, and one down, to avoid if statements in the scale loop - sourceImage = new BufferedImage(width + 2, height + 3, BufferedImage.TYPE_INT_RGB); - DataBufferInt sourceDataBuffer = (DataBufferInt) sourceImage.getRaster().getDataBuffer(); - sourcePixels = sourceDataBuffer.getData(); - sourceGraphics = sourceImage.getGraphics(); - - targetImage = new BufferedImage(width * 2, height * 2, BufferedImage.TYPE_INT_RGB); - DataBufferInt targetDataBuffer = (DataBufferInt) targetImage.getRaster().getDataBuffer(); - targetPixels = targetDataBuffer.getData(); - } - - /** - * Scales an image and returns a twice as large image.
- * This assumes the input image is of the dimensions specified in the Scale2x constructor.
- * The returned image is a reference to the internal scale target in this Scale2x, so it - * will get changed if you call this method again, so don't hold on to it for too long.
- * In other words:
- * Image i0 = scale2x.scale(image0);
- * Image i1 = scale2x.scale(image1);
- * if (i0 == i1) System.exit(0); // Will always terminate

- * - * @param img The image to be scaled - * @returns A scaled image. If you want that image to survive the next call to this method, make a copy of it. - */ - public Image scale(Image img) - { - // Offset the image by one pixel so there's a border around it. - // This lets us avoid having to check that A-I are in range of the image before samping them - sourceGraphics.drawImage(img, 1, 1, null); - - int line = width + 2; - for (int y = 0; y < height; y++) - { - // Two lines of target pixel pointers - int tp0 = y * width * 4 - 1; - int tp1 = tp0 + width * 2; - - // Three lines of source pixel pointers - int sp0 = (y) * line; - int sp1 = (y + 1) * line; - int sp2 = (y + 2) * line; - - // Fill the initial A-I values - int A = sourcePixels[sp0]; - int B = sourcePixels[++sp0]; - int C = sourcePixels[++sp0]; - int D = sourcePixels[sp1]; - int E = sourcePixels[++sp1]; - int F = sourcePixels[++sp1]; - int G = sourcePixels[sp2]; - int H = sourcePixels[++sp2]; - int I = sourcePixels[++sp2]; - - for (int x = 0; x < width; x++) - { - if (B != H && D != F) - { - targetPixels[++tp0] = D == B ? D : E; - targetPixels[++tp0] = B == F ? F : E; - targetPixels[++tp1] = D == H ? D : E; - targetPixels[++tp1] = H == F ? F : E; - } - else - { - targetPixels[++tp0] = E; - targetPixels[++tp0] = E; - targetPixels[++tp1] = E; - targetPixels[++tp1] = E; - } - - // Scroll A-I left - A = B; - B = C; - D = E; - E = F; - G = H; - H = I; - - // Resample rightmost edge - C = sourcePixels[++sp0]; - F = sourcePixels[++sp1]; - I = sourcePixels[++sp2]; - } - } - - return targetImage; - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/XStreamFactory.java b/src/dk/itu/mario/engine/XStreamFactory.java deleted file mode 100644 index 14dada3..0000000 --- a/src/dk/itu/mario/engine/XStreamFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package dk.itu.mario.engine; - -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; - -public class XStreamFactory { - - public static XStream getInstance() { - XStream xstream = new XStream(new DomDriver()); - xstream.processAnnotations(DataRecorder.class); - - return xstream; - } -} diff --git a/src/dk/itu/mario/engine/sonar/.DS_Store b/src/dk/itu/mario/engine/sonar/.DS_Store deleted file mode 100644 index eff28f6..0000000 Binary files a/src/dk/itu/mario/engine/sonar/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/engine/sonar/FakeSoundEngine.java b/src/dk/itu/mario/engine/sonar/FakeSoundEngine.java deleted file mode 100644 index 9c021b6..0000000 --- a/src/dk/itu/mario/engine/sonar/FakeSoundEngine.java +++ /dev/null @@ -1,38 +0,0 @@ -package dk.itu.mario.engine.sonar; - - - -import dk.itu.mario.engine.sonar.sample.SonarSample; - - -public class FakeSoundEngine extends SonarSoundEngine -{ - public void setListener(SoundListener soundListener) - { - } - - public void shutDown() - { - } - - public SonarSample loadSample(String resourceName) - { - return null; - } - - public void play(SonarSample sample, SoundSource soundSource, float volume, float priority, float rate) - { - } - - public void clientTick(float alpha) - { - } - - public void tick() - { - } - - public void run() - { - } -} diff --git a/src/dk/itu/mario/engine/sonar/FixedSoundSource.java b/src/dk/itu/mario/engine/sonar/FixedSoundSource.java deleted file mode 100644 index 5c60251..0000000 --- a/src/dk/itu/mario/engine/sonar/FixedSoundSource.java +++ /dev/null @@ -1,33 +0,0 @@ -package dk.itu.mario.engine.sonar; - - -/** - * @author Administrator - */ -public class FixedSoundSource implements SoundSource -{ - private float x; - private float y; - - public FixedSoundSource(float x, float y) - { - this.x = x; - this.y = y; - } - - public FixedSoundSource(SoundSource soundSource) - { - this.x = soundSource.getX(1); - this.y = soundSource.getY(1); - } - - public float getX(float alpha) - { - return x; - } - - public float getY(float alpha) - { - return y; - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/sonar/SonarSoundEngine.java b/src/dk/itu/mario/engine/sonar/SonarSoundEngine.java deleted file mode 100644 index 8719a24..0000000 --- a/src/dk/itu/mario/engine/sonar/SonarSoundEngine.java +++ /dev/null @@ -1,145 +0,0 @@ -package dk.itu.mario.engine.sonar; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -import javax.sound.sampled.*; - - -import dk.itu.mario.engine.sonar.mixer.ListenerMixer; - -import dk.itu.mario.engine.sonar.sample.SamplePlayer; -import dk.itu.mario.engine.sonar.sample.SonarSample; -import dk.itu.mario.engine.sonar.sample.SampleLoader; - - - -public class SonarSoundEngine implements Runnable -{ - private SonarSample silentSample; - private SourceDataLine sdl; - private int rate = 44100; - private ListenerMixer listenerMixer; - private int bufferSize = rate / 100; // 10 ms - private ByteBuffer soundBuffer = ByteBuffer.allocate(bufferSize * 4); - private float[] leftBuf, rightBuf; - private float amplitude = 1; - private float targetAmplitude = 1; - private boolean alive = true; - - protected SonarSoundEngine() - { - } - - public SonarSoundEngine(int maxChannels) throws LineUnavailableException - { - silentSample = new SonarSample(new float[] {0}, 44100); - Mixer mixer = AudioSystem.getMixer(null); - - sdl = (SourceDataLine) mixer.getLine(new Line.Info(SourceDataLine.class)); - sdl.open(new AudioFormat(rate, 16, 2, true, false), bufferSize * 2 * 2 * 2 * 2 * 2); - soundBuffer.order(ByteOrder.LITTLE_ENDIAN); - sdl.start(); - - try - { -/* FloatControl volumeControl = (FloatControl) sdl.getControl(FloatControl.Type.MASTER_GAIN); - volumeControl.setValue(volumeControl.getMaximum());*/ - } - catch (IllegalArgumentException e) - { - System.out.println("Failed to set the sound volume"); - } - - listenerMixer = new ListenerMixer(maxChannels); - - leftBuf = new float[bufferSize]; - rightBuf = new float[bufferSize]; - - Thread thread = new Thread(this); - thread.setDaemon(true); - thread.setPriority(10); - thread.start(); - } - - public void setListener(SoundListener soundListener) - { - listenerMixer.setSoundListener(soundListener); - } - - public void shutDown() - { - alive = false; - } - - public SonarSample loadSample(String resourceName) - { - try - { - return SampleLoader.loadSample(resourceName); - } - catch (Exception e) - { - System.out.println("Failed to load sample " + resourceName + ". Using silent sample"); - e.printStackTrace(); - return silentSample; - } - } - - public void play(SonarSample sample, SoundSource soundSource, float volume, float priority, float rate) - { - synchronized (listenerMixer) - { - if(!dk.itu.mario.engine.Art.mute) - listenerMixer.addSoundProducer(new SamplePlayer((SonarSample) sample, rate), soundSource, volume, priority); - } - } - - public void clientTick(float alpha) - { - synchronized (listenerMixer) - { - listenerMixer.update(alpha); - } - } - - public void tick() - { - soundBuffer.clear(); - - // targetAmplitude = (targetAmplitude - 1) * 0.9f + 1; - // targetAmplitude = (targetAmplitude - 1) * 0.9f + 1; - synchronized (listenerMixer) - { - float maxAmplitude = listenerMixer.read(leftBuf, rightBuf, rate); - // if (maxAmplitude > targetAmplitude) targetAmplitude = maxAmplitude; - } - - soundBuffer.clear(); - float gain = 32000; - for (int i = 0; i < bufferSize; i++) - { - // amplitude += (targetAmplitude - amplitude) / rate; - // amplitude = 1; - // float gain = 30000; - int l = (int) (leftBuf[i] * gain); - int r = (int) (rightBuf[i] * gain); - if (l > 32767) l = 32767; - if (r > 32767) r = 32767; - if (l < -32767) l = -32767; - if (r < -32767) r = -32767; - soundBuffer.putShort((short)l); - soundBuffer.putShort((short)r); - } - - sdl.write(soundBuffer.array(), 0, bufferSize * 2 * 2); - } - - public void run() - { - while (alive) - { - tick(); - } - } -} diff --git a/src/dk/itu/mario/engine/sonar/SoundListener.java b/src/dk/itu/mario/engine/sonar/SoundListener.java deleted file mode 100644 index b2f722e..0000000 --- a/src/dk/itu/mario/engine/sonar/SoundListener.java +++ /dev/null @@ -1,6 +0,0 @@ -package dk.itu.mario.engine.sonar; - - -public interface SoundListener extends SoundSource -{ -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/sonar/SoundProducer.java b/src/dk/itu/mario/engine/sonar/SoundProducer.java deleted file mode 100644 index 4312b0d..0000000 --- a/src/dk/itu/mario/engine/sonar/SoundProducer.java +++ /dev/null @@ -1,8 +0,0 @@ -package dk.itu.mario.engine.sonar; - -public interface SoundProducer -{ - public float read(float[] buf, int readRate); - public void skip(int samplesToSkip, int readRate); - public boolean isLive(); -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/sonar/SoundSource.java b/src/dk/itu/mario/engine/sonar/SoundSource.java deleted file mode 100644 index 604db50..0000000 --- a/src/dk/itu/mario/engine/sonar/SoundSource.java +++ /dev/null @@ -1,7 +0,0 @@ -package dk.itu.mario.engine.sonar; - -public interface SoundSource -{ - public float getX(float alpha); - public float getY(float alpha); -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/sonar/StereoSoundProducer.java b/src/dk/itu/mario/engine/sonar/StereoSoundProducer.java deleted file mode 100644 index aef2b25..0000000 --- a/src/dk/itu/mario/engine/sonar/StereoSoundProducer.java +++ /dev/null @@ -1,7 +0,0 @@ -package dk.itu.mario.engine.sonar; - -public interface StereoSoundProducer -{ - public float read(float[] leftBuf, float[] rightBuf, int readRate); - public void skip(int samplesToSkip, int readRate); -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/sonar/mixer/.DS_Store b/src/dk/itu/mario/engine/sonar/mixer/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/src/dk/itu/mario/engine/sonar/mixer/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/engine/sonar/mixer/ListenerMixer.java b/src/dk/itu/mario/engine/sonar/mixer/ListenerMixer.java deleted file mode 100644 index 6c986f3..0000000 --- a/src/dk/itu/mario/engine/sonar/mixer/ListenerMixer.java +++ /dev/null @@ -1,93 +0,0 @@ -package dk.itu.mario.engine.sonar.mixer; - -import java.util.*; - - - -import dk.itu.mario.engine.sonar.SoundListener; -import dk.itu.mario.engine.sonar.SoundProducer; -import dk.itu.mario.engine.sonar.SoundSource; -import dk.itu.mario.engine.sonar.StereoSoundProducer; - -public class ListenerMixer implements StereoSoundProducer -{ - private List sounds = new ArrayList(); - private float[] buf = new float[0]; - private int maxChannels; - private SoundListener soundListener; - - public ListenerMixer(int maxChannels) - { - this.maxChannels = maxChannels; - } - - public void setSoundListener(SoundListener soundListener) - { - this.soundListener = soundListener; - } - - public void addSoundProducer(SoundProducer producer, SoundSource soundSource, float volume, float priority) - { - sounds.add(new Sound(producer, soundSource, volume, priority)); - } - - public void update(float alpha) - { - for (Iterator it = sounds.iterator(); it.hasNext();) - { - Sound sound = (Sound) it.next(); - sound.update(soundListener, alpha); - if (!sound.isLive()) - { - it.remove(); - } - } - } - - @SuppressWarnings("unchecked") - public float read(float[] leftBuf, float[] rightBuf, int readRate) - { - if (buf.length != leftBuf.length) buf = new float[leftBuf.length]; - - if (sounds.size() > maxChannels) - { - Collections.sort(sounds); - } - - Arrays.fill(leftBuf, 0); - Arrays.fill(rightBuf, 0); - float maxAmplitude = 0; - for (int i = 0; i < sounds.size(); i++) - { - Sound sound = (Sound) sounds.get(i); - if (i < maxChannels) - { - sound.read(buf, readRate); - float rp = (sound.pan<0?1:1-sound.pan)*sound.amplitude; - float lp = (sound.pan>0?1:1+sound.pan)*sound.amplitude; - for (int j = 0; j < leftBuf.length; j++) - { - leftBuf[j] += buf[j]*lp; - rightBuf[j] += buf[j]*rp; - if (leftBuf[j]>maxAmplitude) maxAmplitude = leftBuf[j]; - if (rightBuf[j]>maxAmplitude) maxAmplitude = rightBuf[j]; - } - } - else - { - sound.skip(leftBuf.length, readRate); - } - } - - return maxAmplitude; - } - - public void skip(int samplesToSkip, int readRate) - { - for (int i = 0; i < sounds.size(); i++) - { - Sound sound = (Sound) sounds.get(i); - sound.skip(samplesToSkip, readRate); - } - } -} diff --git a/src/dk/itu/mario/engine/sonar/mixer/Sound.java b/src/dk/itu/mario/engine/sonar/mixer/Sound.java deleted file mode 100644 index 43ceb76..0000000 --- a/src/dk/itu/mario/engine/sonar/mixer/Sound.java +++ /dev/null @@ -1,84 +0,0 @@ -package dk.itu.mario.engine.sonar.mixer; - - - -import dk.itu.mario.engine.sonar.SoundListener; -import dk.itu.mario.engine.sonar.SoundProducer; -import dk.itu.mario.engine.sonar.SoundSource; - - -public class Sound implements Comparable -{ - private static final double l10 = Math.log(10); - - private SoundProducer producer; - private SoundSource source; - private float volume; - private float priority; - - private float x, y, z; - private float score = 0; - - public float pan; - public float amplitude; - - public Sound(SoundProducer producer, SoundSource source, float volume, float priority) - { - this.producer = producer; - this.source = source; - this.volume = volume; - this.priority = priority; - } - - public void update(SoundListener listener, float alpha) - { - x = source.getX(alpha)-listener.getX(alpha); - y = source.getY(alpha)-listener.getY(alpha); - - float distSqr = x*x+y*y+z*z; - float dist = (float)Math.sqrt(distSqr); - - float REFERENCE_DISTANCE = 1; - float ROLLOFF_FACTOR = 2; - -// float dB = (float)(volume + (20 * (Math.log(1.0 / distSqr) / l10))); - float dB = (float)(volume - 20*Math.log(1 + ROLLOFF_FACTOR*(dist-REFERENCE_DISTANCE)/REFERENCE_DISTANCE )/ l10); - dB = Math.min(dB, +6); -// dB = Math.max(dB, MIN_GAIN); - - score = dB*priority; - -// double angle = WMath.atan2(y, x); - - float p = -x/320.0f; - if (p<-1) p = -1; - if (p>1) p = 1; - float dd = distSqr/16; - if (dd>1) dd = 1; - pan =(p*dd); - amplitude = volume*1f; - } - - public void read(float[] buf, int readRate) - { - producer.read(buf, readRate); - } - - public void skip(int samplesToSkip, int readRate) - { - producer.skip(samplesToSkip, readRate); - } - - public boolean isLive() - { - return producer.isLive(); - } - - public int compareTo(Object o) - { - Sound s = (Sound)o; - if (s.score>score) return 1; - if (s.score 0) - { - bos.write(b, 0, read); - } - - bos.close(); - return bos.toByteArray(); - } - - /** - * Reorganizes audio sample data into the intenal sonar format - */ - private static SonarSample buildSample(byte[] b, AudioFormat af) throws UnsupportedAudioFileException - { - // Rip audioformat data - int channels = af.getChannels(); - int sampleSize = af.getSampleSizeInBits(); - float rate = af.getFrameRate(); - boolean signed = af.getEncoding() == AudioFormat.Encoding.PCM_SIGNED; - - // Sanity checking - if (channels != 1) throw new UnsupportedAudioFileException("Only mono samples are supported"); - if (!(sampleSize == 8 || sampleSize == 16 || sampleSize == 32)) throw new UnsupportedAudioFileException("Unsupported sample size"); - if (!(af.getEncoding() == AudioFormat.Encoding.PCM_UNSIGNED || af.getEncoding() == AudioFormat.Encoding.PCM_SIGNED)) throw new UnsupportedAudioFileException("Unsupported encoding"); - - // Wrap the data into a bytebuffer, and set up the byte order - ByteBuffer bb = ByteBuffer.wrap(b); - bb.order(af.isBigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); - - int s = b.length / (sampleSize / 8); - float[] buf = new float[s]; - // Six different cases for reordering the data. Can this be improved without slowing it down? - if (sampleSize == 8) - { - if (signed) - { - for (int i = 0; i < s; i++) - buf[i] = bb.get() / (float)0x80; - } - else - { - for (int i = 0; i < s; i++) - buf[i] = ((bb.get()&0xFF)-0x80) / (float)0x80; - } - } - else if (sampleSize == 16) - { - if (signed) - { - for (int i = 0; i < s; i++) - buf[i] = bb.getShort() / (float)0x8000; - } - else - { - for (int i = 0; i < s; i++) - buf[i] = ((bb.getShort()&0xFFFF)-0x8000) / (float)0x8000; - } - } - else if (sampleSize == 32) - { - if (signed) - { - for (int i = 0; i < s; i++) - buf[i] = bb.getInt() / (float)0x80000000; - } - else - { - // Nasty.. check this. - for (int i = 0; i < s; i++) - buf[i] = ((bb.getInt()&0xFFFFFFFFl)-0x80000000l) / (float)0x80000000; - } - } - - // Return the completed sample - return new SonarSample(buf, rate); - } -} diff --git a/src/dk/itu/mario/engine/sonar/sample/SamplePlayer.java b/src/dk/itu/mario/engine/sonar/sample/SamplePlayer.java deleted file mode 100644 index a4f3865..0000000 --- a/src/dk/itu/mario/engine/sonar/sample/SamplePlayer.java +++ /dev/null @@ -1,57 +0,0 @@ -package dk.itu.mario.engine.sonar.sample; - - - -import dk.itu.mario.engine.sonar.SoundProducer; - - -public class SamplePlayer implements SoundProducer -{ - private SonarSample sample; - private float pos = 0; - public boolean alive = true; - private float rate; - - public SamplePlayer(SonarSample sample, float rate) - { - this.rate = rate; - this.sample = sample; - } - - public float read(float[] buf, int readRate) - { - float step = (sample.rate*rate)/readRate; - - for (int i=0; i=sample.buf.length) - { - buf[i] = 0; - alive = false; - } - else - { - buf[i]=sample.buf[(int)(pos)]; - } - pos+=step; - } - - return 1; - } - - public void skip(int samplesToSkip, int readRate) - { - float step = sample.rate/readRate; - pos+=step*samplesToSkip; - - if (pos>=sample.buf.length) - { - alive = false; - } - } - - public boolean isLive() - { - return alive; - } -} diff --git a/src/dk/itu/mario/engine/sonar/sample/SonarSample.java b/src/dk/itu/mario/engine/sonar/sample/SonarSample.java deleted file mode 100644 index e921d8b..0000000 --- a/src/dk/itu/mario/engine/sonar/sample/SonarSample.java +++ /dev/null @@ -1,13 +0,0 @@ -package dk.itu.mario.engine.sonar.sample; - -public class SonarSample -{ - public final float[] buf; - public final float rate; - - public SonarSample(float[] buf, float rate) - { - this.buf = buf; - this.rate = rate; - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/engine/sprites/.DS_Store b/src/dk/itu/mario/engine/sprites/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/src/dk/itu/mario/engine/sprites/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/engine/sprites/BulletBill.java b/src/dk/itu/mario/engine/sprites/BulletBill.java deleted file mode 100644 index dcf23b7..0000000 --- a/src/dk/itu/mario/engine/sprites/BulletBill.java +++ /dev/null @@ -1,152 +0,0 @@ -package dk.itu.mario.engine.sprites; - - -import dk.itu.mario.engine.Art; -import dk.itu.mario.scene.LevelScene; - - -public class BulletBill extends Sprite -{ - private int width = 4; - int height = 24; - - private LevelScene world; - public int facing; - - public boolean avoidCliffs = false; - public int anim; - - public boolean dead = false; - private int deadTime = 0; - - - public BulletBill(LevelScene world, float x, float y, int dir) - { - sheet = Art.enemies; - - this.x = x; - this.y = y; - this.world = world; - xPicO = 8; - yPicO = 31; - - height = 12; - facing = 0; - wPic = 16; - yPic = 5; - - xPic = 0; - ya = -5; - this.facing = dir; - } - - public void collideCheck() - { - if (dead) return; - - float xMarioD = world.mario.x - x; - float yMarioD = world.mario.y - y; - float w = 16; - if (xMarioD > -16 && xMarioD < 16) - { - if (yMarioD > -height && yMarioD < world.mario.height) - { - if (world.mario.ya > 0 && yMarioD <= 0 && (!world.mario.onGround || !world.mario.wasOnGround)) - { - world.mario.stomp(this); - dead = true; - - xa = 0; - ya = 1; - deadTime = 100; - } - else - { - world.mario.getHurt(this); - } - } - } - } - - public void move() - { - if (deadTime > 0) - { - deadTime--; - - if (deadTime == 0) - { - deadTime = 1; - for (int i = 0; i < 8; i++) - { - world.addSprite(new Sparkle((int) (x + Math.random() * 16 - 8) + 4, (int) (y - Math.random() * 8) + 4, (float) (Math.random() * 2 - 1), (float) Math.random() * -1, 0, 1, 5)); - } - spriteContext.removeSprite(this); - } - - x += xa; - y += ya; - ya *= 0.95; - ya += 1; - - return; - } - - float sideWaysSpeed = 4f; - - xa = facing * sideWaysSpeed; - xFlipPic = facing == -1; - move(xa, 0); - } - - private boolean move(float xa, float ya) - { - x += xa; - return true; - } - - public boolean fireballCollideCheck(Fireball fireball) - { - if (deadTime != 0) return false; - - float xD = fireball.x - x; - float yD = fireball.y - y; - - if (xD > -16 && xD < 16) - { - if (yD > -height && yD < fireball.height) - { - return true; - } - } - return false; - } - - public boolean shellCollideCheck(Shell shell) - { - if (deadTime != 0) return false; - - float xD = shell.x - x; - float yD = shell.y - y; - - if (xD > -16 && xD < 16) - { - if (yD > -height && yD < shell.height) - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - - dead = true; - - xa = 0; - ya = 1; - deadTime = 100; - - if(world.recorder != null) - world.recorder.shellKillRecord(this); - - return true; - } - } - return false; - } -} diff --git a/src/dk/itu/mario/engine/sprites/CoinAnim.java b/src/dk/itu/mario/engine/sprites/CoinAnim.java deleted file mode 100644 index 65c2d73..0000000 --- a/src/dk/itu/mario/engine/sprites/CoinAnim.java +++ /dev/null @@ -1,41 +0,0 @@ -package dk.itu.mario.engine.sprites; - -import dk.itu.mario.engine.Art; -import dk.itu.mario.level.Level; - - - -public class CoinAnim extends Sprite -{ - private int life = 10; - - public CoinAnim(int xTile, int yTile) - { - sheet = Art.level; - wPic = hPic = 16; - - x = xTile * 16; - y = yTile * 16 - 16; - xa = 0; - ya = -6f; - xPic = 0; - yPic = 2; - } - - public void move() - { - if (life-- < 0) - { - Sprite.spriteContext.removeSprite(this); - for (int xx = 0; xx < 2; xx++) - for (int yy = 0; yy < 2; yy++) - Sprite.spriteContext.addSprite(new Sparkle((int)x + xx * 8 + (int) (Math.random() * 8), (int)y + yy * 8 + (int) (Math.random() * 8), 0, 0, 0, 2, 5)); - } - - xPic = life & 3; - - x += xa; - y += ya; - ya += 1; - } -} diff --git a/src/dk/itu/mario/engine/sprites/Enemy.java b/src/dk/itu/mario/engine/sprites/Enemy.java deleted file mode 100644 index 21c0883..0000000 --- a/src/dk/itu/mario/engine/sprites/Enemy.java +++ /dev/null @@ -1,443 +0,0 @@ -package dk.itu.mario.engine.sprites; - -import java.awt.Graphics; - - -import dk.itu.mario.engine.Art; -import dk.itu.mario.level.Level; -import dk.itu.mario.scene.LevelScene; - - - -public class Enemy extends Sprite -{ - public static final int ENEMY_RED_KOOPA = 0; - public static final int ENEMY_GREEN_KOOPA = 1; - public static final int ENEMY_GOOMBA = 2; - public static final int ENEMY_SPIKY = 3; - public static final int ENEMY_FLOWER = 4; - - private static float GROUND_INERTIA = 0.89f; - private static float AIR_INERTIA = 0.89f; - - private float runTime; - private boolean onGround = false; - private boolean mayJump = false; - private int jumpTime = 0; - private float xJumpSpeed; - private float yJumpSpeed; - - int width = 4; - int height = 24; - - private LevelScene world; - public int facing; - public int deadTime = 0; - public boolean flyDeath = false; - - public boolean avoidCliffs = true; - public int type; - - public boolean winged = true; - private int wingTime = 0; - - public boolean noFireballDeath; - - public Enemy(LevelScene world, int x, int y, int dir, int type, boolean winged) - { - this.type = type; - sheet = Art.enemies; - this.winged = winged; - - - this.world = world; - this.x = x; - this.y = y; - - xPicO = 8; - yPicO = 31; - - avoidCliffs = type == Enemy.ENEMY_RED_KOOPA; - - noFireballDeath = type == Enemy.ENEMY_SPIKY; - - yPic = type; - if (yPic > 1) height = 12; - facing = dir; - if (facing == 0) facing = 1; - this.wPic = 16; - } - - public void collideCheck() - { - if (deadTime != 0) - { - return; - } - - float xMarioD = world.mario.x - x; - float yMarioD = world.mario.y - y; - float w = 16; - - //if the distance to mario is within the sprite (in x) - if (xMarioD > -width*2-4 && xMarioD < width*2+4) - { - //if the distance to mario is within the sprite (in y) - if (yMarioD > -height && yMarioD < world.mario.height) - { - if (type != Enemy.ENEMY_SPIKY && world.mario.ya > 0 && yMarioD <= 0 && (!world.mario.onGround || !world.mario.wasOnGround)) - { - world.mario.stomp(this); - - if (winged) - { - winged = false; - ya = 0; - } - else - { - this.yPicO = 31 - (32 - 8); - hPic = 8; - if (spriteTemplate != null) spriteTemplate.isDead = true; - deadTime = 10; - winged = false; - - if (type == Enemy.ENEMY_RED_KOOPA) - { - spriteContext.addSprite(new Shell(world, x, y, 0)); - } - else if (type == Enemy.ENEMY_GREEN_KOOPA) - { - spriteContext.addSprite(new Shell(world, x, y, 1)); - } - } - } - else - { - world.mario.getHurt(this); - } - } - } - } - - public void move() - { - //TODO: some kind of suicide error when one enemy is created - if (y > world.level.getHeight() * 16 + 16 && deadTime <= 0) - { - if(world.recorder != null) - world.recorder.killSuicideRecord(this); - - deadTime = 1; - } - - wingTime++; - if (deadTime > 0) - { - deadTime--; - - if (deadTime == 0) - { - deadTime = 1; - for (int i = 0; i < 8; i++) - { - world.addSprite(new Sparkle((int) (x + Math.random() * 16 - 8) + 4, (int) (y - Math.random() * 8) + 4, (float) (Math.random() * 2 - 1), (float) Math.random() * -1, 0, 1, 5)); - } - spriteContext.removeSprite(this); - } - - if (flyDeath) - { - x += xa; - y += ya; - ya *= 0.95; - ya += 1; - } - return; - } - - - float sideWaysSpeed = 1.75f; - // float sideWaysSpeed = onGround ? 2.5f : 1.2f; - - if (xa > 2) - { - facing = 1; - } - if (xa < -2) - { - facing = -1; - } - - xa = facing * sideWaysSpeed; - - mayJump = (onGround); - - xFlipPic = facing == -1; - - runTime += (Math.abs(xa)) + 5; - - int runFrame = ((int) (runTime / 20)) % 2; - - if (!onGround) - { - runFrame = 1; - } - - - if (!move(xa, 0)) facing = -facing; - onGround = false; - move(0, ya); - - ya *= winged ? 0.95f : 0.85f; - if (onGround) - { - xa *= GROUND_INERTIA; - } - else - { - xa *= AIR_INERTIA; - } - - if (!onGround) - { - if (winged) - { - ya += 0.6f; - } - else - { - ya += 2; - } - } - else if (winged) - { - ya = -10; - } - - if (winged) runFrame = wingTime / 4 % 2; - - xPic = runFrame; - } - - private boolean move(float xa, float ya) - { - while (xa > 8) - { - if (!move(8, 0)) return false; - xa -= 8; - } - while (xa < -8) - { - if (!move(-8, 0)) return false; - xa += 8; - } - while (ya > 8) - { - if (!move(0, 8)) return false; - ya -= 8; - } - while (ya < -8) - { - if (!move(0, -8)) return false; - ya += 8; - } - - boolean collide = false; - if (ya > 0) - { - if (isBlocking(x + xa - width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa + width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa - width, y + ya + 1, xa, ya)) collide = true; - else if (isBlocking(x + xa + width, y + ya + 1, xa, ya)) collide = true; - } - if (ya < 0) - { - if (isBlocking(x + xa, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - } - if (xa > 0) - { - if (isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa + width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - if (xa < 0) - { - if (isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa - width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - - if (collide) - { - if (xa < 0) - { - x = (int) ((x - width) / 16) * 16 + width; - this.xa = 0; - } - if (xa > 0) - { - x = (int) ((x + width) / 16 + 1) * 16 - width - 1; - this.xa = 0; - } - if (ya < 0) - { - y = (int) ((y - height) / 16) * 16 + height; - jumpTime = 0; - this.ya = 0; - } - if (ya > 0) - { - y = (int) (y / 16 + 1) * 16 - 1; - onGround = true; - } - return false; - } - else - { - x += xa; - y += ya; - return true; - } - } - - private boolean isBlocking(float _x, float _y, float xa, float ya) - { - int x = (int) (_x / 16); - int y = (int) (_y / 16); - if (x == (int) (this.x / 16) && y == (int) (this.y / 16)) return false; - - boolean blocking = world.level.isBlocking(x, y, xa, ya); - - byte block = world.level.getBlock(x, y); - - return blocking; - } - - public boolean shellCollideCheck(Shell shell) - { - if (deadTime != 0) return false; - - float xD = shell.x - x; - float yD = shell.y - y; - - if (xD > -16 && xD < 16) - { - if (yD > -height && yD < shell.height) - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - - xa = shell.facing * 2; - ya = -5; - flyDeath = true; - if (spriteTemplate != null) spriteTemplate.isDead = true; - deadTime = 100; - winged = false; - hPic = -hPic; - yPicO = -yPicO + 16; - - if(world.recorder != null) - world.recorder.shellKillRecord(this); - - return true; - } - } - return false; - } - - public boolean fireballCollideCheck(Fireball fireball) - { - if (deadTime != 0) return false; - - float xD = fireball.x - x; - float yD = fireball.y - y; - - if (xD > -16 && xD < 16) - { - if (yD > -height && yD < fireball.height) - { - if (noFireballDeath) return true; - - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - - xa = fireball.facing * 2; - ya = -5; - flyDeath = true; - if (spriteTemplate != null) spriteTemplate.isDead = true; - deadTime = 100; - winged = false; - hPic = -hPic; - yPicO = -yPicO + 16; - - - if(world.recorder != null) - world.recorder.fireKillRecord(this); - - return true; - } - } - return false; - } - - public void bumpCheck(int xTile, int yTile) - { - if (deadTime != 0) return; - - if (x + width > xTile * 16 && x - width < xTile * 16 + 16 && yTile == (int) ((y - 1) / 16)) - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - - xa = -world.mario.facing * 2; - ya = -5; - flyDeath = true; - if (spriteTemplate != null) spriteTemplate.isDead = true; - deadTime = 100; - winged = false; - hPic = -hPic; - yPicO = -yPicO + 16; - - } - } - - public void render(Graphics og, float alpha) - { - if (winged) - { - int xPixel = (int) (xOld + (x - xOld) * alpha) - xPicO; - int yPixel = (int) (yOld + (y - yOld) * alpha) - yPicO; - - if (type == Enemy.ENEMY_GREEN_KOOPA || type == Enemy.ENEMY_RED_KOOPA) - { - } - else - { - xFlipPic = !xFlipPic; - og.drawImage(sheet[wingTime / 4 % 2][4], xPixel + (xFlipPic ? wPic : 0) + (xFlipPic ? 10 : -10), yPixel + (yFlipPic ? hPic : 0) - 8, xFlipPic ? -wPic : wPic, yFlipPic ? -hPic : hPic, null); - xFlipPic = !xFlipPic; - } - } - - super.render(og, alpha); - - if (winged) - { - int xPixel = (int) (xOld + (x - xOld) * alpha) - xPicO; - int yPixel = (int) (yOld + (y - yOld) * alpha) - yPicO; - - if (type == Enemy.ENEMY_GREEN_KOOPA || type == Enemy.ENEMY_RED_KOOPA) - { - og.drawImage(sheet[wingTime / 4 % 2][4], xPixel + (xFlipPic ? wPic : 0) + (xFlipPic ? 10 : -10), yPixel + (yFlipPic ? hPic : 0) - 10, xFlipPic ? -wPic : wPic, yFlipPic ? -hPic : hPic, null); - } - else - { - og.drawImage(sheet[wingTime / 4 % 2][4], xPixel + (xFlipPic ? wPic : 0) + (xFlipPic ? 10 : -10), yPixel + (yFlipPic ? hPic : 0) - 8, xFlipPic ? -wPic : wPic, yFlipPic ? -hPic : hPic, null); - } - } - } -} diff --git a/src/dk/itu/mario/engine/sprites/FireFlower.java b/src/dk/itu/mario/engine/sprites/FireFlower.java deleted file mode 100644 index 55e9c16..0000000 --- a/src/dk/itu/mario/engine/sprites/FireFlower.java +++ /dev/null @@ -1,63 +0,0 @@ -package dk.itu.mario.engine.sprites; - - -import dk.itu.mario.engine.Art; -import dk.itu.mario.scene.LevelScene; - - - -public class FireFlower extends Sprite -{ - private int width = 4; - int height = 24; - - private LevelScene world; - public int facing; - - public boolean avoidCliffs = false; - private int life; - - public FireFlower(LevelScene world, int x, int y) - { - sheet = Art.items; - - this.x = x; - this.y = y; - this.world = world; - xPicO = 8; - yPicO = 15; - - xPic = 1; - yPic = 0; - height = 12; - facing = 1; - wPic = hPic = 16; - life = 0; - } - - public void collideCheck() - { - float xMarioD = world.mario.x - x; - float yMarioD = world.mario.y - y; - float w = 16; - if (xMarioD > -16 && xMarioD < 16) - { - if (yMarioD > -height && yMarioD < world.mario.height) - { - world.mario.getFlower(); - spriteContext.removeSprite(this); - } - } - } - - public void move() - { - if (life<9) - { - layer = 0; - y--; - life++; - return; - } - } -} diff --git a/src/dk/itu/mario/engine/sprites/Fireball.java b/src/dk/itu/mario/engine/sprites/Fireball.java deleted file mode 100644 index 889f7a1..0000000 --- a/src/dk/itu/mario/engine/sprites/Fireball.java +++ /dev/null @@ -1,220 +0,0 @@ -package dk.itu.mario.engine.sprites; - - -import dk.itu.mario.engine.Art; -import dk.itu.mario.scene.LevelScene; - - - -public class Fireball extends Sprite -{ - private static float GROUND_INERTIA = 0.89f; - private static float AIR_INERTIA = 0.89f; - - private float runTime; - private boolean onGround = false; - - private int width = 4; - int height = 24; - - private LevelScene world; - public int facing; - - public boolean avoidCliffs = false; - public int anim; - - public boolean dead = false; - private int deadTime = 0; - - public Fireball(LevelScene world, float x, float y, int facing) - { - sheet = Art.particles; - - this.x = x; - this.y = y; - this.world = world; - xPicO = 4; - yPicO = 4; - - yPic = 3; - height = 8; - this.facing = facing; - wPic = 8; - hPic = 8; - - xPic = 4; - ya = 4; - } - - public void move() - { - if (deadTime > 0) - { - for (int i = 0; i < 8; i++) - { - world.addSprite(new Sparkle((int) (x + Math.random() * 8 - 4)+4, (int) (y + Math.random() * 8-4)+2, (float) Math.random() * 2 - 1-facing, (float) Math.random() *2 -1, 0, 1, 5)); - } - spriteContext.removeSprite(this); - - return; - } - - if (facing != 0) anim++; - - float sideWaysSpeed = 8f; - // float sideWaysSpeed = onGround ? 2.5f : 1.2f; - - if (xa > 2) - { - facing = 1; - } - if (xa < -2) - { - facing = -1; - } - - xa = facing * sideWaysSpeed; - - world.checkFireballCollide(this); - - xFlipPic = facing == -1; - - runTime += (Math.abs(xa)) + 5; - - xPic = (anim) % 4; - - - - if (!move(xa, 0)) - { - die(); - } - - onGround = false; - move(0, ya); - if (onGround) ya = -10; - - ya *= 0.95f; - if (onGround) - { - xa *= GROUND_INERTIA; - } - else - { - xa *= AIR_INERTIA; - } - - if (!onGround) - { - ya += 1.5; - } - } - - private boolean move(float xa, float ya) - { - while (xa > 8) - { - if (!move(8, 0)) return false; - xa -= 8; - } - while (xa < -8) - { - if (!move(-8, 0)) return false; - xa += 8; - } - while (ya > 8) - { - if (!move(0, 8)) return false; - ya -= 8; - } - while (ya < -8) - { - if (!move(0, -8)) return false; - ya += 8; - } - - boolean collide = false; - if (ya > 0) - { - if (isBlocking(x + xa - width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa + width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa - width, y + ya + 1, xa, ya)) collide = true; - else if (isBlocking(x + xa + width, y + ya + 1, xa, ya)) collide = true; - } - if (ya < 0) - { - if (isBlocking(x + xa, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - } - if (xa > 0) - { - if (isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa + width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - if (xa < 0) - { - if (isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa - width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - - if (collide) - { - if (xa < 0) - { - x = (int) ((x - width) / 16) * 16 + width; - this.xa = 0; - } - if (xa > 0) - { - x = (int) ((x + width) / 16 + 1) * 16 - width - 1; - this.xa = 0; - } - if (ya < 0) - { - y = (int) ((y - height) / 16) * 16 + height; - this.ya = 0; - } - if (ya > 0) - { - y = (int) (y / 16 + 1) * 16 - 1; - onGround = true; - } - return false; - } - else - { - x += xa; - y += ya; - return true; - } - } - - private boolean isBlocking(float _x, float _y, float xa, float ya) - { - int x = (int) (_x / 16); - int y = (int) (_y / 16); - if (x == (int) (this.x / 16) && y == (int) (this.y / 16)) return false; - - boolean blocking = world.level.isBlocking(x, y, xa, ya); - - byte block = world.level.getBlock(x, y); - - return blocking; - } - - public void die() - { - dead = true; - - xa = -facing * 2; - ya = -5; - deadTime = 100; - } -} diff --git a/src/dk/itu/mario/engine/sprites/FlowerEnemy.java b/src/dk/itu/mario/engine/sprites/FlowerEnemy.java deleted file mode 100644 index 4ec3a08..0000000 --- a/src/dk/itu/mario/engine/sprites/FlowerEnemy.java +++ /dev/null @@ -1,103 +0,0 @@ -package dk.itu.mario.engine.sprites; - -import dk.itu.mario.level.Level; -import dk.itu.mario.scene.LevelScene; -import dk.itu.mario.engine.sprites.*; - -public class FlowerEnemy extends Enemy -{ - private int tick; - private int yStart; - private int jumpTime = 0; - private LevelScene world; - - public FlowerEnemy(LevelScene world, int x, int y) - { - super(world, x, y, 1, ENEMY_SPIKY, false); - - noFireballDeath = false; - this.world = world; - this.xPic = 0; - this.yPic = 6; - this.yPicO = 24; - this.height = 12; - this.width = 2; - - yStart = y; - ya = -8; - - this.y-=1; - - this.layer = 0; - for (int i=0; i<4; i++) - { - move(); - } - } - - public void move() - { - if (deadTime > 0) - { - deadTime--; - - if (deadTime == 0) - { - deadTime = 1; - for (int i = 0; i < 8; i++) - { - world.addSprite(new Sparkle((int) (x + Math.random() * 16 - 8) + 4, (int) (y - Math.random() * 8) + 4, (float) (Math.random() * 2 - 1), (float) Math.random() * -1, 0, 1, 5)); - } - spriteContext.removeSprite(this); - } - - x += xa; - y += ya; - ya *= 0.95; - ya += 1; - - return; - } - - tick++; - - if (y>=yStart) - { - y = yStart; - - int xd = (int)(Math.abs(world.mario.x-x)); - jumpTime++; - if (jumpTime>40 && xd>24) - { - ya = -8; - } - else - { - ya = 0; - } - } - else - { - jumpTime = 0; - } - - y+=ya; - ya*=0.9; - ya+=0.1f; - - xPic = ((tick/2)&1)*2+((tick/6)&1); - } - -/* public void render(Graphics og, float alpha) - { - if (!visible) return; - - int xPixel = (int)(xOld+(x-xOld)*alpha)-xPicO; - int yPixel = (int)(yOld+(y-yOld)*alpha)-yPicO; - - int a = ((tick/3)&1)*2; -// a += ((tick/8)&1); - og.drawImage(sheet[a*2+0][6], xPixel-8, yPixel+8, 16, 32, null); - og.drawImage(sheet[a*2+1][6], xPixel+8, yPixel+8, 16, 32, null); - }*/ -} diff --git a/src/dk/itu/mario/engine/sprites/Mario.java b/src/dk/itu/mario/engine/sprites/Mario.java deleted file mode 100644 index fbce871..0000000 --- a/src/dk/itu/mario/engine/sprites/Mario.java +++ /dev/null @@ -1,918 +0,0 @@ -package dk.itu.mario.engine.sprites; - - - - - -import dk.itu.mario.engine.Art; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.engine.sonar.FixedSoundSource; -import dk.itu.mario.level.Level; -import dk.itu.mario.scene.LevelScene; -import dk.itu.mario.scene.Scene; - - - - -public class Mario extends Sprite -{ - public static boolean large = false; - public static boolean fire = false; - public static int coins = 0; - public static int lives = 3; - public static String levelString = "none"; - - public static void resetStatic() - { - large = false; - fire = false; - coins = 0; - lives = 3; - levelString = "none"; - } - - public static final int KEY_LEFT = 0; - public static final int KEY_RIGHT = 1; - public static final int KEY_DOWN = 2; - public static final int KEY_UP = 3; - public static final int KEY_JUMP = 4; - public static final int KEY_SPEED = 5; - public static final int KEY_ENTER = 6; - - private static float GROUND_INERTIA = 0.89f; - private static float AIR_INERTIA = 0.89f; - - public boolean[] keys; - private float runTime; - boolean wasOnGround = false; - boolean onGround = false; - private boolean mayJump = false; - public boolean ducking = false; - public boolean running = false; - public int direction = 0; - private boolean sliding = false; - private int jumpTime = 0; - private float xJumpSpeed; - private float yJumpSpeed; - private boolean canShoot = false; - - int width = 4; - int height = 24; - - private LevelScene world; - public int facing; - private int powerUpTime = 0; - - public int xDeathPos, yDeathPos; - - public int deathTime = 0; - public int winTime = 0; - private int invulnerableTime = 0; - - public Sprite carried = null; - private static Mario instance; - - public Mario(LevelScene world) - { - Mario.instance = this; - this.world = world; - keys = Scene.keys; - x = 32; - y = 0; - - facing = 1; - - //TODO: REMOVE THESE TEST VARIABLES -// Mario.large = true; -// Mario.fire = true; - - setLarge(Mario.large, Mario.fire); - } - - private boolean lastLarge; - private boolean lastFire; - private boolean newLarge; - private boolean newFire; - - private void blink(boolean on) - { - Mario.large = on?newLarge:lastLarge; - Mario.fire = on?newFire:lastFire; - - if (large) - { - sheet = Art.mario; - if (fire) - sheet = Art.fireMario; - - xPicO = 16; - yPicO = 31; - wPic = hPic = 32; - } - else - { - sheet = Art.smallMario; - - xPicO = 8; - yPicO = 15; - wPic = hPic = 16; - } - - calcPic(); - } - - void setLarge(boolean large, boolean fire) - { - if (fire) large = true; - if (!large) fire = false; - - lastLarge = Mario.large; - lastFire = Mario.fire; - - Mario.large = large; - Mario.fire = fire; - - newLarge = Mario.large; - newFire = Mario.fire; - - blink(true); - } - - public void move() - { - if(deathTime == 0 && winTime == 0){ - if (keys[KEY_DOWN] && large && ducking) - { - if(world.recorder != null && world.recorder.recording) - world.recorder.startDuckRecord(); - } - else - { - if(world.recorder != null && world.recorder.recording && !ducking) - world.recorder.endDuckRecord(); - } - } - - if(deathTime == 0 && winTime == 0){ - if(keys[KEY_SPEED]){ - if(world.recorder!= null && world.recorder.recording){ - world.recorder.startRunningRecord(); - } - - running = true; - } - else{ - if(world.recorder!= null && world.recorder.recording){ - world.recorder.endRunningRecord(); - } - - running = false; - } - } - - if (winTime > 0) - { - - winTime++; - - xa = 0; - ya = 0; - return; - } - - if (deathTime > 0) - { - deathTime++; - if (deathTime < 11) - { - xa = 0; - ya = 0; - } - else if (deathTime == 11) - { - ya = -15; - } - else - { - ya += 2; - } - x += xa; - y += ya; - return; - } - - if (powerUpTime != 0) - { - if (powerUpTime > 0) - { - powerUpTime--; - blink(((powerUpTime / 3) & 1) == 0); - } - else - { - powerUpTime++; - blink(((-powerUpTime / 3) & 1) == 0); - } - - if (powerUpTime == 0) world.paused = false; - - calcPic(); - return; - } - - if (invulnerableTime > 0) invulnerableTime--; - visible = ((invulnerableTime / 2) & 1) == 0; - - wasOnGround = onGround; - float sideWaysSpeed = keys[KEY_SPEED] ? 1.2f : 0.6f; - // float sideWaysSpeed = onGround ? 2.5f : 1.2f; - - if (onGround) - { - if (keys[KEY_DOWN] && large) - { - if(world.recorder != null) - world.recorder.startDuckRecord(); - - ducking = true; - } - else - { - if(world.recorder != null) - world.recorder.endDuckRecord(); - - ducking = false; - } - - if(world.recorder != null) - world.recorder.recordJumpLand(); - } - - if (xa > 2) - { - facing = 1; - } - if (xa < -2) - { - facing = -1; - } - - if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding)) - { - if (jumpTime < 0) - { - xa = xJumpSpeed; - ya = -jumpTime * yJumpSpeed; - jumpTime++; - } - else if (onGround && mayJump) - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1); - xJumpSpeed = 0; - yJumpSpeed = -1.9f; - jumpTime = 7; - ya = jumpTime * yJumpSpeed; - onGround = false; - sliding = false; - - if(world.recorder != null){ - world.recorder.isInAir = true; - world.recorder.recordJump(); - } - } - else if (sliding && mayJump) - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1); - xJumpSpeed = -facing * 6.0f; - yJumpSpeed = -2.0f; - jumpTime = -6; - xa = xJumpSpeed; - ya = -jumpTime * yJumpSpeed; - onGround = false; - sliding = false; - facing = -facing; - } - else if (jumpTime > 0) - { - xa += xJumpSpeed; - ya = jumpTime * yJumpSpeed; - jumpTime--; - } - } - else - { - jumpTime = 0; - } - - if(world.mario.xa > 0){ - - if(direction != 1){ - direction = 1; - if(world.recorder != null){ -// world.recorder.switchRecord(); - world.recorder.startRightMoveRecord(); - } - } - - } - else if(world.mario.xa < 0){ - if(direction != -1){ - direction = -1; - if(world.recorder != null){ -// world.recorder.switchRecord(); - world.recorder.startLeftMoveRecord(); - } - } - - } - else{ - //was moving right - if(direction == 1 && world.recorder!= null){ - world.recorder.endRightMoveRecord(); - } - //was moving left - else if(direction == -1 && world.recorder!= null){ - world.recorder.endLeftMoveRecord(); - } - - direction = 0; - } - - if (keys[KEY_LEFT] && !ducking) - { - if (facing == 1) sliding = false; - xa -= sideWaysSpeed; - if (jumpTime >= 0) facing = -1; - } - - if (keys[KEY_RIGHT] && !ducking) - { - if (facing == -1) sliding = false; - xa += sideWaysSpeed; - if (jumpTime >= 0) facing = 1; - } - - if ((!keys[KEY_LEFT] && !keys[KEY_RIGHT]) || ducking || ya < 0 || onGround) - { - sliding = false; - } - - if (keys[KEY_SPEED] && canShoot && Mario.fire && world.fireballsOnScreen<2) - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_FIREBALL], this, 1, 1, 1); - world.addSprite(new Fireball(world, x+facing*6, y-20, facing)); - } - - canShoot = !keys[KEY_SPEED]; - - mayJump = (onGround || sliding) && !keys[KEY_JUMP]; - - xFlipPic = facing == -1; - - runTime += (Math.abs(xa)) + 5; - if (Math.abs(xa) < 0.5f) - { - runTime = 0; - xa = 0; - } - - calcPic(); - - if (sliding) - { - for (int i = 0; i < 1; i++) - { - world.addSprite(new Sparkle((int) (x + Math.random() * 4 - 2) + facing * 8, (int) (y + Math.random() * 4) - 24, (float) (Math.random() * 2 - 1), (float) Math.random() * 1, 0, 1, 5)); - } - ya *= 0.5f; - } - - onGround = false; - move(xa, 0); - move(0, ya); - - if (y > world.level.getHeight() * 16 + 16) - { - dieJump(); - } - - if (x < 0) - { - x = 0; - xa = 0; - } - -// if(x > world.level.xExit * 16 && ! world.level.flipped || x < world.level.xExit * 16 && world.level.flipped ) - if(x > world.level.getxExit() * 16 ) - - { - win(); - } - - if (x > world.level.getWidth() * 16) - { - x = world.level.getWidth() * 16; - xa = 0; - } - - ya *= 0.85f; - if (onGround) - { - xa *= GROUND_INERTIA; - } - else - { - xa *= AIR_INERTIA; - } - - if (!onGround) - { - ya += 3; - } - - if (carried != null) - { - carried.x = x + facing * 8; - carried.y = y - 2; - if (!keys[KEY_SPEED]) - { - carried.release(this); - carried = null; - - if(world.recorder != null){ - world.recorder.shellUnleashedRecord(); - } - } - } - } - - private void calcPic() - { - int runFrame = 0; - - if (large) - { - runFrame = ((int) (runTime / 20)) % 4; - if (runFrame == 3) runFrame = 1; - if (carried == null && Math.abs(xa) > 10) runFrame += 3; - if (carried != null) runFrame += 10; - if (!onGround) - { - if (carried != null) runFrame = 12; - else if (Math.abs(xa) > 10) runFrame = 7; - else runFrame = 6; - } - } - else - { - runFrame = ((int) (runTime / 20)) % 2; - if (carried == null && Math.abs(xa) > 10) runFrame += 2; - if (carried != null) runFrame += 8; - if (!onGround) - { - if (carried != null) runFrame = 9; - else if (Math.abs(xa) > 10) runFrame = 5; - else runFrame = 4; - } - } - - if (onGround && ((facing == -1 && xa > 0) || (facing == 1 && xa < 0))) - { - if (xa > 1 || xa < -1) runFrame = large ? 9 : 7; - - if (xa > 3 || xa < -3) - { - for (int i = 0; i < 3; i++) - { - world.addSprite(new Sparkle((int) (x + Math.random() * 8 - 4), (int) (y + Math.random() * 4), (float) (Math.random() * 2 - 1), (float) Math.random() * -1, 0, 1, 5)); - } - } - } - - if (large) - { - if (ducking) runFrame = 14; - height = ducking ? 12 : 24; - } - else - { - height = 12; - } - - xPic = runFrame; - } - - private boolean move(float xa, float ya) - { - - while (xa > 8) - { - if (!move(8, 0)) return false; - xa -= 8; - } - while (xa < -8) - { - if (!move(-8, 0)) return false; - xa += 8; - } - while (ya > 8) - { - if (!move(0, 8)) return false; - ya -= 8; - } - while (ya < -8) - { - if (!move(0, -8)) return false; - ya += 8; - } - - boolean collide = false; - if (ya > 0) - { - if (isBlocking(x + xa - width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa + width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa - width, y + ya + 1, xa, ya)) collide = true; - else if (isBlocking(x + xa + width, y + ya + 1, xa, ya)) collide = true; - } - if (ya < 0) - { - if (isBlocking(x + xa, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - } - if (xa > 0) - { - sliding = true; - if (isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - else sliding = false; - if (isBlocking(x + xa + width, y + ya - height / 2, xa, ya)) collide = true; - else sliding = false; - if (isBlocking(x + xa + width, y + ya, xa, ya)) collide = true; - else sliding = false; - } - if (xa < 0) - { - sliding = true; - if (isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - else sliding = false; - if (isBlocking(x + xa - width, y + ya - height / 2, xa, ya)) collide = true; - else sliding = false; - if (isBlocking(x + xa - width, y + ya, xa, ya)) collide = true; - else sliding = false; - } - - if (collide) - { - if (xa < 0) - { - x = (int) ((x - width) / 16) * 16 + width; - this.xa = 0; - } - if (xa > 0) - { - x = (int) ((x + width) / 16 + 1) * 16 - width - 1; - this.xa = 0; - } - if (ya < 0) - { - y = (int) ((y - height) / 16) * 16 + height; - jumpTime = 0; - this.ya = 0; - } - if (ya > 0) - { - y = (int) ((y - 1) / 16 + 1) * 16 - 1; - onGround = true; - } - return false; - } - else - { - x += xa; - y += ya; - return true; - } - } - - private boolean isBlocking(float _x, float _y, float xa, float ya) - { - //translate into block mode (since blocks are 16x16) - int x = (int) (_x / 16); - int y = (int) (_y / 16); - - if (x==(int)(this.x/16) && y==(int)(this.y/16)) - return false; - - boolean blocking = world.level.isBlocking(x, y, xa, ya); - - byte block = world.level.getBlock(x, y); - - if (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_PICKUPABLE) > 0) - { - if(world.recorder != null) - world.recorder.recordCoin(); - - Mario.getCoin(); - world.sound.play(Art.samples[Art.SAMPLE_GET_COIN], new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1); - world.level.setBlock(x, y, (byte) 0); - for (int xx = 0; xx < 2; xx++) - for (int yy = 0; yy < 2; yy++) - world.addSprite(new Sparkle(x * 16 + xx * 8 + (int) (Math.random() * 8), y * 16 + yy * 8 + (int) (Math.random() * 8), 0, 0, 0, 2, 5)); - } - - if (blocking && ya < 0) - { - world.bump(x, y, large); - } - - return blocking; - } - - public void stomp(Enemy enemy) - { - if (deathTime > 0 || world.paused) return; - - float targetY = enemy.y - enemy.height / 2; - move(0, targetY - y); - - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - xJumpSpeed = 0; - yJumpSpeed = -1.9f; - jumpTime = 8; - ya = jumpTime * yJumpSpeed; - onGround = false; - sliding = false; - invulnerableTime = 1; - - if(world.recorder!=null) - world.recorder.killStompRecord(enemy); - } - - public void stomp(Shell shell) - { - if (deathTime > 0 || world.paused) return; - - if (keys[KEY_SPEED] && shell.facing == 0) - { - carried = shell; - shell.carried = true; - } - else - { - float targetY = shell.y - shell.height / 2; - move(0, targetY - y); - - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - xJumpSpeed = 0; - yJumpSpeed = -1.9f; - jumpTime = 8; - ya = jumpTime * yJumpSpeed; - onGround = false; - sliding = false; - invulnerableTime = 1; - - if(shell.xa == 0 && world.recorder!= null){ - world.recorder.shellUnleashedRecord(); - } - } - } - - public void getHurt(Sprite sprite) - { - if (deathTime > 0 || world.paused) return; - if (invulnerableTime > 0) return; - - if (large) - { - world.paused = true; - powerUpTime = -3 * 6; - world.sound.play(Art.samples[Art.SAMPLE_MARIO_POWER_DOWN], this, 1, 1, 1); - if (fire) - { - world.mario.setLarge(true, false); - - if(world.recorder != null){ - world.recorder.endFireRecord(); - world.recorder.startLargeRecord(); - } - } - else - { - world.mario.setLarge(false, false); - - if(world.recorder != null){ - world.recorder.endLargeRecord(); - world.recorder.startLittleRecord(); - } - } - invulnerableTime = 32; - } - else - { - dieSprite(sprite); - } - } - - private void win() - { - xDeathPos = (int) x; - yDeathPos = (int) y; - world.paused = true; - winTime = 1; - Art.stopMusic(); - world.sound.play(Art.samples[Art.SAMPLE_LEVEL_EXIT], this, 1, 1, 1); - } - - public void dieSprite(Sprite sprite){ - die(); - - if(world.recorder != null){ - world.recorder.dieRecord(sprite); - } - } - - public void dieTime(){ - die(); - - if(world.recorder!=null){ - world.recorder.dieTimeRecord(); - } - } - - public void dieJump(){ - die(); - - if(world.recorder!=null){ - world.recorder.dieJumpRecord(); - } - } - - public void die() - { - xDeathPos = (int) x; - yDeathPos = (int) y; - world.paused = true; - deathTime = 1; - Art.stopMusic(); - world.sound.play(Art.samples[Art.SAMPLE_MARIO_DEATH], this, 1, 1, 1); - - if(world.recorder != null){ - - - if(running) - world.recorder.endRunningRecord(); - - if(large && !fire){ - world.recorder.endLargeRecord(); - } - - if(fire){ - world.recorder.endFireRecord(); - } - - if(!large && !fire) - world.recorder.endLittleRecord(); - - if(ducking) - world.recorder.endDuckRecord(); - - world.recorder.endTime(); - world.recorder.recordJumpLand(); - } - - large = false; - fire = false; - } - - - public void getFlower() - { - if (deathTime > 0 || world.paused) return; - - if (!fire) - { - world.paused = true; - powerUpTime = 3 * 6; - world.sound.play(Art.samples[Art.SAMPLE_MARIO_POWER_UP], this, 1, 1, 1); - world.mario.setLarge(true, true); - - if(world.recorder != null){ - if(large){ - world.recorder.endLargeRecord(); - - } - else{ - world.recorder.endLittleRecord(); - } - - world.recorder.startFireRecord(); - } - } - else - { - Mario.getCoin(); - world.sound.play(Art.samples[Art.SAMPLE_GET_COIN], this, 1, 1, 1); - } - } - - public void getMushroom() - { - if (deathTime > 0 || world.paused) return; - - if (!large) - { - world.paused = true; - powerUpTime = 3 * 6; - world.sound.play(Art.samples[Art.SAMPLE_MARIO_POWER_UP], this, 1, 1, 1); - world.mario.setLarge(true, false); - - if(world.recorder != null){ - world.recorder.endLittleRecord(); - world.recorder.startLargeRecord(); - } - } - else - { - - Mario.getCoin(); - world.sound.play(Art.samples[Art.SAMPLE_GET_COIN], this, 1, 1, 1); - } - } - - public void kick(Shell shell) - { - if (deathTime > 0 || world.paused) return; - - if (keys[KEY_SPEED]) - { - carried = shell; - shell.carried = true; - } - else - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - invulnerableTime = 1; - - if(world.recorder!=null) - world.recorder.shellUnleashedRecord(); - } - } - - public void stomp(BulletBill bill) - { - if (deathTime > 0 || world.paused) return; - - float targetY = bill.y - bill.height / 2; - move(0, targetY - y); - - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - xJumpSpeed = 0; - yJumpSpeed = -1.9f; - jumpTime = 8; - ya = jumpTime * yJumpSpeed; - onGround = false; - sliding = false; - invulnerableTime = 1; - - if(world.recorder!=null) - world.recorder.killStompRecord(bill); - } - - public byte getKeyMask() - { - int mask = 0; - for (int i = 0; i < 7; i++) - { - if (keys[i]) mask |= (1 << i); - } - return (byte) mask; - } - - public void setKeys(byte mask) - { - for (int i = 0; i < 7; i++) - { - keys[i] = (mask & (1 << i)) > 0; - } - } - - public static void get1Up() - { - instance.world.sound.play(Art.samples[Art.SAMPLE_MARIO_1UP], instance, 1, 1, 1); - lives++; - if (lives==99) - { - lives = 99; - } - } - - public static void getCoin() - { - coins++; - if (coins==100) - { - coins = 0; - get1Up(); - } - } -} diff --git a/src/dk/itu/mario/engine/sprites/Mushroom.java b/src/dk/itu/mario/engine/sprites/Mushroom.java deleted file mode 100644 index cdd44d8..0000000 --- a/src/dk/itu/mario/engine/sprites/Mushroom.java +++ /dev/null @@ -1,223 +0,0 @@ -package dk.itu.mario.engine.sprites; - - -import dk.itu.mario.engine.Art; -import dk.itu.mario.scene.LevelScene; - - - -public class Mushroom extends Sprite -{ - private static float GROUND_INERTIA = 0.89f; - private static float AIR_INERTIA = 0.89f; - - private float runTime; - private boolean onGround = false; - private boolean mayJump = false; - private int jumpTime = 0; - private float xJumpSpeed; - private float yJumpSpeed; - - private int width = 4; - int height = 24; - - private LevelScene world; - public int facing; - - public boolean avoidCliffs = false; - private int life; - - public Mushroom(LevelScene world, int x, int y) - { - sheet = Art.items; - - this.x = x; - this.y = y; - this.world = world; - xPicO = 8; - yPicO = 15; - - yPic = 0; - height = 12; - facing = 1; - wPic = hPic = 16; - life = 0; - } - - public void collideCheck() - { - float xMarioD = world.mario.x - x; - float yMarioD = world.mario.y - y; - float w = 16; - if (xMarioD > -16 && xMarioD < 16) - { - if (yMarioD > -height && yMarioD < world.mario.height) - { - world.mario.getMushroom(); - spriteContext.removeSprite(this); - } - } - } - - public void move() - { - if (life<9) - { - layer = 0; - y--; - life++; - return; - } - float sideWaysSpeed = 1.75f; - layer = 1; - // float sideWaysSpeed = onGround ? 2.5f : 1.2f; - - if (xa > 2) - { - facing = 1; - } - if (xa < -2) - { - facing = -1; - } - - xa = facing * sideWaysSpeed; - - mayJump = (onGround); - - xFlipPic = facing == -1; - - runTime += (Math.abs(xa)) + 5; - - - - if (!move(xa, 0)) facing = -facing; - onGround = false; - move(0, ya); - - ya *= 0.85f; - if (onGround) - { - xa *= GROUND_INERTIA; - } - else - { - xa *= AIR_INERTIA; - } - - if (!onGround) - { - ya += 2; - } - } - - private boolean move(float xa, float ya) - { - while (xa > 8) - { - if (!move(8, 0)) return false; - xa -= 8; - } - while (xa < -8) - { - if (!move(-8, 0)) return false; - xa += 8; - } - while (ya > 8) - { - if (!move(0, 8)) return false; - ya -= 8; - } - while (ya < -8) - { - if (!move(0, -8)) return false; - ya += 8; - } - - boolean collide = false; - if (ya > 0) - { - if (isBlocking(x + xa - width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa + width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa - width, y + ya + 1, xa, ya)) collide = true; - else if (isBlocking(x + xa + width, y + ya + 1, xa, ya)) collide = true; - } - if (ya < 0) - { - if (isBlocking(x + xa, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - } - if (xa > 0) - { - if (isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa + width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - if (xa < 0) - { - if (isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa - width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - - if (collide) - { - if (xa < 0) - { - x = (int) ((x - width) / 16) * 16 + width; - this.xa = 0; - } - if (xa > 0) - { - x = (int) ((x + width) / 16 + 1) * 16 - width - 1; - this.xa = 0; - } - if (ya < 0) - { - y = (int) ((y - height) / 16) * 16 + height; - jumpTime = 0; - this.ya = 0; - } - if (ya > 0) - { - y = (int) (y / 16 + 1) * 16 - 1; - onGround = true; - } - return false; - } - else - { - x += xa; - y += ya; - return true; - } - } - - private boolean isBlocking(float _x, float _y, float xa, float ya) - { - int x = (int) (_x / 16); - int y = (int) (_y / 16); - if (x == (int) (this.x / 16) && y == (int) (this.y / 16)) return false; - - boolean blocking = world.level.isBlocking(x, y, xa, ya); - - byte block = world.level.getBlock(x, y); - - return blocking; - } - - public void bumpCheck(int xTile, int yTile) - { - if (x + width > xTile * 16 && x - width < xTile * 16 + 16 && yTile==(int)((y-1)/16)) - { - facing = -world.mario.facing; - ya = -10; - } - } - -} diff --git a/src/dk/itu/mario/engine/sprites/Particle.java b/src/dk/itu/mario/engine/sprites/Particle.java deleted file mode 100644 index 60a6ad2..0000000 --- a/src/dk/itu/mario/engine/sprites/Particle.java +++ /dev/null @@ -1,40 +0,0 @@ -package dk.itu.mario.engine.sprites; - -import dk.itu.mario.engine.Art; - - -public class Particle extends Sprite -{ - public int life; - - public Particle(int x, int y, float xa, float ya) - { - this(x, y, xa, ya, (int)(Math.random()*2), 0); - } - - public Particle(int x, int y, float xa, float ya, int xPic, int yPic) - { - sheet = Art.particles; - this.x = x; - this.y = y; - this.xa = xa; - this.ya = ya; - this.xPic = xPic; - this.yPic = yPic; - this.xPicO = 4; - this.yPicO = 4; - - wPic = 8; - hPic = 8; - life = 10; - } - - public void move() - { - if (life--<0) Sprite.spriteContext.removeSprite(this); - x+=xa; - y+=ya; - ya*=0.95f; - ya+=3; - } -} diff --git a/src/dk/itu/mario/engine/sprites/Shell.java b/src/dk/itu/mario/engine/sprites/Shell.java deleted file mode 100644 index fea02b4..0000000 --- a/src/dk/itu/mario/engine/sprites/Shell.java +++ /dev/null @@ -1,370 +0,0 @@ -package dk.itu.mario.engine.sprites; - - -import dk.itu.mario.engine.Art; -import dk.itu.mario.scene.LevelScene; - - - - -public class Shell extends Sprite -{ - private static float GROUND_INERTIA = 0.89f; - private static float AIR_INERTIA = 0.89f; - - private float runTime; - private boolean onGround = false; - - private int width = 4; - int height = 24; - - private LevelScene world; - public int facing; - - public boolean avoidCliffs = false; - public int anim; - - public boolean dead = false; - private int deadTime = 0; - public boolean carried; - - - public Shell(LevelScene world, float x, float y, int type) - { - sheet = Art.enemies; - - this.x = x; - this.y = y; - this.world = world; - xPicO = 8; - yPicO = 31; - - yPic = type; - height = 12; - facing = 0; - wPic = 16; - - xPic = 4; - ya = -5; - } - - public boolean fireballCollideCheck(Fireball fireball) - { - if (deadTime != 0) return false; - - float xD = fireball.x - x; - float yD = fireball.y - y; - - if (xD > -16 && xD < 16) - { - if (yD > -height && yD < fireball.height) - { - if (facing!=0) return true; - - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - - xa = fireball.facing * 2; - ya = -5; - if (spriteTemplate != null) spriteTemplate.isDead = true; - deadTime = 100; - hPic = -hPic; - yPicO = -yPicO + 16; - return true; - } - } - return false; - } - - public void collideCheck() - { - if (carried || dead || deadTime>0) return; - - float xMarioD = world.mario.x - x; - float yMarioD = world.mario.y - y; - float w = 16; - if (xMarioD > -16 && xMarioD < 16) - { - if (yMarioD > -height && yMarioD < world.mario.height) - { - if (world.mario.ya > 0 && yMarioD <= 0 && (!world.mario.onGround || !world.mario.wasOnGround)) - { - world.mario.stomp(this); - if (facing != 0) - { - xa = 0; - facing = 0; - } - else - { - facing = world.mario.facing; - } - } - else - { - if (facing != 0) - { - world.mario.getHurt(this); - } - else - { - world.mario.kick(this); - facing = world.mario.facing; - } - } - } - } - } - - public void move() - { - if (y > world.level.getHeight() * 16 + 16 && deadTime == 0) - { - die(); - spriteContext.removeSprite(this); - return; - } - - if (carried) - { - world.checkShellCollide(this); - return; - } - - if (deadTime > 0) - { - deadTime--; - - if (deadTime == 0) - { - deadTime = 1; - for (int i = 0; i < 8; i++) - { - world.addSprite(new Sparkle((int) (x + Math.random() * 16 - 8) + 4, (int) (y - Math.random() * 8) + 4, (float) (Math.random() * 2 - 1), (float) Math.random() * -1, 0, 1, 5)); - } - spriteContext.removeSprite(this); - } - - x += xa; - y += ya; - ya *= 0.95; - ya += 1; - - return; - } - - if (facing != 0) anim++; - - float sideWaysSpeed = 11f; - // float sideWaysSpeed = onGround ? 2.5f : 1.2f; - - if (xa > 2) - { - facing = 1; - } - if (xa < -2) - { - facing = -1; - } - - xa = facing * sideWaysSpeed; - - if (facing != 0) - { - world.checkShellCollide(this); - } - - xFlipPic = facing == -1; - - runTime += (Math.abs(xa)) + 5; - - xPic = (anim / 2) % 4 + 3; - - - - if (!move(xa, 0)) - { - world.sound.play(Art.samples[Art.SAMPLE_SHELL_BUMP], this, 1, 1, 1); - - facing = -facing; - } - onGround = false; - move(0, ya); - - ya *= 0.85f; - if (onGround) - { - xa *= GROUND_INERTIA; - } - else - { - xa *= AIR_INERTIA; - } - - if (!onGround) - { - ya += 2; - } - } - - private boolean move(float xa, float ya) - { - while (xa > 8) - { - if (!move(8, 0)) return false; - xa -= 8; - } - while (xa < -8) - { - if (!move(-8, 0)) return false; - xa += 8; - } - while (ya > 8) - { - if (!move(0, 8)) return false; - ya -= 8; - } - while (ya < -8) - { - if (!move(0, -8)) return false; - ya += 8; - } - - boolean collide = false; - if (ya > 0) - { - if (isBlocking(x + xa - width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa + width, y + ya, xa, 0)) collide = true; - else if (isBlocking(x + xa - width, y + ya + 1, xa, ya)) collide = true; - else if (isBlocking(x + xa + width, y + ya + 1, xa, ya)) collide = true; - } - if (ya < 0) - { - if (isBlocking(x + xa, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - else if (collide || isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - } - if (xa > 0) - { - if (isBlocking(x + xa + width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa + width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa + width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - if (xa < 0) - { - if (isBlocking(x + xa - width, y + ya - height, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya - height / 2, xa, ya)) collide = true; - if (isBlocking(x + xa - width, y + ya, xa, ya)) collide = true; - - if (avoidCliffs && onGround && !world.level.isBlocking((int) ((x + xa - width) / 16), (int) ((y) / 16 + 1), xa, 1)) collide = true; - } - - if (collide) - { - if (xa < 0) - { - x = (int) ((x - width) / 16) * 16 + width; - this.xa = 0; - } - if (xa > 0) - { - x = (int) ((x + width) / 16 + 1) * 16 - width - 1; - this.xa = 0; - } - if (ya < 0) - { - y = (int) ((y - height) / 16) * 16 + height; - this.ya = 0; - } - if (ya > 0) - { - y = (int) (y / 16 + 1) * 16 - 1; - onGround = true; - } - return false; - } - else - { - x += xa; - y += ya; - return true; - } - } - - private boolean isBlocking(float _x, float _y, float xa, float ya) - { - int x = (int) (_x / 16); - int y = (int) (_y / 16); - if (x == (int) (this.x / 16) && y == (int) (this.y / 16)) return false; - - boolean blocking = world.level.isBlocking(x, y, xa, ya); - - byte block = world.level.getBlock(x, y); - - if (blocking && ya == 0 && xa!=0) - { - world.bump(x, y, true); - } - - return blocking; - } - - public void bumpCheck(int xTile, int yTile) - { - if (x + width > xTile * 16 && x - width < xTile * 16 + 16 && yTile == (int) ((y - 1) / 16)) - { - facing = -world.mario.facing; - ya = -10; - } - } - - public void die() - { - dead = true; - - carried = false; - - xa = -facing * 2; - ya = -5; - deadTime = 100; - - if(world.recorder != null) - world.recorder.killRecord(this); - } - - public boolean shellCollideCheck(Shell shell) - { - if (deadTime != 0) return false; - - float xD = shell.x - x; - float yD = shell.y - y; - - if (xD > -16 && xD < 16) - { - if (yD > -height && yD < shell.height) - { - world.sound.play(Art.samples[Art.SAMPLE_MARIO_KICK], this, 1, 1, 1); - - if (world.mario.carried == shell || world.mario.carried == this) - { - world.mario.carried = null; - } - - die(); - shell.die(); - - return true; - } - } - return false; - } - - - public void release(Mario mario) - { - carried = false; - facing = mario.facing; - x += facing * 8; - } -} diff --git a/src/dk/itu/mario/engine/sprites/Sparkle.java b/src/dk/itu/mario/engine/sprites/Sparkle.java deleted file mode 100644 index 3a06850..0000000 --- a/src/dk/itu/mario/engine/sprites/Sparkle.java +++ /dev/null @@ -1,46 +0,0 @@ -package dk.itu.mario.engine.sprites; - -import dk.itu.mario.engine.Art; - - -public class Sparkle extends Sprite -{ - public int life; - public int xPicStart; - - public Sparkle(int x, int y, float xa, float ya) - { - this(x, y, xa, ya, (int)(Math.random()*2), 0, 5); - } - - public Sparkle(int x, int y, float xa, float ya, int xPic, int yPic, int timeSpan) - { - sheet = Art.particles; - this.x = x; - this.y = y; - this.xa = xa; - this.ya = ya; - this.xPic = xPic; - xPicStart = xPic; - this.yPic = yPic; - this.xPicO = 4; - this.yPicO = 4; - - wPic = 8; - hPic = 8; - life = 10+(int)(Math.random()*timeSpan); - } - - public void move() - { - if (life>10) - xPic = 7; - else - xPic = xPicStart+(10-life)*4/10; - - if (life--<0) Sprite.spriteContext.removeSprite(this); - - x+=xa; - y+=ya; - } -} diff --git a/src/dk/itu/mario/engine/sprites/Sprite.java b/src/dk/itu/mario/engine/sprites/Sprite.java deleted file mode 100644 index 0ebed58..0000000 --- a/src/dk/itu/mario/engine/sprites/Sprite.java +++ /dev/null @@ -1,117 +0,0 @@ -package dk.itu.mario.engine.sprites; - -import java.awt.Graphics; -import java.awt.Image; - - - - - -import dk.itu.mario.engine.sonar.SoundSource; - -public class Sprite implements SoundSource -{ - public static SpriteContext spriteContext; - - public float xOld, yOld, x, y, xa, ya; - - public int xPic, yPic; - public int wPic = 32; - public int hPic = 32; - public int xPicO, yPicO; - public boolean xFlipPic = false; - public boolean yFlipPic = false; - public Image[][] sheet; - public boolean visible = true; - - public int layer = 1; - - public SpriteTemplate spriteTemplate; - - public void move() - { - x+=xa; - y+=ya; - } - - public void render(Graphics og, float alpha) - { - if (!visible) return; - - int xPixel = (int)(xOld+(x-xOld)*alpha)-xPicO; - int yPixel = (int)(yOld+(y-yOld)*alpha)-yPicO; - - og.drawImage(sheet[xPic][yPic], xPixel+(xFlipPic?wPic:0), yPixel+(yFlipPic?hPic:0), xFlipPic?-wPic:wPic, yFlipPic?-hPic:hPic, null); - } - -/* private void blit(Graphics og, Image bitmap, int x0, int y0, int x1, int y1, int w, int h) - { - if (!xFlipPic) - { - if (!yFlipPic) - { - og.drawImage(bitmap, x0, y0, x0+w, y0+h, x1, y1, x1+w, y1+h, null); - } - else - { - og.drawImage(bitmap, x0, y0, x0+w, y0+h, x1, y1+h, x1+w, y1, null); - } - } - else - { - if (!yFlipPic) - { - og.drawImage(bitmap, x0, y0, x0+w, y0+h, x1+w, y1, x1, y1+h, null); - } - else - { - og.drawImage(bitmap, x0, y0, x0+w, y0+h, x1+w, y1+h, x1, y1, null); - } - } - }*/ - - public final void tick() - { - xOld = x; - yOld = y; - move(); - } - - public final void tickNoMove() - { - xOld = x; - yOld = y; - } - - public float getX(float alpha) - { - return (xOld+(x-xOld)*alpha)-xPicO; - } - - public float getY(float alpha) - { - return (yOld+(y-yOld)*alpha)-yPicO; - } - - public void collideCheck() - { - } - - public void bumpCheck(int xTile, int yTile) - { - } - - public boolean shellCollideCheck(Shell shell) - { - return false; - } - - public void release(Mario mario) - { - } - - public boolean fireballCollideCheck(Fireball fireball) - { - return false; - } -} diff --git a/src/dk/itu/mario/engine/sprites/SpriteContext.java b/src/dk/itu/mario/engine/sprites/SpriteContext.java deleted file mode 100644 index 5246861..0000000 --- a/src/dk/itu/mario/engine/sprites/SpriteContext.java +++ /dev/null @@ -1,18 +0,0 @@ -package dk.itu.mario.engine.sprites; - -/** - *

Title:

- * - *

Description:

- * - *

Copyright: Copyright (c) 2010

- * - *

Company:

- * - * @author not attributable - * @version 1.0 - */ -public interface SpriteContext { - public void addSprite(Sprite sprite); - public void removeSprite(Sprite sprite); -} diff --git a/src/dk/itu/mario/engine/sprites/SpriteTemplate.java b/src/dk/itu/mario/engine/sprites/SpriteTemplate.java deleted file mode 100644 index 931c392..0000000 --- a/src/dk/itu/mario/engine/sprites/SpriteTemplate.java +++ /dev/null @@ -1,60 +0,0 @@ -package dk.itu.mario.engine.sprites; - -import dk.itu.mario.scene.LevelScene; - -public class SpriteTemplate -{ - public static final int RED_TURTLE = 0; - public static final int GREEN_TURTLE = 1; - public static final int GOOMPA = 2; - public static final int ARMORED_TURTLE = 3; - public static final int JUMP_FLOWER = 4; - public static final int CANNON_BALL = 5; - public static final int CHOMP_FLOWER = 6; - - public static int enemiesSpawned = 0; - public static int enemiesMax = 1000; - - public boolean hasSpawned = false; - - public int lastVisibleTick = -1; - public Sprite sprite; - public boolean isDead = false; - private boolean winged; - - public int type; - public int direction = 1; - - public SpriteTemplate(int type, boolean winged) - { - this.type = type; - this.winged = winged; - } - - public void spawn(LevelScene world, int x, int y, int dir) - { - if (isDead || enemiesSpawned >= enemiesMax) return; - - if (type==Enemy.ENEMY_FLOWER) - { - sprite = new FlowerEnemy(world, x*16+15, y*16+24); - } - else - { - sprite = new Enemy(world, x*16+8, y*16+15, dir, type, winged); - } - - //correct for flipping - if(direction == -1){ - sprite.x -= 14; - } - - sprite.spriteTemplate = this; - world.addSprite(sprite); - - if(!hasSpawned) - enemiesSpawned++; - - hasSpawned = true; - } -} diff --git a/src/dk/itu/mario/engine/util/.DS_Store b/src/dk/itu/mario/engine/util/.DS_Store deleted file mode 100644 index b29de3e..0000000 Binary files a/src/dk/itu/mario/engine/util/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/engine/util/FileHandler.java b/src/dk/itu/mario/engine/util/FileHandler.java deleted file mode 100644 index 3a99b60..0000000 --- a/src/dk/itu/mario/engine/util/FileHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package dk.itu.mario.engine.util; - -import java.io.BufferedReader; -import java.io.FileReader; - -public class FileHandler { - - public static String readFile(String fileName) { - String info = ""; - try { - FileReader input = new FileReader(fileName); - BufferedReader bufRead = new BufferedReader(input); - - String line; - - line = bufRead.readLine(); - info = line + "\n"; - - while (line != null) { - line = bufRead.readLine(); - info += line + "\n"; - } - - bufRead.close(); - - } catch (Exception e) { - System.out.println("Unable to read from file: " + fileName +", returning empty String."); - } - return info; - } -} diff --git a/src/dk/itu/mario/engine/util/UIItem.java b/src/dk/itu/mario/engine/util/UIItem.java deleted file mode 100644 index c8aac1d..0000000 --- a/src/dk/itu/mario/engine/util/UIItem.java +++ /dev/null @@ -1,22 +0,0 @@ -package dk.itu.mario.engine.util; - -import java.awt.Graphics; - -public abstract class UIItem{ - - protected int x,y; - protected boolean selected; - protected int width,height; - - public abstract void render(Graphics g); - public abstract void prev(); - public abstract void next(); - - public void setSelected(){ - selected = true; - } - - public void setUnselected(){ - selected = false; - } -} diff --git a/src/dk/itu/mario/engine/util/UITextArea.java b/src/dk/itu/mario/engine/util/UITextArea.java deleted file mode 100644 index 8154abe..0000000 --- a/src/dk/itu/mario/engine/util/UITextArea.java +++ /dev/null @@ -1,83 +0,0 @@ -package dk.itu.mario.engine.util; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; - -public class UITextArea extends UIItem{ - - protected String text; - protected int width, height; - protected Font font; - protected ArrayList lines = new ArrayList(); - - public static boolean showBox = false; - - public UITextArea(String text, Font font, int x, int y, int width){ - this.text = text; - this.font = font; - this.x = x; - this.y = y; - this.width = width; - } - - public void next() { - } - - public void prev() { - } - - public void render(Graphics g) { - Graphics2D g2 = (Graphics2D)g; - - g.setFont(font); - - lines.clear(); - - Rectangle2D rec = font.getStringBounds(text,g2.getFontRenderContext()); - - String tempText = new String(); - - if(rec.getWidth()>width){ - for(int i=0;i=width){ - lines.add(tempText); - tempText = new String(); - } - } - - lines.add(tempText); - } - else{ - lines.add(text); - } - - for(int j=0;j h1 ? 1 : 0; - if (h0 == oh) - s = 1 - s; - s += distant ? 2 : 0; - level.setBlock(x, y, (byte) (s + 8)); - } - } - } - break; - } - case LevelInterface.TYPE_UNDERGROUND: { - if (distant) { - int tt = 0; - for (int x = 0; x < width; x++) { - if (random.nextDouble() < 0.75) - tt = 1 - tt; - for (int y = 0; y < height; y++) { - int t = tt; - int yy = y - 2; - if (yy < 0 || yy > 4) { - yy = 2; - t = 0; - } - level.setBlock(x, y, (byte) (4 + t + (3 + yy) * 8)); - } - } - } else { - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int t = x % 2; - int yy = y - 1; - if (yy < 0 || yy > 7) { - yy = 7; - t = 0; - } - if (t == 0 && yy > 1 && yy < 5) { - t = -1; - yy = 0; - } - level.setBlock(x, y, (byte) (6 + t + (yy) * 8)); - } - } - } - break; - } - case LevelInterface.TYPE_CASTLE: { - if (distant) { - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int t = x % 2; - int yy = y - 1; - if (yy > 2 && yy < 5) { - yy = 2; - } else if (yy >= 5) { - yy -= 2; - } - if (yy < 0) { - t = 0; - yy = 5; - } else if (yy > 4) { - t = 1; - yy = 5; - } else if (t < 1 && yy == 3) { - t = 0; - yy = 3; - } else if (t < 1 && yy > 0 && yy < 3) { - t = 0; - yy = 2; - } - level.setBlock(x, y, (byte) (1 + t + (yy + 4) * 8)); - } - } - } else { - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int t = x % 3; - int yy = y - 1; - if (yy > 2 && yy < 5) { - yy = 2; - } else if (yy >= 5) { - yy -= 2; - } - if (yy < 0) { - t = 1; - yy = 5; - } else if (yy > 4) { - t = 2; - yy = 5; - } else if (t < 2 && yy == 4) { - t = 2; - yy = 4; - } else if (t < 2 && yy > 0 && yy < 4) { - t = 4; - yy = -3; - } - level.setBlock(x, y, (byte) (1 + t + (yy + 3) * 8)); - } - } - } - break; - } - } - return level; - } -} diff --git a/src/dk/itu/mario/level/CustomizedLevel.java b/src/dk/itu/mario/level/CustomizedLevel.java deleted file mode 100644 index 19f0aa3..0000000 --- a/src/dk/itu/mario/level/CustomizedLevel.java +++ /dev/null @@ -1,574 +0,0 @@ -package dk.itu.mario.level; - -import java.util.Random; - -import dk.itu.mario.MarioInterface.Constraints; -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.engine.sprites.Enemy; -import dk.itu.mario.engine.sprites.SpriteTemplate; - -public class CustomizedLevel extends Level implements LevelInterface { - private static final int ODDS_STRAIGHT = 0; - private static final int ODDS_HILL_STRAIGHT = 1; - private static final int ODDS_TUBES = 2; - private static final int ODDS_JUMP = 3; - private static final int ODDS_CANNONS = 4; - private static final int JumpingThreshold = 3; - - private DataRecorder dataRecorder; - private GamePlay playerM; - private int[] odds = new int[5]; - private int totalOdds; - private int difficulty; - private int type; - private int gaps; - private int turtles; - private int coins; - private Random random; - - public CustomizedLevel(int width, int height, long seed, int difficulty, - int type, GamePlay playerMetrics, DataRecorder dataRecorder) { - super(width, height); - System.out.println("Generating level based on previous GamePlay AND DataRecorder metrics."); - this.dataRecorder = dataRecorder; - this.playerM = playerMetrics; - create(seed, difficulty, type); - } - - public CustomizedLevel(int width, int height, long seed, int difficulty, - int type, GamePlay playerMetrics) { - super(width, height); - System.out.println("Generating level based on previous GamePlay metrics ONLY."); - this.playerM = playerMetrics; - create(seed, difficulty, type); - } - - public void create(long seed, int difficulty, int type) { - if (dataRecorder == DataRecorder.BLANK_RECORD) { - System.out.println("DataRecorder record is BLANK - using GamePlay metrics only."); - } - this.type = type; - this.difficulty = difficulty; - odds[ODDS_STRAIGHT] = 30; - odds[ODDS_HILL_STRAIGHT] = 20; - odds[ODDS_TUBES] = 2 + 2 * difficulty; - int jumpDifficulty = 1; - // adapt the game so that it has a number of gaps proportional to the - // number of jumps the player made in the test level. The more the - // jumps, - // the more the gaps. - if (playerM.jumpsNumber > JumpingThreshold) - jumpDifficulty = 2; - odds[ODDS_JUMP] = jumpDifficulty; - odds[ODDS_CANNONS] = -10 + 5 * difficulty; - - if (type != LevelInterface.TYPE_OVERGROUND) { - odds[ODDS_HILL_STRAIGHT] = 0; - } - - for (int i = 0; i < odds.length; i++) { - // failsafe (no negative odds) - if (odds[i] < 0) { - odds[i] = 0; - } - - totalOdds += odds[i]; - odds[i] = totalOdds - odds[i]; - } - - random = new Random(seed); - - // create the start location - int length = 0; - length += buildStraight(0, getWidth(), true); - - // create all of the medium sections - while (length < getWidth() - 64) { - length += buildZone(length, getWidth() - length); - } - - // set the end piece - int floor = height - 1 - random.nextInt(4); - - // create the exit - xExit = length + 8; - yExit = floor; - - for (int x = length; x < getWidth(); x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, Level.GROUND); - } - } - } - - if (type == LevelInterface.TYPE_CASTLE - || type == LevelInterface.TYPE_UNDERGROUND) { - int ceiling = 0; - int run = 0; - for (int x = 0; x < width; x++) { - if (run-- <= 0 && x > 4) { - ceiling = random.nextInt(4); - run = random.nextInt(4) + 4; - } - for (int y = 0; y < height; y++) { - if ((x > 4 && y <= ceiling) || x < 1) { - setBlock(x, y, GROUND); - } - } - } - } - - fixWalls(); - - } - - private int buildZone(int x, int maxLength) { - int t = random.nextInt(totalOdds); - int type = 0; - - for (int i = 0; i < odds.length; i++) { - if (odds[ODDS_JUMP] <= t * 2 + 30) { - type = ODDS_JUMP; - break; - } - if (odds[i] <= t) { - type = i; - } - } - - switch (type) { - case ODDS_STRAIGHT: - return buildStraight(x, maxLength, false); - case ODDS_HILL_STRAIGHT: - return buildHillStraight(x, maxLength); - case ODDS_TUBES: - return buildTubes(x, maxLength); - case ODDS_JUMP: - if (gaps < Constraints.gaps) - return buildJump(x, maxLength); - else - return buildStraight(x, maxLength, false); - case ODDS_CANNONS: - return buildCannons(x, maxLength); - } - return 0; - } - - private int buildJump(int xo, int maxLength) { - gaps++; - // jl: jump length - // js: the number of blocks that are available at either side for free - int js = random.nextInt(4) + 2; - int jl = random.nextInt(2) + 2; - int length = js * 2 + jl; - - boolean hasStairs = random.nextInt(3) == 0; - - int floor = height - 1 - random.nextInt(4); - // run for the from the start x position, for the whole length - for (int x = xo; x < xo + length; x++) { - if (x < xo + js || x > xo + length - js - 1) { - // run for all y's since we need to paint blocks upward - for (int y = 0; y < height; y++) { // paint ground up until the - // floor - if (y >= floor) { - setBlock(x, y, GROUND); - } - // if it is above ground, start making stairs of rocks - else if (hasStairs) { // LEFT SIDE - if (x < xo + js) { // we need to max it out and level - // because it wont - // paint ground correctly unless two bricks are side - // by side - if (y >= floor - (x - xo) + 1) { - setBlock(x, y, ROCK); - } - } else { // RIGHT SIDE - if (y >= floor - ((xo + length) - x) + 2) { - setBlock(x, y, ROCK); - } - } - } - } - } - } - - return length; - } - - private int buildCannons(int xo, int maxLength) { - int length = random.nextInt(10) + 2; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - int xCannon = xo + 1 + random.nextInt(4); - for (int x = xo; x < xo + length; x++) { - if (x > xCannon) { - xCannon += 2 + random.nextInt(4); - } - if (xCannon == xo + length - 1) - xCannon += 10; - int cannonHeight = floor - random.nextInt(4) - 1; - - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, (byte) (1 + 9 * 16)); - } else { - if (x == xCannon && y >= cannonHeight) { - if (y == cannonHeight) { - setBlock(x, y, (byte) (14 + 0 * 16)); - } else if (y == cannonHeight + 1) { - setBlock(x, y, (byte) (14 + 1 * 16)); - } else { - setBlock(x, y, (byte) (14 + 2 * 16)); - } - } - } - } - } - - return length; - } - - private int buildHillStraight(int xo, int maxLength) { - int length = random.nextInt(10) + 10; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - for (int x = xo; x < xo + length; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, Level.GROUND); - } - } - } - - addEnemyLine(xo + 1, xo + length - 1, floor - 1); - - int h = floor; - - boolean keepGoing = true; - - boolean[] occupied = new boolean[length]; - while (keepGoing) { - h = h - 2 - random.nextInt(3); - - if (h <= 0) { - keepGoing = false; - } else { - int l = random.nextInt(5) + 3; - int xxo = random.nextInt(length - l - 2) + xo + 1; - - if (occupied[xxo - xo] || occupied[xxo - xo + l] - || occupied[xxo - xo - 1] || occupied[xxo - xo + l + 1]) { - keepGoing = false; - } else { - occupied[xxo - xo] = true; - occupied[xxo - xo + l] = true; - addEnemyLine(xxo, xxo + l, h - 1); - if (random.nextInt(4) == 0) { - decorate(xxo - 1, xxo + l + 1, h); - keepGoing = false; - } - for (int x = xxo; x < xxo + l; x++) { - for (int y = h; y < floor; y++) { - int xx = 5; - if (x == xxo) - xx = 4; - if (x == xxo + l - 1) - xx = 6; - int yy = 9; - if (y == h) - yy = 8; - - if (getBlock(x, y) == 0) { - setBlock(x, y, (byte) (xx + yy * 16)); - } else { - if (getBlock(x, y) == Level.HILL_TOP_LEFT) - setBlock(x, y, Level.HILL_TOP_LEFT_IN); - if (getBlock(x, y) == Level.HILL_TOP_RIGHT) - setBlock(x, y, Level.HILL_TOP_RIGHT_IN); - } - } - } - } - } - } - - return length; - } - - private void addEnemyLine(int x0, int x1, int y) { - for (int x = x0; x < x1; x++) { - if (random.nextInt(50) < 25) { - int type = random.nextInt(4); - - type = random.nextInt(3); - if (turtles < Constraints.turtels) { - if (type == Enemy.ENEMY_GREEN_KOOPA - || type == Enemy.ENEMY_RED_KOOPA) { - turtles++; - setSpriteTemplate(x, y, - new SpriteTemplate(type, - random.nextInt(35) < difficulty)); - } else { - setSpriteTemplate(x, y, - new SpriteTemplate(type, - random.nextInt(35) < difficulty)); - } - } else { - setSpriteTemplate( - x, - y, - new SpriteTemplate(Enemy.ENEMY_GOOMBA, random - .nextInt(35) < difficulty)); - } - } - } - } - - private int buildTubes(int xo, int maxLength) { - int length = random.nextInt(10) + 5; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - int xTube = xo + 1 + random.nextInt(4); - int tubeHeight = floor - random.nextInt(2) - 2; - for (int x = xo; x < xo + length; x++) { - if (x > xTube + 1) { - xTube += 3 + random.nextInt(4); - tubeHeight = floor - random.nextInt(2) - 2; - } - if (xTube >= xo + length - 2) - xTube += 10; - - if (x == xTube && random.nextInt(11) < difficulty + 1) { - setSpriteTemplate(x, tubeHeight, new SpriteTemplate( - Enemy.ENEMY_FLOWER, false)); - } - - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, (byte) (1 + 9 * 16)); - - } else { - if ((x == xTube || x == xTube + 1) && y >= tubeHeight) { - int xPic = 10 + x - xTube; - - if (y == tubeHeight) { - // tube top - setBlock(x, y, (byte) (xPic + 0 * 16)); - } else { - // tube side - setBlock(x, y, (byte) (xPic + 1 * 16)); - } - } - } - } - } - - return length; - } - - private int buildStraight(int xo, int maxLength, boolean safe) { - int length = random.nextInt(10) + 2; - - if (safe) - length = 10 + random.nextInt(5); - - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - - // runs from the specified x position to the length of the segment - for (int x = xo; x < xo + length; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, Level.GROUND); - } - } - } - - if (!safe) { - if (length > 5) { - decorate(xo, xo + length, floor); - } - } - - return length; - } - - private void decorate(int xStart, int xLength, int floor) { - // if its at the very top, just return - if (floor < 1) - return; - boolean rocks = true; - - // add an enemy line above the box - addEnemyLine(xStart + 1, xLength - 1, floor - 1); - - int s = random.nextInt(4); - int e = random.nextInt(4); - - if (floor - 2 > 0) { - if ((xLength - 1 - e) - (xStart + 1 + s) > 1) { - for (int x = xStart + 1 + s; x < xLength - 1 - e; x++) { - setBlock(x, floor - 2, (byte) (2 + 2 * 16)); - } - } - } - - s = random.nextInt(4); - e = random.nextInt(4); - - if (floor - 4 > 0) { - if ((xLength - 1 - e) - (xStart + 1 + s) > 2) { - for (int x = xStart + 1 + s; x < xLength - 1 - e; x++) { - if (rocks) { - if (x != xStart + 1 && x != xLength - 2 - && random.nextInt(2) == 0) { - if (random.nextInt(2) == 0) { - setBlock(x, floor - 4, BLOCK_POWERUP); - } else { - if (coins < Constraints.coinBlocks) { - coins++; - setBlock(x, floor - 4, BLOCK_COIN); - } else { - setBlock(x, floor - 4, BLOCK_EMPTY); - } - } - } else if (random.nextInt(4) == 0) { - if (random.nextInt(4) == 0) { - setBlock(x, floor - 4, (byte) (2 + 1 * 16)); - } else { - setBlock(x, floor - 4, (byte) (1 + 1 * 16)); - } - } else { - setBlock(x, floor - 4, BLOCK_EMPTY); - } - } - } - } - } - } - - private void fixWalls() { - boolean[][] blockMap = new boolean[width + 1][height + 1]; - - for (int x = 0; x < width + 1; x++) { - for (int y = 0; y < height + 1; y++) { - int blocks = 0; - for (int xx = x - 1; xx < x + 1; xx++) { - for (int yy = y - 1; yy < y + 1; yy++) { - if (getBlockCapped(xx, yy) == GROUND) { - blocks++; - } - } - } - blockMap[x][y] = blocks == 4; - } - } - blockify(this, blockMap, width + 1, height + 1); - } - - private void blockify(Level level, boolean[][] blocks, int width, int height) { - int to = 0; - if (type == LevelInterface.TYPE_CASTLE) { - to = 4 * 2; - } else if (type == LevelInterface.TYPE_UNDERGROUND) { - to = 4 * 3; - } - - boolean[][] b = new boolean[2][2]; - - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - for (int xx = x; xx <= x + 1; xx++) { - for (int yy = y; yy <= y + 1; yy++) { - int _xx = xx; - int _yy = yy; - if (_xx < 0) - _xx = 0; - if (_yy < 0) - _yy = 0; - if (_xx > width - 1) - _xx = width - 1; - if (_yy > height - 1) - _yy = height - 1; - b[xx - x][yy - y] = blocks[_xx][_yy]; - } - } - - if (b[0][0] == b[1][0] && b[0][1] == b[1][1]) { - if (b[0][0] == b[0][1]) { - if (b[0][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else { - // KEEP OLD BLOCK! - } - } else { - if (b[0][0]) { - // down grass top? - level.setBlock(x, y, (byte) (1 + 10 * 16 + to)); - } else { - // up grass top - level.setBlock(x, y, (byte) (1 + 8 * 16 + to)); - } - } - } else if (b[0][0] == b[0][1] && b[1][0] == b[1][1]) { - if (b[0][0]) { - // right grass top - level.setBlock(x, y, (byte) (2 + 9 * 16 + to)); - } else { - // left grass top - level.setBlock(x, y, (byte) (0 + 9 * 16 + to)); - } - } else if (b[0][0] == b[1][1] && b[0][1] == b[1][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else if (b[0][0] == b[1][0]) { - if (b[0][0]) { - if (b[0][1]) { - level.setBlock(x, y, (byte) (3 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (3 + 11 * 16 + to)); - } - } else { - if (b[0][1]) { - // right up grass top - level.setBlock(x, y, (byte) (2 + 8 * 16 + to)); - } else { - // left up grass top - level.setBlock(x, y, (byte) (0 + 8 * 16 + to)); - } - } - } else if (b[0][1] == b[1][1]) { - if (b[0][1]) { - if (b[0][0]) { - // left pocket grass - level.setBlock(x, y, (byte) (3 + 9 * 16 + to)); - } else { - // right pocket grass - level.setBlock(x, y, (byte) (3 + 8 * 16 + to)); - } - } else { - if (b[0][0]) { - level.setBlock(x, y, (byte) (2 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (0 + 10 * 16 + to)); - } - } - } else { - level.setBlock(x, y, (byte) (0 + 1 * 16 + to)); - } - } - } - } - -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/FitnessEvaluator.java b/src/dk/itu/mario/level/FitnessEvaluator.java deleted file mode 100644 index 495b4d3..0000000 --- a/src/dk/itu/mario/level/FitnessEvaluator.java +++ /dev/null @@ -1,30 +0,0 @@ -package dk.itu.mario.level; - -import java.util.List; - -import dk.itu.mario.level.grammar.LevelParseTree; - -public class FitnessEvaluator { - public static boolean isFit(LevelParseTree parseTree, PlayerProfile playerProfile, LevelArchetype levelArchetype) { - System.out.println("Evaluating LevelParseTree for fitness"); - List levelTemplate = parseTree.getLevelTemplate(); - //a good level has 8-24 components, plus some additional complexity depending on the player's skill level - - if (levelTemplate.size() < 8) { - return false; - } - - if (levelTemplate.size() > 24) { - return false; - } - - for (LevelComponent lc : levelTemplate) { - if (!playerProfile.isEnabled(lc.getType())) { - System.out.println("Level is not fit: " + lc.getType() + " is not enabled."); - return false; - } - } - - return true; - } -} diff --git a/src/dk/itu/mario/level/GrammarTuner.java b/src/dk/itu/mario/level/GrammarTuner.java deleted file mode 100644 index d2b1e33..0000000 --- a/src/dk/itu/mario/level/GrammarTuner.java +++ /dev/null @@ -1,54 +0,0 @@ -package dk.itu.mario.level; - -import java.io.File; -import org.drools.KnowledgeBase; -import org.drools.KnowledgeBaseFactory; -import org.drools.builder.KnowledgeBuilder; -import org.drools.builder.KnowledgeBuilderFactory; -import org.drools.builder.ResourceType; -import org.drools.io.ResourceFactory; -import org.drools.runtime.StatefulKnowledgeSession; - -import dk.itu.mario.level.PlayerProfile; -import dk.itu.mario.level.grammar.LevelGrammar; - -public class GrammarTuner { - /** - * @param args - */ - public static void tune(LevelGrammar levelGrammar, PlayerProfile playerProfile, LevelArchetype archetype) { - KnowledgeBase knowledgeBase = createKnowledgeBase(); - - try { - StatefulKnowledgeSession session = knowledgeBase - .newStatefulKnowledgeSession(); - session.insert(playerProfile); - session.fireAllRules(); - } catch (RuntimeException rte) { - System.out - .println("Unable to initialize StatefulKnowledgeSession for Rete grammar tuning - all challenges will be enabled! Exception: "); - rte.printStackTrace(System.out); - } - } - - private static KnowledgeBase createKnowledgeBase() { - KnowledgeBuilder builder = KnowledgeBuilderFactory - .newKnowledgeBuilder(); - - File accountRules = new File("rules/LevelTunerRules.drl"); - builder.add(ResourceFactory.newFileResource(accountRules), - ResourceType.DRL); - - if (builder.hasErrors()) { - throw new RuntimeException(builder.getErrors().toString()); - } - - KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(); - - // Add to Knowledge Base packages (rules from the drl file). - knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages()); - - return knowledgeBase; - } - -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/Level.java b/src/dk/itu/mario/level/Level.java deleted file mode 100644 index ba01a01..0000000 --- a/src/dk/itu/mario/level/Level.java +++ /dev/null @@ -1,235 +0,0 @@ -package dk.itu.mario.level; - -import java.io.*; - -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.engine.sprites.SpriteTemplate; - -public class Level implements LevelInterface { - - protected static final byte BLOCK_EMPTY = (byte) (0 + 1 * 16); - protected static final byte BLOCK_POWERUP = (byte) (4 + 2 + 1 * 16); - protected static final byte BLOCK_COIN = (byte) (4 + 1 + 1 * 16); - protected static final byte GROUND = (byte) (1 + 9 * 16); - protected static final byte ROCK = (byte) (9 + 0 * 16); - protected static final byte COIN = (byte) (2 + 2 * 16); - - protected static final byte CANNON_TOP = (byte) (14 + 0 * 16); - protected static final byte CANNON_MIDDLE = (byte) (14 + 1 * 16); - protected static final byte CANNON_BOTTOM = (byte) (14 + 2 * 16); - - protected static final byte LEFT_GRASS_EDGE = (byte) (0 + 9 * 16); - protected static final byte RIGHT_GRASS_EDGE = (byte) (2 + 9 * 16); - protected static final byte RIGHT_UP_GRASS_EDGE = (byte) (2 + 8 * 16); - protected static final byte LEFT_UP_GRASS_EDGE = (byte) (0 + 8 * 16); - protected static final byte LEFT_POCKET_GRASS = (byte) (3 + 9 * 16); - protected static final byte RIGHT_POCKET_GRASS = (byte) (3 + 8 * 16); - - protected static final byte HILL_FILL = (byte) (5 + 9 * 16); - protected static final byte HILL_LEFT = (byte) (4 + 9 * 16); - protected static final byte HILL_RIGHT = (byte) (6 + 9 * 16); - protected static final byte HILL_TOP = (byte) (5 + 8 * 16); - protected static final byte HILL_TOP_LEFT = (byte) (4 + 8 * 16); - protected static final byte HILL_TOP_RIGHT = (byte) (6 + 8 * 16); - - protected static final byte HILL_TOP_LEFT_IN = (byte) (4 + 11 * 16); - protected static final byte HILL_TOP_RIGHT_IN = (byte) (6 + 11 * 16); - - protected static final byte TUBE_TOP_LEFT = (byte) (10 + 0 * 16); - protected static final byte TUBE_TOP_RIGHT = (byte) (11 + 0 * 16); - - protected static final byte TUBE_SIDE_LEFT = (byte) (10 + 1 * 16); - protected static final byte TUBE_SIDE_RIGHT = (byte) (11 + 1 * 16); - - // The level's width and height - protected int width; - protected int height; - - // This map of WIDTH * HEIGHT that contains the level's design - private byte[][] map; - - // This is a map of WIDTH * HEIGHT that contains the placement and type - // enemies - private SpriteTemplate[][] spriteTemplates; - - // These are the place of the end of the level - protected int xExit; - protected int yExit; - - public Level() { - - } - - public Level(int width, int height) { - this.width = width; - this.height = height; - - xExit = 10; - yExit = 10; - map = new byte[width][height]; - spriteTemplates = new SpriteTemplate[width][height]; - } - - public static void loadBehaviors(DataInputStream dis) throws IOException { - dis.readFully(Level.TILE_BEHAVIORS); - } - - public static void saveBehaviors(DataOutputStream dos) throws IOException { - dos.write(Level.TILE_BEHAVIORS); - } - - /** - * Clone the level data so that we can load it when Mario die - */ - public Level clone() throws CloneNotSupportedException { - - Level clone = new Level(width, height); - - clone.map = new byte[width][height]; - clone.spriteTemplates = new SpriteTemplate[width][height]; - clone.xExit = xExit; - clone.yExit = yExit; - - for (int i = 0; i < map.length; i++) - for (int j = 0; j < map[i].length; j++) { - clone.map[i][j] = map[i][j]; - clone.spriteTemplates[i][j] = spriteTemplates[i][j]; - } - - return clone; - - } - - public void tick() { - } - - public byte getBlockCapped(int x, int y) { - if (x < 0) - x = 0; - if (y < 0) - y = 0; - if (x >= width) - x = width - 1; - if (y >= height) - y = height - 1; - return map[x][y]; - } - - public byte getBlock(int x, int y) { - if (x < 0) - x = 0; - if (y < 0) - return 0; - if (x >= width) - x = width - 1; - if (y >= height) - y = height - 1; - return map[x][y]; - } - - public void setBlock(int x, int y, byte b) { - if (x < 0) - return; - if (y < 0) - return; - if (x >= width) - return; - if (y >= height) - return; - map[x][y] = b; - } - - public boolean isBlocking(int x, int y, float xa, float ya) { - byte block = getBlock(x, y); - - boolean blocking = ((TILE_BEHAVIORS[block & 0xff]) & BIT_BLOCK_ALL) > 0; - blocking |= (ya > 0) - && ((TILE_BEHAVIORS[block & 0xff]) & BIT_BLOCK_UPPER) > 0; - blocking |= (ya < 0) - && ((TILE_BEHAVIORS[block & 0xff]) & BIT_BLOCK_LOWER) > 0; - - return blocking; - } - - public SpriteTemplate getSpriteTemplate(int x, int y) { - if (x < 0) - return null; - if (y < 0) - return null; - if (x >= width) - return null; - if (y >= height) - return null; - return spriteTemplates[x][y]; - } - - public void setSpriteTemplate(int x, int y, SpriteTemplate spriteTemplate) { - if (x < 0) - return; - if (y < 0) - return; - if (x >= width) - return; - if (y >= height) - return; - spriteTemplates[x][y] = spriteTemplate; - } - - public SpriteTemplate[][] getSpriteTemplate() { - return this.spriteTemplates; - } - - public void resetSpriteTemplate() { - for (int i = 0; i < spriteTemplates.length; i++) { - for (int j = 0; j < spriteTemplates[i].length; j++) { - - SpriteTemplate st = spriteTemplates[i][j]; - if (st != null) - st.isDead = false; - } - } - } - - public void print(byte[][] array) { - for (int i = 0; i < array.length; i++) { - for (int j = 0; j < array[i].length; j++) { - System.out.print(array[i][j]); - } - System.out.println(); - } - } - - public byte[][] getMap() { - return map; - } - - public SpriteTemplate[][] getSpriteTemplates() { - return spriteTemplates; - } - - public int getxExit() { - // TODO Auto-generated method stub - return xExit; - } - - public int getyExit() { - // TODO Auto-generated method stub - return yExit; - } - - public int getWidth() { - // TODO Auto-generated method stub - return width; - } - - public int getHeight() { - // TODO Auto-generated method stub - return height; - } - - public String getName() { - // TODO Auto-generated method stub - return ""; - } - -} diff --git a/src/dk/itu/mario/level/LevelArchetype.java b/src/dk/itu/mario/level/LevelArchetype.java deleted file mode 100644 index ea0415d..0000000 --- a/src/dk/itu/mario/level/LevelArchetype.java +++ /dev/null @@ -1,53 +0,0 @@ -package dk.itu.mario.level; - -import dk.itu.mario.MarioInterface.LevelInterface; - -public class LevelArchetype { - public static final int MAX_DIFFICULTY_LEVEL = 10; - - // The canonical Super Mario level types. - public enum TYPE { - OVERGROUND, UNDERGROUND, CASTLE - } - - private int difficultyLevel; - private TYPE type; - - public LevelArchetype(TYPE type, int difficultyLevel) { - if (difficultyLevel < 1 || difficultyLevel > MAX_DIFFICULTY_LEVEL) { - throw new IllegalArgumentException( - "DifficultyLevel must be in the range [1.." - + MAX_DIFFICULTY_LEVEL + "]"); - } - this.difficultyLevel = difficultyLevel; - this.type = type; - } - - public int getDifficultyLevel() { - return difficultyLevel; - } - - public TYPE getType() { - return type; - } - - public int getTypeInt() { - switch (type) { - case CASTLE: - return LevelInterface.TYPE_CASTLE; - case OVERGROUND: - return LevelInterface.TYPE_OVERGROUND; - case UNDERGROUND: - return LevelInterface.TYPE_UNDERGROUND; - default: - throw new UnsupportedOperationException("LevelArchetype.TYPE " - + type + " does not have a known integer value"); - } - } - - @Override - public String toString() { - return type + " (Difficulty " + difficultyLevel + "/" - + MAX_DIFFICULTY_LEVEL + ")"; - } -} diff --git a/src/dk/itu/mario/level/LevelComponent.java b/src/dk/itu/mario/level/LevelComponent.java deleted file mode 100644 index 705d832..0000000 --- a/src/dk/itu/mario/level/LevelComponent.java +++ /dev/null @@ -1,61 +0,0 @@ -package dk.itu.mario.level; - -public class LevelComponent { - public enum TYPE { - BLOCKS, - BOWLING_ALLEY, - CANNON_LINE, - COIN_DIVE, - FLAT_HI, - FLAT_LO, - FLAT_SAFE, - HI_LO, - HI_PATH, - LEMMING_TRAP, - LEVEL_SEGMENT, - LEVEL, - LO_HI, - LO_PATH, - MAZE, - PIPE_JUMP, - PLATFORM_JUMP, - POWER_UP, - SINGLE_PIT, - CHALLENGE - }; - - public enum MazeLevel { - BOT, MID, TOP - } - - public enum PlatformLevel { - BOT, MID_D, MID_U, TOP - } - - private TYPE type; - private int start; - private int end; - - public LevelComponent(TYPE type, int start, int end) { - this.type = type; - this.end = end; - this.start = start; - } - - public TYPE getType() { - return type; - } - - public int getStart() { - return start; - } - - public int getEnd() { - return end; - } - - @Override - public String toString() { - return type + "[" + start + ".." + end + "]"; - } -} diff --git a/src/dk/itu/mario/level/LevelEditView.java b/src/dk/itu/mario/level/LevelEditView.java deleted file mode 100644 index bc9289c..0000000 --- a/src/dk/itu/mario/level/LevelEditView.java +++ /dev/null @@ -1,130 +0,0 @@ -//package dk.itu.mario.level; -// -//import java.awt.Color; -//import java.awt.Dimension; -//import java.awt.Graphics; -//import java.awt.event.MouseEvent; -//import java.awt.event.MouseListener; -//import java.awt.event.MouseMotionListener; -// -//import javax.swing.*; -//import com.mojang.mario.*; -//import com.mojang.mario.level.*; -// -//import dk.itu.mario.engine.Art; -//import dk.itu.mario.engine.LevelRenderer; -// -// -// -//public class LevelEditView extends JComponent implements MouseListener, MouseMotionListener -//{ -// private static final long serialVersionUID = -7696446733303717142L; -// -// private LevelRenderer levelRenderer; -// private Level level; -// -// private int xTile = -1; -// private int yTile = -1; -// private TilePicker tilePicker; -// -// public LevelEditView(TilePicker tilePicker) -// { -// this.tilePicker = tilePicker; -// level = new Level(256, 15); -// Dimension size = new Dimension(level.width * 16, level.height * 16); -// setPreferredSize(size); -// setMinimumSize(size); -// setMaximumSize(size); -// -// addMouseListener(this); -// addMouseMotionListener(this); -// } -// -// public void setLevel(Level level) -// { -// this.level = level; -// Dimension size = new Dimension(level.width * 16, level.height * 16); -// setPreferredSize(size); -// setMinimumSize(size); -// setMaximumSize(size); -// repaint(); -// levelRenderer.setLevel(level); -// } -// -// public Level getLevel() -// { -// return level; -// } -// -// public void addNotify() -// { -// super.addNotify(); -// Art.init(getGraphicsConfiguration(), null); -// levelRenderer = new LevelRenderer(level, getGraphicsConfiguration(), level.width * 16, level.height * 16); -// levelRenderer.renderBehaviors = true; -// } -// -// public void paintComponent(Graphics g) -// { -// g.setColor(new Color(0x8090ff)); -// g.fillRect(0, 0, level.width * 16, level.height * 16); -// levelRenderer.render(g, 0, 0); -// g.setColor(Color.BLACK); -// g.drawRect(xTile * 16 - 1, yTile * 16 - 1, 17, 17); -// } -// -// public void mouseClicked(MouseEvent e) -// { -// } -// -// public void mouseEntered(MouseEvent e) -// { -// } -// -// public void mouseExited(MouseEvent e) -// { -// xTile = -1; -// yTile = -1; -// repaint(); -// } -// -// public void mousePressed(MouseEvent e) -// { -// xTile = e.getX() / 16; -// yTile = e.getY() / 16; -// -// if (e.getButton() == 3) -// { -// tilePicker.setPickedTile(level.getBlock(xTile, yTile)); -// } -// else -// { -// level.setBlock(xTile, yTile, tilePicker.pickedTile); -// levelRenderer.repaint(xTile - 1, yTile - 1, 3, 3); -// -// repaint(); -// } -// } -// -// public void mouseReleased(MouseEvent e) -// { -// } -// -// public void mouseDragged(MouseEvent e) -// { -// xTile = e.getX() / 16; -// yTile = e.getY() / 16; -// -// level.setBlock(xTile, yTile, tilePicker.pickedTile); -// levelRenderer.repaint(xTile - 1, yTile - 1, 3, 3); -// -// repaint(); -// } -// -// public void mouseMoved(MouseEvent e) -// { -// xTile = e.getX() / 16; -// yTile = e.getY() / 16; -// repaint(); -// } -//} diff --git a/src/dk/itu/mario/level/MyLevel.java b/src/dk/itu/mario/level/MyLevel.java deleted file mode 100644 index e2012d6..0000000 --- a/src/dk/itu/mario/level/MyLevel.java +++ /dev/null @@ -1,522 +0,0 @@ -package dk.itu.mario.level; - -import java.util.Random; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.engine.sprites.Enemy; -import dk.itu.mario.engine.sprites.SpriteTemplate; - -public class MyLevel extends Level { - // Store information about the level - public int ENEMIES = 0; // the number of enemies the level contains - public int BLOCKS_EMPTY = 0; // the number of empty blocks - public int BLOCKS_COINS = 0; // the number of coin blocks - public int BLOCKS_POWER = 0; // the number of power blocks - public int COINS = 0; // These are the coins in boxes that Mario collect - - public static long lastSeed; - - Random random; - - private int difficulty; - private int type; - - public MyLevel(int width, int height) { - super(width, height); - } - - public MyLevel(int width, int height, long seed, int difficulty, int type, - GamePlay playerMetrics) { - this(width, height); - creat(seed, difficulty, type); - } - - public void creat(long seed, int difficulty, int type) { - this.type = type; - this.difficulty = difficulty; - - lastSeed = seed; - random = new Random(seed); - - // create the start location - int length = 0; - length += buildStraight(0, width, true); - - // create all of the medium sections - while (length < width - 64) { - length += buildStraight(length, width - length, false); - length += buildStraight(length, width - length, false); - length += buildHillStraight(length, width - length); - length += buildJump(length, width - length); - length += buildTubes(length, width - length); - length += buildCannons(length, width - length); - } - - // set the end piece - int floor = height - 1 - random.nextInt(4); - - xExit = length + 8; - yExit = floor; - - // fills the end piece - for (int x = length; x < width; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - if (type == LevelInterface.TYPE_CASTLE - || type == LevelInterface.TYPE_UNDERGROUND) { - int ceiling = 0; - int run = 0; - for (int x = 0; x < width; x++) { - if (run-- <= 0 && x > 4) { - ceiling = random.nextInt(4); - run = random.nextInt(4) + 4; - } - for (int y = 0; y < height; y++) { - if ((x > 4 && y <= ceiling) || x < 1) { - setBlock(x, y, GROUND); - } - } - } - } - - fixWalls(); - - } - - private int buildJump(int xo, int maxLength) { - // jl: jump length - // js: the number of blocks that are available at either side for free - int js = random.nextInt(4) + 2; - int jl = random.nextInt(2) + 2; - int length = js * 2 + jl; - - boolean hasStairs = random.nextInt(3) == 0; - - int floor = height - 1 - random.nextInt(4); - // run from the start x position, for the whole length - for (int x = xo; x < xo + length; x++) { - if (x < xo + js || x > xo + length - js - 1) { - // run for all y's since we need to paint blocks upward - for (int y = 0; y < height; y++) { // paint ground up until the - // floor - if (y >= floor) { - setBlock(x, y, GROUND); - } - // if it is above ground, start making stairs of rocks - else if (hasStairs) { // LEFT SIDE - if (x < xo + js) { // we need to max it out and level - // because it wont - // paint ground correctly unless two - // bricks are side by side - if (y >= floor - (x - xo) + 1) { - setBlock(x, y, ROCK); - } - } else { // RIGHT SIDE - if (y >= floor - ((xo + length) - x) + 2) { - setBlock(x, y, ROCK); - } - } - } - } - } - } - - return length; - } - - private int buildCannons(int xo, int maxLength) { - int length = random.nextInt(10) + 2; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - int xCannon = xo + 1 + random.nextInt(4); - for (int x = xo; x < xo + length; x++) { - if (x > xCannon) { - xCannon += 2 + random.nextInt(4); - } - if (xCannon == xo + length - 1) - xCannon += 10; - int cannonHeight = floor - random.nextInt(4) - 1; - - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } else { - if (x == xCannon && y >= cannonHeight) { - if (y == cannonHeight) { - setBlock(x, y, (byte) (14 + 0 * 16)); - } else if (y == cannonHeight + 1) { - setBlock(x, y, (byte) (14 + 1 * 16)); - } else { - setBlock(x, y, (byte) (14 + 2 * 16)); - } - } - } - } - } - - return length; - } - - private int buildHillStraight(int xo, int maxLength) { - int length = random.nextInt(10) + 10; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - for (int x = xo; x < xo + length; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - addEnemyLine(xo + 1, xo + length - 1, floor - 1); - - int h = floor; - - boolean keepGoing = true; - - boolean[] occupied = new boolean[length]; - while (keepGoing) { - h = h - 2 - random.nextInt(3); - - if (h <= 0) { - keepGoing = false; - } else { - int l = random.nextInt(5) + 3; - int xxo = random.nextInt(length - l - 2) + xo + 1; - - if (occupied[xxo - xo] || occupied[xxo - xo + l] - || occupied[xxo - xo - 1] || occupied[xxo - xo + l + 1]) { - keepGoing = false; - } else { - occupied[xxo - xo] = true; - occupied[xxo - xo + l] = true; - addEnemyLine(xxo, xxo + l, h - 1); - if (random.nextInt(4) == 0) { - decorate(xxo - 1, xxo + l + 1, h); - keepGoing = false; - } - for (int x = xxo; x < xxo + l; x++) { - for (int y = h; y < floor; y++) { - int xx = 5; - if (x == xxo) - xx = 4; - if (x == xxo + l - 1) - xx = 6; - int yy = 9; - if (y == h) - yy = 8; - - if (getBlock(x, y) == 0) { - setBlock(x, y, (byte) (xx + yy * 16)); - } else { - if (getBlock(x, y) == HILL_TOP_LEFT) - setBlock(x, y, HILL_TOP_LEFT_IN); - if (getBlock(x, y) == HILL_TOP_RIGHT) - setBlock(x, y, HILL_TOP_RIGHT_IN); - } - } - } - } - } - } - - return length; - } - - private void addEnemyLine(int x0, int x1, int y) { - for (int x = x0; x < x1; x++) { - if (random.nextInt(35) < difficulty + 1) { - int type = random.nextInt(4); - - if (difficulty < 1) { - type = Enemy.ENEMY_GOOMBA; - } else if (difficulty < 3) { - type = random.nextInt(3); - } - - setSpriteTemplate(x, y, - new SpriteTemplate(type, - random.nextInt(35) < difficulty)); - ENEMIES++; - } - } - } - - private int buildTubes(int xo, int maxLength) { - int length = random.nextInt(10) + 5; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - int xTube = xo + 1 + random.nextInt(4); - int tubeHeight = floor - random.nextInt(2) - 2; - for (int x = xo; x < xo + length; x++) { - if (x > xTube + 1) { - xTube += 3 + random.nextInt(4); - tubeHeight = floor - random.nextInt(2) - 2; - } - if (xTube >= xo + length - 2) - xTube += 10; - - if (x == xTube && random.nextInt(11) < difficulty + 1) { - setSpriteTemplate(x, tubeHeight, new SpriteTemplate( - Enemy.ENEMY_FLOWER, false)); - ENEMIES++; - } - - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - - } else { - if ((x == xTube || x == xTube + 1) && y >= tubeHeight) { - int xPic = 10 + x - xTube; - - if (y == tubeHeight) { - // tube top - setBlock(x, y, (byte) (xPic + 0 * 16)); - } else { - // tube side - setBlock(x, y, (byte) (xPic + 1 * 16)); - } - } - } - } - } - - return length; - } - - private int buildStraight(int xo, int maxLength, boolean safe) { - int length = random.nextInt(10) + 2; - - if (safe) - length = 10 + random.nextInt(5); - - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - - // runs from the specified x position to the length of the segment - for (int x = xo; x < xo + length; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - if (!safe) { - if (length > 5) { - decorate(xo, xo + length, floor); - } - } - - return length; - } - - private void decorate(int xStart, int xLength, int floor) { - // if its at the very top, just return - if (floor < 1) - return; - - // boolean coins = random.nextInt(3) == 0; - boolean rocks = true; - - // add an enemy line above the box - addEnemyLine(xStart + 1, xLength - 1, floor - 1); - - int s = random.nextInt(4); - int e = random.nextInt(4); - - if (floor - 2 > 0) { - if ((xLength - 1 - e) - (xStart + 1 + s) > 1) { - for (int x = xStart + 1 + s; x < xLength - 1 - e; x++) { - setBlock(x, floor - 2, COIN); - COINS++; - } - } - } - - s = random.nextInt(4); - e = random.nextInt(4); - - // this fills the set of blocks and the hidden objects inside them - if (floor - 4 > 0) { - if ((xLength - 1 - e) - (xStart + 1 + s) > 2) { - for (int x = xStart + 1 + s; x < xLength - 1 - e; x++) { - if (rocks) { - if (x != xStart + 1 && x != xLength - 2 - && random.nextInt(3) == 0) { - if (random.nextInt(4) == 0) { - setBlock(x, floor - 4, BLOCK_POWERUP); - BLOCKS_POWER++; - } else { // the fills a block with a hidden coin - setBlock(x, floor - 4, BLOCK_COIN); - BLOCKS_COINS++; - } - } else if (random.nextInt(4) == 0) { - if (random.nextInt(4) == 0) { - setBlock(x, floor - 4, (byte) (2 + 1 * 16)); - } else { - setBlock(x, floor - 4, (byte) (1 + 1 * 16)); - } - } else { - setBlock(x, floor - 4, BLOCK_EMPTY); - BLOCKS_EMPTY++; - } - } - } - } - } - } - - private void fixWalls() { - boolean[][] blockMap = new boolean[width + 1][height + 1]; - - for (int x = 0; x < width + 1; x++) { - for (int y = 0; y < height + 1; y++) { - int blocks = 0; - for (int xx = x - 1; xx < x + 1; xx++) { - for (int yy = y - 1; yy < y + 1; yy++) { - if (getBlockCapped(xx, yy) == GROUND) { - blocks++; - } - } - } - blockMap[x][y] = blocks == 4; - } - } - blockify(this, blockMap, width + 1, height + 1); - } - - private void blockify(Level level, boolean[][] blocks, int width, int height) { - int to = 0; - if (type == LevelInterface.TYPE_CASTLE) { - to = 4 * 2; - } else if (type == LevelInterface.TYPE_UNDERGROUND) { - to = 4 * 3; - } - - boolean[][] b = new boolean[2][2]; - - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - for (int xx = x; xx <= x + 1; xx++) { - for (int yy = y; yy <= y + 1; yy++) { - int _xx = xx; - int _yy = yy; - if (_xx < 0) - _xx = 0; - if (_yy < 0) - _yy = 0; - if (_xx > width - 1) - _xx = width - 1; - if (_yy > height - 1) - _yy = height - 1; - b[xx - x][yy - y] = blocks[_xx][_yy]; - } - } - - if (b[0][0] == b[1][0] && b[0][1] == b[1][1]) { - if (b[0][0] == b[0][1]) { - if (b[0][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else { - // KEEP OLD BLOCK! - } - } else { - if (b[0][0]) { - // down grass top? - level.setBlock(x, y, (byte) (1 + 10 * 16 + to)); - } else { - // up grass top - level.setBlock(x, y, (byte) (1 + 8 * 16 + to)); - } - } - } else if (b[0][0] == b[0][1] && b[1][0] == b[1][1]) { - if (b[0][0]) { - // right grass top - level.setBlock(x, y, (byte) (2 + 9 * 16 + to)); - } else { - // left grass top - level.setBlock(x, y, (byte) (0 + 9 * 16 + to)); - } - } else if (b[0][0] == b[1][1] && b[0][1] == b[1][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else if (b[0][0] == b[1][0]) { - if (b[0][0]) { - if (b[0][1]) { - level.setBlock(x, y, (byte) (3 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (3 + 11 * 16 + to)); - } - } else { - if (b[0][1]) { - // right up grass top - level.setBlock(x, y, (byte) (2 + 8 * 16 + to)); - } else { - // left up grass top - level.setBlock(x, y, (byte) (0 + 8 * 16 + to)); - } - } - } else if (b[0][1] == b[1][1]) { - if (b[0][1]) { - if (b[0][0]) { - // left pocket grass - level.setBlock(x, y, (byte) (3 + 9 * 16 + to)); - } else { - // right pocket grass - level.setBlock(x, y, (byte) (3 + 8 * 16 + to)); - } - } else { - if (b[0][0]) { - level.setBlock(x, y, (byte) (2 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (0 + 10 * 16 + to)); - } - } - } else { - level.setBlock(x, y, (byte) (0 + 1 * 16 + to)); - } - } - } - } - - public RandomLevel clone() throws CloneNotSupportedException { - - RandomLevel clone = new RandomLevel(width, height); - - clone.xExit = xExit; - clone.yExit = yExit; - byte[][] map = getMap(); - SpriteTemplate[][] st = getSpriteTemplate(); - - for (int i = 0; i < map.length; i++) - for (int j = 0; j < map[i].length; j++) { - clone.setBlock(i, j, map[i][j]); - clone.setSpriteTemplate(i, j, st[i][j]); - } - clone.BLOCKS_COINS = BLOCKS_COINS; - clone.BLOCKS_EMPTY = BLOCKS_EMPTY; - clone.BLOCKS_POWER = BLOCKS_POWER; - clone.ENEMIES = ENEMIES; - clone.COINS = COINS; - - return clone; - - } - -} diff --git a/src/dk/itu/mario/level/PCGLevel.java b/src/dk/itu/mario/level/PCGLevel.java deleted file mode 100644 index 0a7b055..0000000 --- a/src/dk/itu/mario/level/PCGLevel.java +++ /dev/null @@ -1,1493 +0,0 @@ -package dk.itu.mario.level; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.engine.sprites.SpriteTemplate; -import dk.itu.mario.level.grammar.LevelGrammar; -import dk.itu.mario.level.grammar.LevelGrammarFactory; -import dk.itu.mario.level.grammar.LevelParseTree; -import dk.itu.mario.level.matcher.ArchetypeMatcher; -import dk.itu.mario.level.matcher.ProfileMatcher; - -public class PCGLevel extends Level { - public static long lastSeed; - // disable TESTING - enable grammar-based level generation - public static boolean TESTING = false; - - public int BLOCKS_COINS = 0; // the number of coin blocks - public int BLOCKS_EMPTY = 0; // the number of empty blocks - public int BLOCKS_POWER = 0; // the number of power blocks - public int COINS = 0; // These are the coins in boxes that Mario collect - - // Store information about the level - public int ENEMIES = 0; // the number of enemies the level contains - private DataRecorder dataRecorder; - private HashMap probability = new HashMap(); - private Random random; - private int type; - - public PCGLevel(int width, int height) { - super(width, height); - } - - public PCGLevel(int width, int height, long seed, int difficulty, int type, - GamePlay playerMetrics) { - this(width, height); - - System.out - .println("Generating level based on previous GamePlay metrics ONLY."); - this.dataRecorder = DataRecorder.BLANK_RECORD; - - generateLevel(seed, playerMetrics); - } - - public PCGLevel(int width, int height, long seed, int difficulty, int type, - GamePlay playerMetrics, DataRecorder dataRecorder) { - this(width, height); - - System.out - .println("Generating level based on previous GamePlay AND DataRecorder metrics."); - this.dataRecorder = dataRecorder; - - generateLevel(seed, playerMetrics); - } - - @Override - public RandomLevel clone() throws CloneNotSupportedException { - - RandomLevel clone = new RandomLevel(width, height); - - clone.xExit = xExit; - clone.yExit = yExit; - byte[][] map = getMap(); - SpriteTemplate[][] st = getSpriteTemplate(); - - for (int i = 0; i < map.length; i++) - for (int j = 0; j < map[i].length; j++) { - clone.setBlock(i, j, map[i][j]); - clone.setSpriteTemplate(i, j, st[i][j]); - } - clone.BLOCKS_COINS = BLOCKS_COINS; - clone.BLOCKS_EMPTY = BLOCKS_EMPTY; - clone.BLOCKS_POWER = BLOCKS_POWER; - clone.ENEMIES = ENEMIES; - clone.COINS = COINS; - - return clone; - - } - - private void blockify(Level level, boolean[][] blocks, int width, int height) { - int to = 0; - if (type == LevelInterface.TYPE_CASTLE) { - to = 4 * 2; - } else if (type == LevelInterface.TYPE_UNDERGROUND) { - to = 4 * 3; - } - - boolean[][] b = new boolean[2][2]; - - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - for (int xx = x; xx <= x + 1; xx++) { - for (int yy = y; yy <= y + 1; yy++) { - int _xx = xx; - int _yy = yy; - if (_xx < 0) - _xx = 0; - if (_yy < 0) - _yy = 0; - if (_xx > width - 1) - _xx = width - 1; - if (_yy > height - 1) - _yy = height - 1; - b[xx - x][yy - y] = blocks[_xx][_yy]; - } - } - - if (b[0][0] == b[1][0] && b[0][1] == b[1][1]) { - if (b[0][0] == b[0][1]) { - if (b[0][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else { - // KEEP OLD BLOCK! - } - } else { - if (b[0][0]) { - // down grass top? - level.setBlock(x, y, (byte) (1 + 10 * 16 + to)); - } else { - // up grass top - level.setBlock(x, y, (byte) (1 + 8 * 16 + to)); - } - } - } else if (b[0][0] == b[0][1] && b[1][0] == b[1][1]) { - if (b[0][0]) { - // right grass top - level.setBlock(x, y, (byte) (2 + 9 * 16 + to)); - } else { - // left grass top - level.setBlock(x, y, (byte) (0 + 9 * 16 + to)); - } - } else if (b[0][0] == b[1][1] && b[0][1] == b[1][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else if (b[0][0] == b[1][0]) { - if (b[0][0]) { - if (b[0][1]) { - level.setBlock(x, y, (byte) (3 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (3 + 11 * 16 + to)); - } - } else { - if (b[0][1]) { - // right up grass top - level.setBlock(x, y, (byte) (2 + 8 * 16 + to)); - } else { - // left up grass top - level.setBlock(x, y, (byte) (0 + 8 * 16 + to)); - } - } - } else if (b[0][1] == b[1][1]) { - if (b[0][1]) { - if (b[0][0]) { - // left pocket grass - level.setBlock(x, y, (byte) (3 + 9 * 16 + to)); - } else { - // right pocket grass - level.setBlock(x, y, (byte) (3 + 8 * 16 + to)); - } - } else { - if (b[0][0]) { - level.setBlock(x, y, (byte) (2 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (0 + 10 * 16 + to)); - } - } - } else { - level.setBlock(x, y, (byte) (0 + 1 * 16 + to)); - } - } - } - } - - private int buildBowlingAlley(int xo, int maxLength) { - if (maxLength >= 26) { - - int floor = height - 1 - random.nextInt(4); - int enemyType = shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? SpriteTemplate.ARMORED_TURTLE - : SpriteTemplate.GREEN_TURTLE) - : SpriteTemplate.GOOMPA; - PlayerProfile.ChallengeRewardType reward = shouldAddReward(); - boolean arc = random.nextBoolean(); - int numEnemies = 0; - for (int i = 0; i < 10; i++) { - numEnemies += shouldAddChallenge(PlayerProfile.ChallengeRewardType.ENEMY) ? 1 - : 0; - } - - // Create the pit. - for (int y = floor - 1; y < height; y++) { - setBlock(xo, y, Level.GROUND); - setBlock(xo + 1, y, Level.GROUND); - } - - for (int y = floor; y < height; y++) { - setBlock(xo + 2, y, Level.GROUND); - setBlock(xo + 3, y, Level.GROUND); - setBlock(xo + 4, y, Level.GROUND); - } - - setSpriteTemplate(xo + 2, floor - 1, new SpriteTemplate( - SpriteTemplate.RED_TURTLE, false)); - ENEMIES++; - - for (int x = 5; x < 26; x++) { - for (int y = floor - 3; y < height; y++) { - setBlock(xo + x, y, Level.GROUND); - } - - if (arc && reward == PlayerProfile.ChallengeRewardType.COIN - && x >= 11 && x <= 23) { - if (x == 15) { - setBlock(xo + x, floor - 6, Level.COIN); - COINS++; - } - - else if (x == 16) { - setBlock(xo + x, floor - 7, Level.COIN); - COINS++; - } - - else if (x == 18) { - setBlock(xo + x, floor - 8, Level.COIN); - COINS++; - } - - else if (x == 19) { - setBlock(xo + x, floor - 8, Level.COIN); - COINS++; - } - - else if (x == 20) { - setBlock(xo + x, floor - 8, Level.COIN); - COINS++; - } - - else if (x == 22) { - setBlock(xo + x, floor - 7, Level.COIN); - COINS++; - } - - else if (x == 23) { - setBlock(xo + x, floor - 6, Level.COIN); - COINS++; - } - } - - else if (!arc - && reward == PlayerProfile.ChallengeRewardType.COIN - && x >= 10 && x <= 20) { - setBlock(xo + x, floor - 6, Level.COIN); - COINS++; - } - - else if (reward == PlayerProfile.ChallengeRewardType.BLOCK - && x >= 13 && x <= 17) { - byte tile = (random.nextDouble() <= probability - .get(PlayerProfile.ChallengeRewardType.POWERUP)) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - - setBlock(xo + x, floor - 6, tile); - - if (tile == Level.BLOCK_COIN) { - BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - BLOCKS_POWER++; - } - } - - if (x >= 26 - numEnemies) { - setSpriteTemplate(xo + x, floor - 4, new SpriteTemplate( - enemyType, false)); - ENEMIES++; - } - } - - return 26; - } - - return 0; - } - - private int buildCannonLine(int xo, int maxLength) { - if (maxLength >= 6) { - - int floor = height - 1 - random.nextInt(4); - int length = 6; - - for (int x = 0; x < length; x++) { - for (int y = floor; y < height; y++) { - setBlock(xo + x, y, Level.GROUND); - } - - if (x == 3) { - setBlock(xo + x, floor - 1, Level.CANNON_MIDDLE); - setBlock(xo + x, floor - 2, Level.CANNON_TOP); - setBlock( - xo + x, - floor - 3, - shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? Level.CANNON_TOP - : Level.CANNON_MIDDLE); - setBlock(xo + x, floor - 4, Level.CANNON_TOP); - } - } - - return length; - } - return 0; - } - - private int buildCoinDive(int xo, int maxLength) { - if (maxLength >= 18) { - int length = 18; - - int floor = height - 1 - random.nextInt(4); - - for (int x = 0; x < length; x++) { - for (int y = floor; y < height; y++) { - setBlock(xo + x, y, Level.GROUND); - } - - if (x > 2 && x < 6) { - setBlock(xo + x, floor - 3, Level.BLOCK_EMPTY); - this.BLOCKS_EMPTY++; - } else if (x > 2 && x < 11) { - setBlock(xo + x, floor - 5, Level.BLOCK_EMPTY); - this.BLOCKS_EMPTY++; - } else if (x == 11 || x == 12) { - setBlock(xo + x, floor - 6, Level.COIN); - COINS++; - } else if (x == 13) { - setBlock(xo + x, floor - 5, Level.COIN); - COINS++; - } else if (x == 14) { - setBlock(xo + x, floor - 4, Level.COIN); - COINS++; - } else if (x == 15) { - setBlock(xo + x, floor - 3, Level.COIN); - COINS++; - } - } - - return length; - } - - return 0; - - } - - private int buildFreebie(int xo, int maxLength) { - if (maxLength >= 9) { - int floor = height - 1 - random.nextInt(4); - for (int x = 0; x < 9; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(xo + x, y, GROUND); - } - } - } - - if (random.nextBoolean()) { - setBlock(xo + 1, floor - 1, Level.BLOCK_EMPTY); - setBlock(xo + 7, floor - 1, Level.BLOCK_POWERUP); - - setSpriteTemplate(xo + 6, floor - 1, new SpriteTemplate( - SpriteTemplate.GREEN_TURTLE, false)); - - this.BLOCKS_EMPTY++; - this.BLOCKS_POWER++; - this.ENEMIES++; - } - - else { - int powerupLoc = random.nextInt(5); - setBlock(xo + 2, floor - 3, - powerupLoc == 0 ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN); - setBlock(xo + 3, floor - 3, - powerupLoc == 1 ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN); - setBlock(xo + 4, floor - 3, - powerupLoc == 2 ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN); - setBlock(xo + 5, floor - 3, - powerupLoc == 3 ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN); - setBlock(xo + 6, floor - 3, - powerupLoc == 4 ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN); - - this.BLOCKS_COINS += 4; - this.BLOCKS_POWER++; - } - - return 9; - } - - else if (maxLength >= 5) { - - int floor = height - 1 - random.nextInt(4); - for (int x = 0; x < 5; x++) { - for (int y = floor; y < height; y++) { - setBlock(xo + x, y, GROUND); - } - } - - if (random.nextBoolean()) { - setBlock(xo, floor - 1, Level.BLOCK_EMPTY); - setBlock(xo + 4, floor - 1, Level.BLOCK_POWERUP); - - this.BLOCKS_EMPTY++; - this.BLOCKS_POWER++; - - setSpriteTemplate(xo + 3, floor - 1, new SpriteTemplate( - SpriteTemplate.GREEN_TURTLE, false)); - - this.ENEMIES++; - } - - else { - setBlock(xo + 2, floor - 3, Level.BLOCK_POWERUP); - this.BLOCKS_POWER++; - } - - return 5; - } - return 0; - } - - private int buildLemmingTrap(int xo, int maxLength) { - if (maxLength >= 14) { - int floor = height - 1 - random.nextInt(4); - int enemyType = shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? SpriteTemplate.ARMORED_TURTLE - : SpriteTemplate.GREEN_TURTLE) - : SpriteTemplate.GOOMPA; - boolean flying = shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) - && shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) - && shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY); - PlayerProfile.ChallengeRewardType reward = shouldAddReward(); - - for (int x = 0; x < 18; x++) { - if (x > 5) { - for (int y = floor - 4; y < height; y++) { - setBlock(xo + x, y, Level.GROUND); - } - } - - else { - for (int y = floor; y < height; y++) { - setBlock(xo + x, y, Level.GROUND); - } - } - - if (x > 6 && x % 2 == 0) { - setSpriteTemplate(xo + x, floor - 5, new SpriteTemplate( - enemyType, flying)); - ENEMIES++; - } - - if (reward == PlayerProfile.ChallengeRewardType.COIN && x >= 7 - && x <= 16) { - setBlock(xo + x, floor - 7, Level.COIN); - COINS++; - } - - else if (reward == PlayerProfile.ChallengeRewardType.BLOCK - && x >= 10 && x <= 13) { - byte tile = random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - - setBlock(xo + x, floor - 7, tile); - - if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else { - this.BLOCKS_POWER++; - } - } - } - return 18; - } - - return 0; - } - - private int buildMaze(int xo, int maxLength) { - if (maxLength >= 19) { - - int length = random.nextInt(maxLength - 19) + 20; - int soFar = 6; - int next; - // boolean skipUp = false; - // boolean skipDown = false; - - class Stretch { - public int len; - public LevelComponent.MazeLevel lvl; - - public Stretch(int lngth) { - len = lngth; - - switch (random.nextInt(3)) { - case 0: - lvl = LevelComponent.MazeLevel.TOP; - break; - case 1: - lvl = LevelComponent.MazeLevel.MID; - break; - default: - lvl = LevelComponent.MazeLevel.BOT; - } - } - } - - ArrayList maze = new ArrayList(); - - loop: while (soFar < length) { - if (soFar + 3 > length) { - length = soFar; - break loop; - } - - next = random.nextInt(18) + 5; - - if (soFar + next > length) { - next = length - soFar; - } - - maze.add(new Stretch(next)); - - soFar += next; - } - - setBlock(xo, this.height - 1, Level.GROUND); - setBlock(xo + 1, this.height - 1, Level.GROUND); - setBlock(xo + 2, this.height - 1, Level.GROUND); - soFar = 3; - - Stretch str; - // Stretch nxt; - boolean stretchEnd; - boolean midLine; - boolean addEnemy; - int heightMod; - int enemyType; - for (int i = 0; i < maze.size(); i++) { - - str = maze.get(i); - - for (int x = 0; x < str.len; x++) { - - setBlock(xo + soFar + x, this.height - 1, Level.GROUND); - - // skipUp = (skipUp && (x == str.len - 2)) - // || (str.len >= 5 && x == (str.len / 2)); - // skipDown = (skipDown && (x == str.len - 2)) - // || (str.len >= 5 && x == (str.len / 2)); - midLine = (str.len >= 5 && x == (str.len / 2) - 1); - stretchEnd = (x == str.len - 1); - - addEnemy = !midLine && !stretchEnd - && (random.nextDouble() < .25); - - if // ((stretchEnd && nxt != null && nxt.lvl != - // MazeLevel.BOT) - // || - (midLine && str.lvl != LevelComponent.MazeLevel.BOT) // ) - { - setBlock(xo + soFar + x, this.height - 2, Level.ROCK); - setBlock(xo + soFar + x, this.height - 3, Level.ROCK); - } - if // ((stretchEnd && nxt != null && nxt.lvl != - // MazeLevel.MID) - // || - (midLine && str.lvl != LevelComponent.MazeLevel.MID)// ) - { - setBlock(xo + soFar + x, this.height - 5, Level.ROCK); - setBlock(xo + soFar + x, this.height - 6, Level.ROCK); - } - if // ((stretchEnd && nxt != null && nxt.lvl != - // MazeLevel.TOP) - // || - (midLine && str.lvl != LevelComponent.MazeLevel.TOP)// ) - { - setBlock(xo + soFar + x, this.height - 8, Level.ROCK); - setBlock(xo + soFar + x, this.height - 9, Level.ROCK); - setBlock(xo + soFar + x, this.height - 10, Level.ROCK); - setBlock(xo + soFar + x, this.height - 11, Level.ROCK); - setBlock(xo + soFar + x, this.height - 12, Level.ROCK); - setBlock(xo + soFar + x, this.height - 13, Level.ROCK); - setBlock(xo + soFar + x, this.height - 14, Level.ROCK); - setBlock(xo + soFar + x, this.height - 15, Level.ROCK); - } - - if (!stretchEnd) { - setBlock(xo + soFar + x, this.height - 7, Level.ROCK); - } - - if (!stretchEnd) { - setBlock(xo + soFar + x, this.height - 4, Level.ROCK); - } - - if (addEnemy - && shouldAddChallenge(PlayerProfile.ChallengeRewardType.ENEMY)) { - - enemyType = shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? SpriteTemplate.ARMORED_TURTLE - : SpriteTemplate.RED_TURTLE) - : SpriteTemplate.GREEN_TURTLE) - : SpriteTemplate.GOOMPA; - - switch (random.nextInt(3)) { - case 0: - heightMod = 8; - break; - case 1: - heightMod = 5; - break; - default: - heightMod = 2; - } - - setSpriteTemplate(xo + soFar + x, this.height - - heightMod, new SpriteTemplate(enemyType, - false)); - ENEMIES++; - } - } - - soFar += str.len; - } - - setBlock(xo + length - 1, this.height - 1, Level.GROUND); - setBlock(xo + length - 2, this.height - 1, Level.GROUND); - setBlock(xo + length - 3, this.height - 1, Level.GROUND); - - return length; - } - return 0; - } - - private int buildPipeJump(int xo, int maxLength) { - int length = 0; - int lastHeight = 4; - int localHeight; - int midFloor; - int pipeHeight; - int gap = 0; - boolean space; - boolean deadGaps = shouldAddChallenge(PlayerProfile.ChallengeRewardType.GAP); - - int numPipes; - for (numPipes = 0; shouldAddChallenge(deadGaps ? PlayerProfile.ChallengeRewardType.GAP - : PlayerProfile.ChallengeRewardType.JUMP); numPipes++) { - } - - localHeight = 4; - loop: for (int i = 0; i < numPipes; i++) { - space = (length + 2) <= maxLength; - - if (space) { - - lastHeight = localHeight; - - pipeHeight = localHeight > 5 ? 4 + random - .nextInt(localHeight - 4) : 4; - - for (int y = height - localHeight; y < height; y++) { - - if (y == height - localHeight) { - setBlock(xo + length, y, Level.TUBE_TOP_LEFT); - setBlock(xo + length + 1, y, Level.TUBE_TOP_RIGHT); - } - - else if (y - height - localHeight < pipeHeight) { - setBlock(xo + length, y, Level.TUBE_SIDE_LEFT); - setBlock(xo + length + 1, y, Level.TUBE_SIDE_RIGHT); - } - - else { - setBlock(xo + length, y, Level.GROUND); - setBlock(xo + length + 1, y, Level.GROUND); - } - } - - if (shouldAddChallenge(PlayerProfile.ChallengeRewardType.ENEMY)) { - setSpriteTemplate(xo + length, height - localHeight, - new SpriteTemplate(SpriteTemplate.JUMP_FLOWER, - false)); - ENEMIES++; - } - - length += 2; - - localHeight = random.nextInt(7) + 4; - while (Math.abs(localHeight - lastHeight) > 3) { - localHeight += localHeight > lastHeight ? -1 : 1; - } - - midFloor = localHeight - (random.nextInt(4) + 1); - if (midFloor <= 0) { - midFloor = 1; - } - - for (gap = 0; gap <= 4 - && length + gap <= maxLength - && shouldAddChallenge(PlayerProfile.ChallengeRewardType.JUMP); gap++) { - - if (!deadGaps) { - for (int y = 0; y < midFloor; y++) { - setBlock(xo + length, this.height - 1 - y, - Level.GROUND); - } - } - length++; - } - } - - else { - break loop; - } - } - - return length; - } - - private int buildPlatformJump(int xo, int maxLength) { - int length = 0; - int gapLength; - - for (gapLength = 1; shouldAddChallenge(PlayerProfile.ChallengeRewardType.JUMP) - && gapLength < 4; gapLength++) { - } - - int maxNumPlatforms = (maxLength - 3) / (4 + gapLength); - - if (maxNumPlatforms == 0) { - return 0; - } - - int numPlatforms; - for (numPlatforms = 0; numPlatforms < maxNumPlatforms - && shouldAddChallenge(PlayerProfile.ChallengeRewardType.GAP); numPlatforms++) { - } - - if (numPlatforms > 1) { - boolean found = false; - LevelComponent.MazeLevel nextDir = LevelComponent.MazeLevel.TOP; - LevelComponent.PlatformLevel last; - LevelComponent.PlatformLevel next; - ArrayList jumps = new ArrayList(); - int heightMod = 0; - int lastHeightMod = 0; - int enemyType; - PlayerProfile.ChallengeRewardType reward; - LevelComponent.PlatformLevel hold; - - jumps.add(LevelComponent.PlatformLevel.BOT); - - for (int i = 1; i < numPlatforms; i++) { - last = jumps.get(i - 1); - found = false; - - while (!found) { - switch (random.nextInt(5)) { - case 0: - case 1: - nextDir = LevelComponent.MazeLevel.BOT; - break; - case 2: - case 3: - nextDir = LevelComponent.MazeLevel.TOP; - break; - default: - nextDir = LevelComponent.MazeLevel.MID; - } - - found = !((last == LevelComponent.PlatformLevel.TOP && nextDir == LevelComponent.MazeLevel.TOP) || (last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.BOT)); - } - - if ((last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.MID) - || (last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.BOT)) { - next = LevelComponent.PlatformLevel.BOT; - } - - else if ((last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.MID) - || (last == LevelComponent.PlatformLevel.MID_U && nextDir == LevelComponent.MazeLevel.BOT) - || (last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.TOP)) { - next = LevelComponent.PlatformLevel.MID_D; - } - - else if ((last == LevelComponent.PlatformLevel.MID_U && nextDir == LevelComponent.MazeLevel.MID) - || (last == LevelComponent.PlatformLevel.TOP && nextDir == LevelComponent.MazeLevel.BOT) - || (last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.TOP)) { - next = LevelComponent.PlatformLevel.MID_U; - } - - else // if ((last == PlatformLevel.TOP && nextDir == - // MazeLevel.MID) - // || (last == PlatformLevel.MID_U && nextDir == - // MazeLevel.TOP)) - { - next = LevelComponent.PlatformLevel.TOP; - } - - jumps.add(next); - } - - setBlock(xo, this.height - 1, Level.GROUND); - setBlock(xo + 1, this.height - 1, Level.GROUND); - setBlock(xo + 2, this.height - 1, Level.GROUND); - length = 3; - - for (int x = 0; x < jumps.size(); x++) { - if (x > 0) { - lastHeightMod = heightMod; - } - - hold = jumps.get(x); - switch (hold) { - case TOP: - heightMod = 12; - break; - case MID_U: - heightMod = 9; - break; - case MID_D: - heightMod = 6; - break; - default: - heightMod = 3; - } - - heightMod += (x > 0 && random.nextBoolean() ? random.nextInt(2) - : -1 * random.nextInt(2)); - - while (x > 0 && heightMod - lastHeightMod >= 5) { - heightMod--; - } - - setBlock(xo + length, this.height - heightMod, Level.ROCK); - setBlock(xo + length + 1, this.height - heightMod, Level.ROCK); - setBlock(xo + length + 2, this.height - heightMod, Level.ROCK); - setBlock(xo + length + 3, this.height - heightMod, Level.ROCK); - - if (shouldAddChallenge(PlayerProfile.ChallengeRewardType.ENEMY)) { - - enemyType = random.nextBoolean() ? SpriteTemplate.RED_TURTLE - : (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? SpriteTemplate.ARMORED_TURTLE - : SpriteTemplate.GREEN_TURTLE) - : SpriteTemplate.GOOMPA); - - setSpriteTemplate( - xo + length + 3, - this.height - heightMod - 1, - new SpriteTemplate( - enemyType, - (enemyType == SpriteTemplate.RED_TURTLE && shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY)) - || enemyType != SpriteTemplate.RED_TURTLE)); - ENEMIES++; - } - - reward = shouldAddReward(); - if (reward == PlayerProfile.ChallengeRewardType.COIN - && hold != LevelComponent.PlatformLevel.TOP) { - - setBlock(xo + length, this.height - heightMod - 3, - Level.COIN); - setBlock(xo + length + 1, this.height - heightMod - 3, - Level.COIN); - setBlock(xo + length + 2, this.height - heightMod - 3, - Level.COIN); - setBlock(xo + length + 3, this.height - heightMod - 3, - Level.COIN); - - COINS += 4; - } - - else if (reward == PlayerProfile.ChallengeRewardType.BLOCK - && hold != LevelComponent.PlatformLevel.TOP) { - - byte tile = random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + length + 1, this.height - heightMod - 3, tile); - - if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else { - this.BLOCKS_POWER++; - } - - tile = random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + length + 2, this.height - heightMod - 3, tile); - - if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else { - this.BLOCKS_POWER++; - } - } - - length += 4 + gapLength; - } - } - - return length; - } - - private int buildSinglePit(int xo, int maxLength) { - if (maxLength >= 13) { - int length = 13; - int floor = height - 1 - random.nextInt(4); - - for (int x = 0; x < length; x++) { - if (x != 5 && x != 6 && x != 7) { - for (int y = floor; y < height; y++) { - setBlock(xo + x, y, Level.GROUND); - } - } - - if ((x >= 2 && x <= 4) || (x >= 8 && x <= 10)) { - setBlock(xo + x, floor - 1, Level.ROCK); - - if (x == 3 || x == 4 || x == 8 || x == 9) { - setBlock(xo + x, floor - 2, Level.ROCK); - } - - if (x == 4 || x == 8) { - setBlock(xo + x, floor - 3, Level.ROCK); - } - } - } - - return length; - } - - return 0; - } - - private int buildStraight(int xo, int maxLength, boolean allowEnemies) { - int length = random.nextInt(15) + 2; - - // if (safe) - // length = 10 + random.nextInt(5); - - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - PlayerProfile.ChallengeRewardType reward = shouldAddReward(); - - // runs from the specified x position to the length of the segment - for (int x = xo; x < xo + length; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - if (shouldAddChallenge(PlayerProfile.ChallengeRewardType.ENEMY) - && allowEnemies) { - int enemyType = shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) ? (shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY) - || (reward != null && length >= 5) ? SpriteTemplate.ARMORED_TURTLE - : SpriteTemplate.CANNON_BALL) - : SpriteTemplate.RED_TURTLE) - : SpriteTemplate.GREEN_TURTLE) - : SpriteTemplate.GOOMPA; - - if (enemyType == SpriteTemplate.CANNON_BALL) { - int height = random.nextInt(4) + 1; - - if (height == 1) { - setBlock(xo + (length / 2), floor - 1, Level.CANNON_TOP); - } - - else if (height == 2) { - setBlock(xo + (length / 2), floor - 1, Level.CANNON_MIDDLE); - setBlock(xo + (length / 2), floor - 2, Level.CANNON_TOP); - } - - else if (height == 3) { - setBlock(xo + (length / 2), floor - 1, Level.CANNON_BOTTOM); - setBlock(xo + (length / 2), floor - 2, Level.CANNON_MIDDLE); - setBlock(xo + (length / 2), floor - 3, Level.CANNON_TOP); - } - - else { - setBlock(xo + (length / 2), floor - 1, Level.CANNON_BOTTOM); - setBlock(xo + (length / 2), floor - 2, Level.CANNON_BOTTOM); - setBlock(xo + (length / 2), floor - 3, Level.CANNON_MIDDLE); - setBlock(xo + (length / 2), floor - 4, Level.CANNON_TOP); - } - } - - else { - setSpriteTemplate( - xo + (length / 2), - floor - 1, - new SpriteTemplate( - enemyType, - shouldAddChallenge(PlayerProfile.ChallengeRewardType.HARDER_ENEMY))); - ENEMIES++; - } - } - - if (reward != null) { - byte tile; - if (length >= 13) { - setBlock(xo + (length - 11), floor - 3, Level.COIN); - setBlock(xo + (length - 10), floor - 4, Level.COIN); - setBlock(xo + (length - 8), floor - 5, Level.COIN); - setBlock(xo + (length - 7), floor - 5, Level.COIN); - setBlock(xo + (length - 6), floor - 5, Level.COIN); - setBlock(xo + (length - 4), floor - 4, Level.COIN); - setBlock(xo + (length - 3), floor - 3, Level.COIN); - - COINS += 7; - } - - else if (length >= 7) { - int start = length / 2; - boolean coins = (reward == PlayerProfile.ChallengeRewardType.COIN); - - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + (start - 2), floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + (start - 1), floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + start, floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + (start + 1), floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - - if (length % 2 != 0) { - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + (start + 2), floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - } - } - - else if (length >= 5) { - int start = length / 2; - boolean coins = (reward == PlayerProfile.ChallengeRewardType.COIN); - - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + (start - 1), floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + start, floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - - tile = coins ? Level.COIN - : random.nextDouble() < probability - .get(PlayerProfile.ChallengeRewardType.POWERUP) ? Level.BLOCK_POWERUP - : Level.BLOCK_COIN; - setBlock(xo + (start + 1), floor - 3, tile); - - if (coins) { - COINS++; - } - - else if (tile == Level.BLOCK_COIN) { - this.BLOCKS_COINS++; - } - - else if (tile == Level.BLOCK_POWERUP) { - this.BLOCKS_POWER++; - } - } - } - - return length; - } - - private void create(long seed, PlayerProfile profile, - LevelArchetype archetype, LevelGrammar grammar) { - - System.out - .println("PlayerProfile.getProbability(COINS): " - + profile - .getProbability(PlayerProfile.ChallengeRewardType.COIN)); - - if (dataRecorder == DataRecorder.BLANK_RECORD) { - System.out - .println("DataRecorder record is BLANK - using GamePlay metrics only."); - } - - this.type = archetype.getTypeInt(); - - lastSeed = seed; - random = new Random(seed); - int length = 0; - - if (TESTING) { - int minElements = 5; - int maxLen; - int elementsSoFar = 0; - - length = buildStraight(0, width - 64, false); - - while (length < width - 64) { - maxLen = elementsSoFar < minElements ? (width - 64 - length) - / (minElements - elementsSoFar) : width - 64 - length; - - switch (random.nextInt(9)) { - case 0: - length += buildStraight(length, maxLen, true); - break; - case 1: - length += buildFreebie(length, maxLen); - break; - case 2: - length += buildBowlingAlley(length, maxLen); - break; - case 3: - length += buildLemmingTrap(length, maxLen); - break; - case 4: - length += buildPipeJump(length, maxLen); - break; - case 5: - length += buildPlatformJump(length, maxLen); - break; - case 6: - length += buildCoinDive(length, maxLen); - break; - case 7: - length += buildCannonLine(length, maxLen); - break; - case 8: - length += buildSinglePit(length, maxLen); - break; - default: - length += buildMaze(length, maxLen); - } - - elementsSoFar++; - } - } - - else { - System.out.println("Generating level for component list: "); - LevelParseTree parseTree = grammar.generateRandomTree(seed, width); - - int MAX_REGENS = 30; - int nRegens = 0; - while (!FitnessEvaluator.isFit(parseTree, profile, archetype) - && nRegens < MAX_REGENS) { - System.out - .println("Generated level is NOT fit. Regenerating..."); - parseTree = grammar.generateRandomTree(seed, width); - nRegens++; - } - - List levelTemplate = parseTree.getLevelTemplate(); - - if (nRegens == MAX_REGENS) { - System.out.println("Failed to generate a fit level after " - + nRegens + " attempts. Proceeding with unfit level."); - } else { - System.out.println("Found fit level:"); - for (LevelComponent lc : levelTemplate) { - System.out.println(lc); - } - } - - for (LevelComponent lcomp : levelTemplate) { - LevelComponent.TYPE lctype = lcomp.getType(); - System.out.println("Building for: " + lcomp); - while (length < Math.min(width - 64, lcomp.getEnd())) { - int lcLength; - switch (lctype) { - case FLAT_LO: - case FLAT_HI: - lcLength = buildStraight(length, lcomp.getEnd(), true); - break; - case PIPE_JUMP: - lcLength = buildPipeJump(length, width - 64 - length); - break; - case PLATFORM_JUMP: - lcLength = buildPlatformJump(length, width - 64 - - length); - break; - case MAZE: - lcLength = buildMaze(length, width - 64 - length); - break; - case BLOCKS: - lcLength = buildMaze(length, width - 64 - length); - break; - case BOWLING_ALLEY: - lcLength = buildBowlingAlley(length, width - 64 - - length); - break; - case CANNON_LINE: - lcLength = buildCannonLine(length, width - 64 - length); - break; - case COIN_DIVE: - lcLength = buildCoinDive(length, width - 64 - length); - break; - case LEMMING_TRAP: - lcLength = buildLemmingTrap(length, width - 64 - length); - break; - case POWER_UP: - lcLength = buildFreebie(length, width - 64 - length); - break; - case SINGLE_PIT: - lcLength = buildSinglePit(length, width - 64 - length); - break; - default: - lcLength = 0; - System.out - .println("Cannot build level segment for unrecognized LevelComponent type: " - + type); - } - if (lcLength == 0) { - lcLength = buildStraight(length, lcomp.getEnd(), true); - } - length += lcLength; - } - } - } - - System.out.println("Total length built: " + length); - - // set the end piece - int floor = height - 1 - random.nextInt(4); - - xExit = length + 8; - yExit = floor; - - fillEndPiece(length, floor); - } - - private void fillEndPiece(int length, int floor) { - // fills the end piece - for (int x = length; x < width; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - if (type == LevelInterface.TYPE_CASTLE - || type == LevelInterface.TYPE_UNDERGROUND) { - int ceiling = 0; - int run = 0; - for (int x = 0; x < width; x++) { - if (run-- <= 0 && x > 4) { - ceiling = random.nextInt(4); - run = random.nextInt(4) + 4; - } - for (int y = 0; y < height; y++) { - if ((x > 4 && y <= ceiling) || x < 1) { - setBlock(x, y, GROUND); - } - } - } - } - - fixWalls(); - } - - private void fixWalls() { - boolean[][] blockMap = new boolean[width + 1][height + 1]; - - for (int x = 0; x < width + 1; x++) { - for (int y = 0; y < height + 1; y++) { - int blocks = 0; - for (int xx = x - 1; xx < x + 1; xx++) { - for (int yy = y - 1; yy < y + 1; yy++) { - if (getBlockCapped(xx, yy) == GROUND) { - blocks++; - } - } - } - blockMap[x][y] = blocks == 4; - } - } - blockify(this, blockMap, width + 1, height + 1); - } - - private void generateLevel(long seed, GamePlay playerMetrics) { - - PlayerProfile profile = ProfileMatcher.getMatchingProfile( - playerMetrics, dataRecorder); - System.out.println("PlayerProfile: " + profile); - - LevelArchetype archetype = ArchetypeMatcher - .getMatchingArchetype(profile); - System.out.println("LevelArchetype: " + archetype); - - System.out.println("Creating level grammar"); - LevelGrammar grammar; - try { - String grammarFileName = "grammars/overland.grm"; - grammar = LevelGrammarFactory.createGrammar(new File( - grammarFileName)); - System.out.println("Read grammar from file: " + grammarFileName); - System.out.println("==== LEVEL GRAMMAR ===="); - System.out.println(grammar); - System.out.println("======================="); - } catch (Exception ex) { - System.out - .println("Failed to parse grammar file due to exception: " - + ex.getMessage()); - System.out.println("Defaulting to basic overland grammar."); - grammar = LevelGrammarFactory.createGrammar(); - } - System.out - .println("Tuning grammar for PlayerProfile & LevelArchetype using RETE"); - GrammarTuner.tune(grammar, profile, archetype); - - System.out.println("Creating level."); - - initProbabilities(profile); - - create(seed, profile, archetype, grammar); - } - - private void initProbabilities(PlayerProfile profile) { - probability - .put(PlayerProfile.ChallengeRewardType.BLOCK, - new Double( - profile.getProbability(PlayerProfile.ChallengeRewardType.BLOCK))); - probability - .put(PlayerProfile.ChallengeRewardType.COIN, - new Double( - profile.getProbability(PlayerProfile.ChallengeRewardType.COIN))); - probability - .put(PlayerProfile.ChallengeRewardType.POWERUP, - new Double( - profile.getProbability(PlayerProfile.ChallengeRewardType.POWERUP))); - - probability - .put(PlayerProfile.ChallengeRewardType.ENEMY, - new Double( - profile.getProbability(PlayerProfile.ChallengeRewardType.ENEMY))); - probability.put(PlayerProfile.ChallengeRewardType.GAP, new Double( - profile.getProbability(PlayerProfile.ChallengeRewardType.GAP))); - probability - .put(PlayerProfile.ChallengeRewardType.HARDER_ENEMY, - new Double( - profile.getProbability(PlayerProfile.ChallengeRewardType.HARDER_ENEMY))); - probability - .put(PlayerProfile.ChallengeRewardType.JUMP, - new Double( - profile.getProbability(PlayerProfile.ChallengeRewardType.JUMP))); - } - - private boolean shouldAddChallenge(PlayerProfile.ChallengeRewardType crt) { - return random.nextDouble() <= probability.get(crt); - } - - private PlayerProfile.ChallengeRewardType shouldAddReward() { - double guess = random.nextDouble(); - - if (guess < probability.get(PlayerProfile.ChallengeRewardType.COIN)) { - return PlayerProfile.ChallengeRewardType.COIN; - } else if (guess < probability - .get(PlayerProfile.ChallengeRewardType.COIN) - + probability.get(PlayerProfile.ChallengeRewardType.BLOCK)) { - return PlayerProfile.ChallengeRewardType.BLOCK; - } else { - return null; - } - - } - -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/PlayerProfile.java b/src/dk/itu/mario/level/PlayerProfile.java deleted file mode 100644 index e97af47..0000000 --- a/src/dk/itu/mario/level/PlayerProfile.java +++ /dev/null @@ -1,151 +0,0 @@ -package dk.itu.mario.level; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import dk.itu.mario.level.matcher.ProfileMatcher.SKILL; - -public class PlayerProfile { - // From Bartle/Yee models of player psychology: achiever, killer, explorer, - // manipulator - public enum TYPE { - BUMPER, COLLECTOR, RUNNER, SHOOTER, JUMPER - } - - /* - * Certain probabilities are boosted by this constant based on the player's - * type. - */ - public static final double TYPE_MULTIPLIER = 1.25; - - public enum ChallengeRewardType { - GAP, ENEMY, HARDER_ENEMY, JUMP, COIN, BLOCK, POWERUP - }; - - // Dreyfus model of skill acquisition: - public enum SKILL_LEVEL { - NOVICE, BEGINNER, COMPETENT, PROFICIENT, EXPERT - } - - private Set enabledComponents = new HashSet(); - - private SKILL_LEVEL skillLevel; - private Map skillVector; - private TYPE type; - - public PlayerProfile(SKILL_LEVEL skillLevel, TYPE type, - Map skillVector) { - this.skillLevel = skillLevel; - this.type = type; - this.skillVector = skillVector; - for (LevelComponent.TYPE lcType : LevelComponent.TYPE.values()) { - setEnabled(lcType); - } - } - - public boolean isEnabled(LevelComponent.TYPE type) { - return enabledComponents.contains(type); - } - - public SKILL_LEVEL getSkillLevel() { - return skillLevel; - } - - public int getBumpSkill() { - return skillVector.get(SKILL.BUMP); - } - - public int getCollectSkill() { - return skillVector.get(SKILL.COLLECT); - } - - public int getJumpSkill() { - return skillVector.get(SKILL.JUMP); - } - - public int getRunSkill() { - return skillVector.get(SKILL.RUN); - } - - public int getShootSkill() { - return skillVector.get(SKILL.SHOOT); - } - - public int getStompSkill() { - return skillVector.get(SKILL.STOMP); - } - - public double getProbability(ChallengeRewardType crt) { - switch (crt) { - case GAP: - return Math.min(.5, (.5) * (skillVector.get(SKILL.JUMP) / 100.0) - * ((type == TYPE.JUMPER) ? TYPE_MULTIPLIER : 1)); - case ENEMY: - double skillSet = ((100 - skillVector.get(SKILL.RUN)) / 100.0) - * ((type == TYPE.RUNNER) ? -1 * TYPE_MULTIPLIER : 1); - skillSet += (skillVector.get(SKILL.STOMP) / 100.0); - skillSet /= 2; - return Math.min(.5, (.5) * skillSet); - case HARDER_ENEMY: - return Math.min(.5, (.5) * (skillVector.get(SKILL.SHOOT) / 100.0) - * ((type == TYPE.SHOOTER) ? TYPE_MULTIPLIER : 1)); - case JUMP: - return Math.min(.5, (.5) * (skillVector.get(SKILL.JUMP) / 100.0) - * ((type == TYPE.JUMPER) ? TYPE_MULTIPLIER : 1)); - case BLOCK: - return Math.min(.5, (.5) * (skillVector.get(SKILL.BUMP) / 100.0) - * ((type == TYPE.BUMPER) ? TYPE_MULTIPLIER : 1)); - case COIN: - return Math.min(.5, (.5) * (skillVector.get(SKILL.COLLECT) / 100.0) - * ((type == TYPE.COLLECTOR) ? TYPE_MULTIPLIER : 1)); - case POWERUP: - double skillMod = 0; - switch (skillLevel) { - case BEGINNER: - skillMod = .8; - break; - case COMPETENT: - skillMod = .6; - break; - case PROFICIENT: - skillMod = .4; - break; - case EXPERT: - skillMod = .2; - break; - default: - skillMod = 1; - } - - skillMod = (skillMod + (skillVector.get(SKILL.SHOOT) / 100.0)) / 2.0; - - return (.3) * skillMod; - default: - return 0.1; - } - } - - public TYPE getType() { - return type; - } - - public void setDisabled(LevelComponent.TYPE type) { - if (enabledComponents.contains(type)) { - System.out.println("Component type disabled: " + type); - enabledComponents.remove(type); - } - } - - public void setEnabled(LevelComponent.TYPE type) { - if (!enabledComponents.contains(type)) { - System.out.println("Component type enabled: " + type); - enabledComponents.add(type); - } - } - - @Override - public String toString() { - return skillLevel + " " + type; - } -} diff --git a/src/dk/itu/mario/level/RandomLevel.java b/src/dk/itu/mario/level/RandomLevel.java deleted file mode 100644 index 7be08c0..0000000 --- a/src/dk/itu/mario/level/RandomLevel.java +++ /dev/null @@ -1,576 +0,0 @@ -package dk.itu.mario.level; - -import java.util.Random; - -import dk.itu.mario.MarioInterface.Constraints; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.engine.sprites.SpriteTemplate; -import dk.itu.mario.engine.sprites.Enemy; - -public class RandomLevel extends Level { - // Store information about the level - public int ENEMIES = 0; // the number of enemies the level contains - public int BLOCKS_EMPTY = 0; // the number of empty blocks - public int BLOCKS_COINS = 0; // the number of coin blocks - public int BLOCKS_POWER = 0; // the number of power blocks - public int COINS = 0; // These are the coins in boxes that Mario collect - - public static long lastSeed; - - Random random; - - private static final int ODDS_STRAIGHT = 0; - private static final int ODDS_HILL_STRAIGHT = 1; - private static final int ODDS_TUBES = 2; - private static final int ODDS_JUMP = 3; - private static final int ODDS_CANNONS = 4; - - private int[] odds = new int[5]; - - private int totalOdds; - - private int difficulty; - private int type; - private int gaps; - - public RandomLevel(int width, int height) { - super(width, height); - } - - public RandomLevel(int width, int height, long seed, int difficulty, - int type) { - this(width, height); - creat(seed, difficulty, type); - } - - public void creat(long seed, int difficulty, int type) { - this.type = type; - this.difficulty = difficulty; - odds[ODDS_STRAIGHT] = 20; - odds[ODDS_HILL_STRAIGHT] = 10; - odds[ODDS_TUBES] = 2 + 1 * difficulty; - odds[ODDS_JUMP] = 2 * difficulty; - odds[ODDS_CANNONS] = -10 + 5 * difficulty; - - if (type != LevelInterface.TYPE_OVERGROUND) { - odds[ODDS_HILL_STRAIGHT] = 0; - } - - for (int i = 0; i < odds.length; i++) { - // failsafe (no negative odds) - if (odds[i] < 0) { - odds[i] = 0; - } - - totalOdds += odds[i]; - odds[i] = totalOdds - odds[i]; - } - - lastSeed = seed; - random = new Random(seed); - - // create the start location - int length = 0; - length += buildStraight(0, width, true); - - // create all of the medium sections - while (length < width - 64) { - length += buildZone(length, width - length); - } - - // set the end piece - int floor = height - 1 - random.nextInt(4); - - xExit = length + 8; - yExit = floor; - - // fills the end piece - for (int x = length; x < width; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - if (type == LevelInterface.TYPE_CASTLE - || type == LevelInterface.TYPE_UNDERGROUND) { - int ceiling = 0; - int run = 0; - for (int x = 0; x < width; x++) { - if (run-- <= 0 && x > 4) { - ceiling = random.nextInt(4); - run = random.nextInt(4) + 4; - } - for (int y = 0; y < height; y++) { - if ((x > 4 && y <= ceiling) || x < 1) { - setBlock(x, y, GROUND); - } - } - } - } - - fixWalls(); - - } - - private int buildZone(int x, int maxLength) { - int t = random.nextInt(totalOdds); - int type = 0; - - for (int i = 0; i < odds.length; i++) { - if (odds[i] <= t) { - type = i; - } - } - - switch (type) { - case ODDS_STRAIGHT: - return buildStraight(x, maxLength, false); - case ODDS_HILL_STRAIGHT: - return buildHillStraight(x, maxLength); - case ODDS_TUBES: - return buildTubes(x, maxLength); - case ODDS_JUMP: - if (gaps < Constraints.gaps) - return buildJump(x, maxLength); - else - return buildStraight(x, maxLength, false); - case ODDS_CANNONS: - return buildCannons(x, maxLength); - } - return 0; - } - - private int buildJump(int xo, int maxLength) { - gaps++; - // jl: jump length - // js: the number of blocks that are available at either side for free - int js = random.nextInt(4) + 2; - int jl = random.nextInt(2) + 2; - int length = js * 2 + jl; - - boolean hasStairs = random.nextInt(3) == 0; - - int floor = height - 1 - random.nextInt(4); - // run from the start x position, for the whole length - for (int x = xo; x < xo + length; x++) { - if (x < xo + js || x > xo + length - js - 1) { - // run for all y's since we need to paint blocks upward - for (int y = 0; y < height; y++) { // paint ground up until the - // floor - if (y >= floor) { - setBlock(x, y, GROUND); - } - // if it is above ground, start making stairs of rocks - else if (hasStairs) { // LEFT SIDE - if (x < xo + js) { // we need to max it out and level - // because it wont - // paint ground correctly unless two - // bricks are side by side - if (y >= floor - (x - xo) + 1) { - setBlock(x, y, ROCK); - } - } else { // RIGHT SIDE - if (y >= floor - ((xo + length) - x) + 2) { - setBlock(x, y, ROCK); - } - } - } - } - } - } - - return length; - } - - private int buildCannons(int xo, int maxLength) { - int length = random.nextInt(10) + 2; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - int xCannon = xo + 1 + random.nextInt(4); - for (int x = xo; x < xo + length; x++) { - if (x > xCannon) { - xCannon += 2 + random.nextInt(4); - } - if (xCannon == xo + length - 1) - xCannon += 10; - int cannonHeight = floor - random.nextInt(4) - 1; - - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } else { - if (x == xCannon && y >= cannonHeight) { - if (y == cannonHeight) { - setBlock(x, y, (byte) (14 + 0 * 16)); - } else if (y == cannonHeight + 1) { - setBlock(x, y, (byte) (14 + 1 * 16)); - } else { - setBlock(x, y, (byte) (14 + 2 * 16)); - } - } - } - } - } - - return length; - } - - private int buildHillStraight(int xo, int maxLength) { - int length = random.nextInt(10) + 10; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - for (int x = xo; x < xo + length; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - addEnemyLine(xo + 1, xo + length - 1, floor - 1); - - int h = floor; - - boolean keepGoing = true; - - boolean[] occupied = new boolean[length]; - while (keepGoing) { - h = h - 2 - random.nextInt(3); - - if (h <= 0) { - keepGoing = false; - } else { - int l = random.nextInt(5) + 3; - int xxo = random.nextInt(length - l - 2) + xo + 1; - - if (occupied[xxo - xo] || occupied[xxo - xo + l] - || occupied[xxo - xo - 1] || occupied[xxo - xo + l + 1]) { - keepGoing = false; - } else { - occupied[xxo - xo] = true; - occupied[xxo - xo + l] = true; - addEnemyLine(xxo, xxo + l, h - 1); - if (random.nextInt(4) == 0) { - decorate(xxo - 1, xxo + l + 1, h); - keepGoing = false; - } - for (int x = xxo; x < xxo + l; x++) { - for (int y = h; y < floor; y++) { - int xx = 5; - if (x == xxo) - xx = 4; - if (x == xxo + l - 1) - xx = 6; - int yy = 9; - if (y == h) - yy = 8; - - if (getBlock(x, y) == 0) { - setBlock(x, y, (byte) (xx + yy * 16)); - } else { - if (getBlock(x, y) == HILL_TOP_LEFT) - setBlock(x, y, HILL_TOP_LEFT_IN); - if (getBlock(x, y) == HILL_TOP_RIGHT) - setBlock(x, y, HILL_TOP_RIGHT_IN); - } - } - } - } - } - } - - return length; - } - - private void addEnemyLine(int x0, int x1, int y) { - for (int x = x0; x < x1; x++) { - if (random.nextInt(35) < difficulty + 1) { - int type = random.nextInt(4); - - if (difficulty < 1) { - type = Enemy.ENEMY_GOOMBA; - } else if (difficulty < 3) { - type = random.nextInt(3); - } - - setSpriteTemplate(x, y, - new SpriteTemplate(type, - random.nextInt(35) < difficulty)); - ENEMIES++; - } - } - } - - private int buildTubes(int xo, int maxLength) { - int length = random.nextInt(10) + 5; - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - int xTube = xo + 1 + random.nextInt(4); - int tubeHeight = floor - random.nextInt(2) - 2; - for (int x = xo; x < xo + length; x++) { - if (x > xTube + 1) { - xTube += 3 + random.nextInt(4); - tubeHeight = floor - random.nextInt(2) - 2; - } - if (xTube >= xo + length - 2) - xTube += 10; - - if (x == xTube && random.nextInt(11) < difficulty + 1) { - setSpriteTemplate(x, tubeHeight, new SpriteTemplate( - Enemy.ENEMY_FLOWER, false)); - ENEMIES++; - } - - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - - } else { - if ((x == xTube || x == xTube + 1) && y >= tubeHeight) { - int xPic = 10 + x - xTube; - - if (y == tubeHeight) { - // tube top - setBlock(x, y, (byte) (xPic + 0 * 16)); - } else { - // tube side - setBlock(x, y, (byte) (xPic + 1 * 16)); - } - } - } - } - } - - return length; - } - - private int buildStraight(int xo, int maxLength, boolean safe) { - int length = random.nextInt(10) + 2; - - if (safe) - length = 10 + random.nextInt(5); - - if (length > maxLength) - length = maxLength; - - int floor = height - 1 - random.nextInt(4); - - // runs from the specified x position to the length of the segment - for (int x = xo; x < xo + length; x++) { - for (int y = 0; y < height; y++) { - if (y >= floor) { - setBlock(x, y, GROUND); - } - } - } - - if (!safe) { - if (length > 5) { - decorate(xo, xo + length, floor); - } - } - - return length; - } - - private void decorate(int xStart, int xLength, int floor) { - // if its at the very top, just return - if (floor < 1) - return; - - // boolean coins = random.nextInt(3) == 0; - boolean rocks = true; - - // add an enemy line above the box - addEnemyLine(xStart + 1, xLength - 1, floor - 1); - - int s = random.nextInt(4); - int e = random.nextInt(4); - - if (floor - 2 > 0) { - if ((xLength - 1 - e) - (xStart + 1 + s) > 1) { - for (int x = xStart + 1 + s; x < xLength - 1 - e; x++) { - setBlock(x, floor - 2, COIN); - COINS++; - } - } - } - - s = random.nextInt(4); - e = random.nextInt(4); - - // this fills the set of blocks and the hidden objects inside them - if (floor - 4 > 0) { - if ((xLength - 1 - e) - (xStart + 1 + s) > 2) { - for (int x = xStart + 1 + s; x < xLength - 1 - e; x++) { - if (rocks) { - if (x != xStart + 1 && x != xLength - 2 - && random.nextInt(3) == 0) { - if (random.nextInt(4) == 0) { - setBlock(x, floor - 4, BLOCK_POWERUP); - BLOCKS_POWER++; - } else { // the fills a block with a hidden coin - setBlock(x, floor - 4, BLOCK_COIN); - BLOCKS_COINS++; - } - } else if (random.nextInt(4) == 0) { - if (random.nextInt(4) == 0) { - setBlock(x, floor - 4, (byte) (2 + 1 * 16)); - } else { - setBlock(x, floor - 4, (byte) (1 + 1 * 16)); - } - } else { - setBlock(x, floor - 4, BLOCK_EMPTY); - BLOCKS_EMPTY++; - } - } - } - } - } - } - - private void fixWalls() { - boolean[][] blockMap = new boolean[width + 1][height + 1]; - - for (int x = 0; x < width + 1; x++) { - for (int y = 0; y < height + 1; y++) { - int blocks = 0; - for (int xx = x - 1; xx < x + 1; xx++) { - for (int yy = y - 1; yy < y + 1; yy++) { - if (getBlockCapped(xx, yy) == GROUND) { - blocks++; - } - } - } - blockMap[x][y] = blocks == 4; - } - } - blockify(this, blockMap, width + 1, height + 1); - } - - private void blockify(Level level, boolean[][] blocks, int width, int height) { - int to = 0; - if (type == LevelInterface.TYPE_CASTLE) { - to = 4 * 2; - } else if (type == LevelInterface.TYPE_UNDERGROUND) { - to = 4 * 3; - } - - boolean[][] b = new boolean[2][2]; - - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - for (int xx = x; xx <= x + 1; xx++) { - for (int yy = y; yy <= y + 1; yy++) { - int _xx = xx; - int _yy = yy; - if (_xx < 0) - _xx = 0; - if (_yy < 0) - _yy = 0; - if (_xx > width - 1) - _xx = width - 1; - if (_yy > height - 1) - _yy = height - 1; - b[xx - x][yy - y] = blocks[_xx][_yy]; - } - } - - if (b[0][0] == b[1][0] && b[0][1] == b[1][1]) { - if (b[0][0] == b[0][1]) { - if (b[0][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else { - // KEEP OLD BLOCK! - } - } else { - if (b[0][0]) { - // down grass top? - level.setBlock(x, y, (byte) (1 + 10 * 16 + to)); - } else { - // up grass top - level.setBlock(x, y, (byte) (1 + 8 * 16 + to)); - } - } - } else if (b[0][0] == b[0][1] && b[1][0] == b[1][1]) { - if (b[0][0]) { - // right grass top - level.setBlock(x, y, (byte) (2 + 9 * 16 + to)); - } else { - // left grass top - level.setBlock(x, y, (byte) (0 + 9 * 16 + to)); - } - } else if (b[0][0] == b[1][1] && b[0][1] == b[1][0]) { - level.setBlock(x, y, (byte) (1 + 9 * 16 + to)); - } else if (b[0][0] == b[1][0]) { - if (b[0][0]) { - if (b[0][1]) { - level.setBlock(x, y, (byte) (3 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (3 + 11 * 16 + to)); - } - } else { - if (b[0][1]) { - // right up grass top - level.setBlock(x, y, (byte) (2 + 8 * 16 + to)); - } else { - // left up grass top - level.setBlock(x, y, (byte) (0 + 8 * 16 + to)); - } - } - } else if (b[0][1] == b[1][1]) { - if (b[0][1]) { - if (b[0][0]) { - // left pocket grass - level.setBlock(x, y, (byte) (3 + 9 * 16 + to)); - } else { - // right pocket grass - level.setBlock(x, y, (byte) (3 + 8 * 16 + to)); - } - } else { - if (b[0][0]) { - level.setBlock(x, y, (byte) (2 + 10 * 16 + to)); - } else { - level.setBlock(x, y, (byte) (0 + 10 * 16 + to)); - } - } - } else { - level.setBlock(x, y, (byte) (0 + 1 * 16 + to)); - } - } - } - } - - public RandomLevel clone() throws CloneNotSupportedException { - - RandomLevel clone = new RandomLevel(width, height); - - clone.xExit = xExit; - clone.yExit = yExit; - byte[][] map = getMap(); - SpriteTemplate[][] st = getSpriteTemplate(); - - for (int i = 0; i < map.length; i++) - for (int j = 0; j < map[i].length; j++) { - clone.setBlock(i, j, map[i][j]); - clone.setSpriteTemplate(i, j, st[i][j]); - } - clone.BLOCKS_COINS = BLOCKS_COINS; - clone.BLOCKS_EMPTY = BLOCKS_EMPTY; - clone.BLOCKS_POWER = BLOCKS_POWER; - clone.ENEMIES = ENEMIES; - clone.COINS = COINS; - - return clone; - - } - -} diff --git a/src/dk/itu/mario/level/generator/.DS_Store b/src/dk/itu/mario/level/generator/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/src/dk/itu/mario/level/generator/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/level/generator/CustomizedLevelGenerator.java b/src/dk/itu/mario/level/generator/CustomizedLevelGenerator.java deleted file mode 100644 index 322ba58..0000000 --- a/src/dk/itu/mario/level/generator/CustomizedLevelGenerator.java +++ /dev/null @@ -1,45 +0,0 @@ -package dk.itu.mario.level.generator; - -import java.util.Random; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelGenerator; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.level.CustomizedLevel; -import dk.itu.mario.level.Level; - -public class CustomizedLevelGenerator implements LevelGenerator { - @Override - public int generateLevelDifficulty(GamePlay playerMetrics, DataRecorder dataRecorder) { - System.out.println("Generating level difficulty based on playerMetrics, dataRecorder: 1"); - return 1; - } - - @Override - public LevelInterface generateLevel(GamePlay playerMetrics) { - System.out.println("Generating customized level"); - LevelInterface level = new CustomizedLevel(320, 15, - new Random().nextLong(), 1, 1, playerMetrics); - return level; - } - - @Override - public LevelInterface generateLevel(GamePlay playerMetrics, DataRecorder dataRecorder) { - System.out.println("Generating customized level"); - LevelInterface level = new CustomizedLevel(320, 15, - new Random().nextLong(), 1, 1, playerMetrics, dataRecorder); - return level; - } - - @Override - public LevelInterface generateLevel(String detailedInfo) { - throw new UnsupportedOperationException("Level generation from DataRecorder String not implemented."); - } - - @Override - public int generateLevelType(GamePlay playerMetrics, DataRecorder dataRecorder) { - System.out.println("Generating level type based on playerMetrics, dataRecorder: TYPE_OVERGROUND"); - return Level.TYPE_OVERGROUND; - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/generator/MyLevelGenerator.java b/src/dk/itu/mario/level/generator/MyLevelGenerator.java deleted file mode 100644 index bf39ce0..0000000 --- a/src/dk/itu/mario/level/generator/MyLevelGenerator.java +++ /dev/null @@ -1,26 +0,0 @@ -package dk.itu.mario.level.generator; - -import java.util.Random; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelGenerator; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.level.MyLevel; - -public class MyLevelGenerator extends CustomizedLevelGenerator implements - LevelGenerator { - - public LevelInterface generateLevel(GamePlay playerMetrics) { - System.out.println("Generating my level"); - LevelInterface level = new MyLevel(320, 15, new Random().nextLong(), 1, - LevelInterface.TYPE_OVERGROUND, playerMetrics); - return level; - } - - @Override - public LevelInterface generateLevel(String detailedInfo) { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/src/dk/itu/mario/level/generator/PCGLevelGenerator.java b/src/dk/itu/mario/level/generator/PCGLevelGenerator.java deleted file mode 100644 index de0cd31..0000000 --- a/src/dk/itu/mario/level/generator/PCGLevelGenerator.java +++ /dev/null @@ -1,64 +0,0 @@ -package dk.itu.mario.level.generator; - -import java.util.Random; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelGenerator; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.level.Level; -import dk.itu.mario.level.LevelArchetype; -import dk.itu.mario.level.PCGLevel; -import dk.itu.mario.level.PlayerProfile; -import dk.itu.mario.level.matcher.ArchetypeMatcher; -import dk.itu.mario.level.matcher.ProfileMatcher; - -public class PCGLevelGenerator implements - LevelGenerator { - @Override - public int generateLevelDifficulty(GamePlay playerMetrics, DataRecorder dataRecorder) { - System.out.println("Generating level difficulty based on playerMetrics, dataRecorder: 1"); - return 1; - } - - @Override - public int generateLevelType(GamePlay playerMetrics, DataRecorder dataRecorder) { - System.out.println("Generating level type based on playerMetrics, dataRecorder: TYPE_OVERGROUND"); - PlayerProfile profile = ProfileMatcher.getMatchingProfile( - playerMetrics, dataRecorder); - System.out.println("PlayerProfile: " + profile); - - LevelArchetype archetype = ArchetypeMatcher.getMatchingArchetype(profile); - switch (archetype.getType()) { - case CASTLE : - return LevelInterface.TYPE_CASTLE; - case OVERGROUND : - return LevelInterface.TYPE_OVERGROUND; - case UNDERGROUND : - return LevelInterface.TYPE_UNDERGROUND; - default : - return LevelInterface.TYPE_OVERGROUND; - } - } - - @Override - public LevelInterface generateLevel(GamePlay playerMetrics) { - System.out.println("Generating customized level"); - LevelInterface level = new PCGLevel(320, 15, - new Random().nextLong(), generateLevelDifficulty(playerMetrics,DataRecorder.BLANK_RECORD), generateLevelType(playerMetrics,DataRecorder.BLANK_RECORD), playerMetrics); - return level; - } - - @Override - public LevelInterface generateLevel(GamePlay playerMetrics, DataRecorder dataRecorder) { - System.out.println("Generating customized level"); - LevelInterface level = new PCGLevel(320, 15, - new Random().nextLong(), generateLevelDifficulty(playerMetrics,DataRecorder.BLANK_RECORD), generateLevelType(playerMetrics,dataRecorder), playerMetrics, dataRecorder); - return level; - } - - @Override - public LevelInterface generateLevel(String detailedInfo) { - throw new UnsupportedOperationException("Level generation from DataRecorder String not implemented."); - } -} diff --git a/src/dk/itu/mario/level/generator/RandomLevelGenerator.java b/src/dk/itu/mario/level/generator/RandomLevelGenerator.java deleted file mode 100644 index a420311..0000000 --- a/src/dk/itu/mario/level/generator/RandomLevelGenerator.java +++ /dev/null @@ -1,26 +0,0 @@ -package dk.itu.mario.level.generator; - -import java.util.Random; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelGenerator; -import dk.itu.mario.MarioInterface.LevelInterface; -import dk.itu.mario.level.RandomLevel; - -public class RandomLevelGenerator extends CustomizedLevelGenerator implements - LevelGenerator { - - public LevelInterface generateLevel(GamePlay playerMetrics) { - System.out.println("Generating random level"); - LevelInterface level = new RandomLevel(320, 15, - new Random().nextLong(), 1, LevelInterface.TYPE_OVERGROUND); - return level; - } - - @Override - public LevelInterface generateLevel(String detailedInfo) { - // TODO Auto-generated method stub - return null; - } - -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/grammar/AndClause.java b/src/dk/itu/mario/level/grammar/AndClause.java deleted file mode 100644 index e5903a5..0000000 --- a/src/dk/itu/mario/level/grammar/AndClause.java +++ /dev/null @@ -1,63 +0,0 @@ -package dk.itu.mario.level.grammar; - -import java.util.ArrayList; -import java.util.List; - -public class AndClause implements Clause { - List subClauses = new ArrayList(); - - public AndClause(List subClauses) { - this.subClauses.addAll(subClauses); - } - - public AndClause(Clause... subClauses) { - for (Clause clause : subClauses) { - this.subClauses.add(clause); - } - } - - @Override - public Clause makeRandomChoice() { - throw new UnsupportedOperationException(); - } - - @Override - public int getNumSubClauses() { - return subClauses.size(); - } - - @Override - public Clause getSubClause(int index) { - // TODO Auto-generated method stub - return subClauses.get(index); - } - - @Override - public boolean isChoice() { - // TODO Auto-generated method stub - return false; - } - @Override - public boolean isTerminal() { - return false; - } - @Override - public boolean isVariable() { - return false; - } - @Override - public String toString() { - if (subClauses.size() == 0) { - return "(Empty AND clause)"; - } - StringBuilder sb = new StringBuilder(); - sb.append("("); - for (int i = 0; i < subClauses.size() - 1; i ++) { - sb.append(subClauses.get(i).toString()); - sb.append(" + "); - } - sb.append(subClauses.get(subClauses.size()-1).toString()); - sb.append(")"); - return sb.toString(); - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/grammar/Clause.java b/src/dk/itu/mario/level/grammar/Clause.java deleted file mode 100644 index 54f747d..0000000 --- a/src/dk/itu/mario/level/grammar/Clause.java +++ /dev/null @@ -1,10 +0,0 @@ -package dk.itu.mario.level.grammar; - -public interface Clause { - public Clause getSubClause(int index); - public int getNumSubClauses(); - public boolean isChoice(); - public boolean isTerminal(); - public boolean isVariable(); - public Clause makeRandomChoice(); -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/grammar/LevelGrammar.java b/src/dk/itu/mario/level/grammar/LevelGrammar.java deleted file mode 100644 index f33ac48..0000000 --- a/src/dk/itu/mario/level/grammar/LevelGrammar.java +++ /dev/null @@ -1,122 +0,0 @@ -package dk.itu.mario.level.grammar; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; -import java.util.Set; -import java.util.TreeSet; - -import dk.itu.mario.level.LevelComponent; -import dk.itu.mario.level.LevelComponent.TYPE; - -public class LevelGrammar { - private Variable start; - private Map ruleMap = new HashMap(); - private Set variables = new TreeSet(); - - public void addVariable(Variable var) { - if (variables.contains(var)) { - throw new IllegalArgumentException( - "Grammar already contains variable: " + var); - } - variables.add(var); - } - - public void addProductionRule(ProductionRule rule) { - if (ruleMap.containsKey(rule.getLHS())) { - throw new IllegalArgumentException( - "Grammar already contains rule with LHS: " + rule.getLHS()); - } - ruleMap.put(rule.getLHS(), rule); - } - - public LevelParseTree generateRandomTree(long randomSeed, int width) { - System.out.println("Generating random level parameters using seed: " - + randomSeed); - Variable startRuleLHS = getStart(); - - ParseNode rootNode = new ParseNode(startRuleLHS.getType(), 1.0); - generateRecursive(rootNode, getRule(startRuleLHS).getRHS(), 1.0); - LevelParseTree parseTree = new LevelParseTree(rootNode, 0, width); - - return parseTree; - } - - private ParseNode generateRecursive(ParseNode parseNode, Clause clause, - double relativeWidth) { - if (clause.isVariable()) { - if (clause.isTerminal()) { - parseNode.addChild(new ParseNode(((Variable) clause).getType(), - relativeWidth)); - } else { - generateRecursive(parseNode, getRule((Variable) clause) - .getRHS(), relativeWidth); - } - } else { - if (clause.isChoice()) { - generateRecursive(parseNode, clause.makeRandomChoice(), - relativeWidth); - } else { - int numSubClauses = clause.getNumSubClauses(); - for (int i = 0; i < numSubClauses; i++) { - generateRecursive(parseNode, clause.getSubClause(i), - relativeWidth / numSubClauses); - } - } - } - return parseNode; - } - - public Variable getVariable(String varName) { - for (Variable var : variables) { - if (varName.equals(var.getValue())) { - return var; - } - } - return null; - } - - public ProductionRule getRule(Variable var) { - return ruleMap.get(var); - } - - public Variable getStart() { - return start; - } - - public void setStart(String startVar) { - for (Variable var : variables) { - if (startVar.equals(var.getValue())) { - start = var; - return; - } - } - } - - public void setStart(Variable start) { - this.start = start; - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("Variables:\n"); - for (Variable var : variables) { - sb.append("VAR "); - sb.append(var.getValue()); - sb.append(" = "); - sb.append(var.getType()); - sb.append("\n"); - } - sb.append("\n"); - for (Entry entry : ruleMap.entrySet()) { - //could as easily have used LHS instead of getKey().getValue() - sb.append("RULE " + entry.getKey().getValue() + " -> " + entry.getValue().getRHS()); - sb.append("\n"); - } - sb.append("\n"); - sb.append("START = " + start.getValue()); - return sb.toString(); - } -} diff --git a/src/dk/itu/mario/level/grammar/LevelGrammarFactory.java b/src/dk/itu/mario/level/grammar/LevelGrammarFactory.java deleted file mode 100644 index b39faa0..0000000 --- a/src/dk/itu/mario/level/grammar/LevelGrammarFactory.java +++ /dev/null @@ -1,189 +0,0 @@ -package dk.itu.mario.level.grammar; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; - -import dk.itu.mario.level.LevelComponent; - -public class LevelGrammarFactory { - public static LevelGrammar createGrammar(File grammarFile) throws FileNotFoundException, IOException { - FileInputStream fis = new FileInputStream(grammarFile); - LevelGrammar levelGrammar = new LevelGrammar(); - try { - InputStreamReader reader = new InputStreamReader(fis); - BufferedReader buf = new BufferedReader(reader); - String line; - while ((line = buf.readLine()) != null) { - line = line.trim(); // trim off newline/whitespace - if (line.length() == 0 || line.startsWith("#")) { - continue; - } - //System.out.println("Read: " + line); - //split on whitespace - String[] fields; - if (line.startsWith("VAR")) { - fields = line.split("\\s"); - if ("=".equals(fields[2]) && fields.length == 4) { - levelGrammar.addVariable(new Variable(fields[1],LevelComponent.TYPE.valueOf(fields[3]))); - } else { - throw new RuntimeException("Invalid VAR syntax: " + line); - } - } else if (line.startsWith("RULE")) { - fields = line.split("->"); - String ruleName = fields[0].split("\\s")[1]; - //System.out.println("Rule name: " + ruleName); - Variable lhs = levelGrammar.getVariable(ruleName); - if (lhs == null) { - throw new RuntimeException("LHS variable not found: " + ruleName); - } - Clause rhs = getClause(fields[1].trim(),levelGrammar); - levelGrammar.addProductionRule(new ProductionRule(lhs,rhs)); - } else if (line.startsWith("START")) { - fields = line.split("\\s"); - if ("=".equals(fields[1]) && fields.length == 3) { - levelGrammar.setStart(fields[2]); - } else { - throw new RuntimeException("Invalid START syntax: " + line); - } - } else { - throw new RuntimeException("Unable to parse grammar file " + grammarFile.getName() + " due to invalid line: " + line); - } - } - return levelGrammar; - } finally { - fis.close(); - } - } - - private static Clause getClause(String clause, LevelGrammar grammar) { - if (!clause.contains("|") && !clause.contains("+")) { - return grammar.getVariable(clause); - } - int lBraceIndex = clause.indexOf("{"); - boolean isOrClause = false; - int rBraceIndex = 0; - - double[] chances = {}; - - if (lBraceIndex != -1) { - isOrClause = true; - rBraceIndex = clause.indexOf("}"); - //System.out.println("Read OR-clause probabilities from: " + lBraceIndex + " to " + rBraceIndex); - String[] doubleFields = clause.substring(lBraceIndex+1,rBraceIndex).split(","); - chances = new double[doubleFields.length]; - for (int i = 0; i < doubleFields.length; i++) { - chances[i] = Double.valueOf(doubleFields[i]); - } - } - - String remainder = clause.substring(rBraceIndex); - if (remainder.startsWith("}, ")) { - remainder = remainder.substring(3); - } - List rhsClauseStrings = new ArrayList(); - if (remainder.contains("(")) { - int nextLeftIndex = -1; - do { - nextLeftIndex = remainder.indexOf("(", nextLeftIndex+1); - if (nextLeftIndex != -1) { - int nextRightIndex = remainder.indexOf(")", nextLeftIndex+1); - if (nextRightIndex == -1) { - throw new RuntimeException("Unmatched left '(' in clause"); - } - rhsClauseStrings.add(remainder.substring(nextLeftIndex+1,nextRightIndex)); - nextLeftIndex = nextRightIndex; - } - } while (nextLeftIndex != -1); - } else { - isOrClause = remainder.contains("|"); - if (isOrClause) { - for (String subclause : remainder.split("\\|")) { - rhsClauseStrings.add(subclause.trim()); - } - } else { - for (String subclause : remainder.split("\\+")) { - rhsClauseStrings.add(subclause.trim()); - } - } - } - - List rhsClauses = new ArrayList(); - - for (String subclause : rhsClauseStrings) { - rhsClauses.add(getClause(subclause,grammar)); - } - - if (isOrClause) { - return new OrClause(chances, rhsClauses); - } else { - return new AndClause(rhsClauses); - } - } - public static LevelGrammar createGrammar() { - LevelGrammar grammar = new LevelGrammar(); - - Variable v_START = new Variable("S", LevelComponent.TYPE.LEVEL); - Variable v_LAND_SEGMENT = new Variable("HALF_LVL", LevelComponent.TYPE.LEVEL_SEGMENT); - Variable v_LO_HI = new Variable("LO_HI", LevelComponent.TYPE.LO_HI); - Variable v_HI_LO = new Variable("HI_LO", LevelComponent.TYPE.HI_LO); - Variable v_LO_PATH = new Variable("LO_PATH", LevelComponent.TYPE.LO_PATH); - Variable v_HI_PATH = new Variable("HI_PATH", LevelComponent.TYPE.HI_PATH); - Variable v_lo_path = new Variable("lo_path", LevelComponent.TYPE.FLAT_LO); - Variable v_hi_path = new Variable("hi_path", LevelComponent.TYPE.FLAT_HI); - - grammar.addVariable(v_START); - grammar.addVariable(v_LAND_SEGMENT); - grammar.addVariable(v_LO_HI); - grammar.addVariable(v_HI_LO); - grammar.addVariable(v_LO_PATH); - grammar.addVariable(v_HI_PATH); - - grammar.addProductionRule(new ProductionRule(v_START,v_LAND_SEGMENT,v_LAND_SEGMENT)); - - grammar.addProductionRule( - new ProductionRule(v_LAND_SEGMENT, - new OrClause( new double[] {0.25,0.65,0.10}, - new AndClause(v_LO_HI,v_HI_LO), - v_LO_PATH, - new AndClause(v_LAND_SEGMENT,v_LAND_SEGMENT) - ) - ) - ); - - grammar.addProductionRule( - new ProductionRule(v_LO_HI, v_LO_PATH, v_HI_PATH) - ); - - grammar.addProductionRule( - new ProductionRule(v_HI_LO, v_HI_PATH, v_LO_PATH) - ); - - grammar.addProductionRule( - new ProductionRule(v_HI_PATH, - new OrClause( new double[] {0.25,0.75}, - new AndClause(v_HI_PATH,v_HI_PATH), - v_hi_path - ) - ) - ); - - grammar.addProductionRule( - new ProductionRule(v_LO_PATH, - new OrClause( new double[] {0.25,0.75}, - new AndClause(v_LO_PATH,v_LO_PATH), - v_lo_path - ) - ) - ); - - grammar.setStart(v_START); - - return grammar; - } -} diff --git a/src/dk/itu/mario/level/grammar/LevelParseTree.java b/src/dk/itu/mario/level/grammar/LevelParseTree.java deleted file mode 100644 index e062e93..0000000 --- a/src/dk/itu/mario/level/grammar/LevelParseTree.java +++ /dev/null @@ -1,52 +0,0 @@ -package dk.itu.mario.level.grammar; - -import java.util.ArrayList; -import java.util.List; - -import dk.itu.mario.level.LevelComponent; - -public class LevelParseTree { - private ParseNode root; - private int start; - private int width; - - public LevelParseTree(ParseNode root, int start, int width) { - this.root = root; - this.start = start; - this.width = width; - } - - public List getLevelTemplate() { - List levelCompList = new ArrayList(); - getComponents(root,start,width, levelCompList); - return levelCompList; - } - - /** - * Enumerate the leaf nodes (level components) in depth-first order. - * @param node - * @param start - * @param end - */ - private void getComponents(ParseNode node, int start, int end, List levelCompList) { - int numChildren = node.getNumChildren(); - if (numChildren == 0) { - LevelComponent.TYPE lcType = node.getType(); - levelCompList.add(new LevelComponent(lcType, start, end)); - } else { - int width = end - start; - int childOffset = 0; - for (int childIndex = 0; childIndex < numChildren; childIndex++) { - ParseNode childNode = node.getChild(childIndex); - int childStart = start + childOffset; - int childWidth = (int)(width * childNode.getPercentLength()); - if (childIndex > 0) { - getComponents(childNode,childStart+1,childStart + childWidth,levelCompList); - } else { // don't offset by 1 if this is the first child component. - getComponents(childNode,childStart,childStart + childWidth,levelCompList); - } - childOffset += childWidth; - } - } - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/grammar/OrClause.java b/src/dk/itu/mario/level/grammar/OrClause.java deleted file mode 100644 index ea83d8c..0000000 --- a/src/dk/itu/mario/level/grammar/OrClause.java +++ /dev/null @@ -1,84 +0,0 @@ -package dk.itu.mario.level.grammar; - -import java.util.ArrayList; -import java.util.List; - -public class OrClause implements Clause { - private double[] chances; - private List subClauses = new ArrayList(); - - public OrClause(double[] chances, List subClauses) { - if (chances.length != subClauses.size()) { - throw new IllegalArgumentException("List of probabilities does not match size of subclause list in OrClause constructor."); - } - this.chances = chances; - this.subClauses.addAll(subClauses); - } - - public OrClause(double[] chances, Clause... subClauses) { - this.chances = chances; - double chanceTotal = 0.0; - for (double chance : chances) { - chanceTotal += chance; - } - if (Math.abs(chanceTotal - 1.0) > 0.01) { - throw new IllegalArgumentException( - "Total or-clause chances must sum to 1.0."); - } - for (Clause clause : subClauses) { - this.subClauses.add(clause); - } - } - - @Override - public boolean isChoice() { - return true; - } - - @Override - public boolean isTerminal() { - return false; - } - @Override - public Clause makeRandomChoice() { - double rand = Math.random(); - for (int i = 0; i < chances.length; i++) { - if (rand < chances[i]) { - return subClauses.get(i); - } - rand -= chances[i]; - } - return subClauses.get(chances.length - 1); - } - - @Override - public int getNumSubClauses() { - return subClauses.size(); - } - - public Clause getSubClause(int index) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isVariable() { - return false; - } - - @Override - public String toString() { - if (subClauses.size() == 0) { - return "(Empty OR clause)"; - } - StringBuilder sb = new StringBuilder(); - sb.append("("); - for (int i = 0; i < subClauses.size() - 1; i ++) { - sb.append(subClauses.get(i).toString()); - sb.append(" | "); - } - sb.append(subClauses.get(subClauses.size()-1).toString()); - sb.append(")"); - - return sb.toString(); - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/grammar/ParseNode.java b/src/dk/itu/mario/level/grammar/ParseNode.java deleted file mode 100644 index 5b8a65c..0000000 --- a/src/dk/itu/mario/level/grammar/ParseNode.java +++ /dev/null @@ -1,68 +0,0 @@ -package dk.itu.mario.level.grammar; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -import dk.itu.mario.level.LevelComponent; - -public class ParseNode { - private static final DecimalFormat FORMATTER = new DecimalFormat("###.00"); - private LevelComponent.TYPE levelCompType; - private double percentLength; - private List children = new ArrayList(); - - public ParseNode(LevelComponent.TYPE levelCompType, double percentLength) { - this.levelCompType = levelCompType; - this.percentLength = percentLength; - } - - public void addChild(ParseNode child) { - children.add(child); - } - - public LevelComponent.TYPE getType() { - return levelCompType; - } - - public ParseNode getChild(int index) { - return children.get(index); - } - - public int getNumChildren() { - return children.size(); - } - - public double getPercentLength() { - return percentLength; - } - - public void setChildLengthRatios(double... childPercentLengths) { - double sumLength = 0.0; - for (double cpl : childPercentLengths) { - sumLength += cpl; - } - if (childPercentLengths.length != children.size()) { - throw new IllegalArgumentException( - "Error - number of requested child percent lengths to set does not match the number of children: " - + childPercentLengths.length - + " != " - + children.size()); - } - if (Math.abs(sumLength - 1.0) > 0.01) { - throw new IllegalArgumentException( - "Error - requested child percent lengths do not sum to 100% within an error of 1%."); - } - for (int i = 0; i < childPercentLengths.length; i++) { - children.get(i).setPercentLength(childPercentLengths[i]); - } - } - - public void setPercentLength(double percentLength) { - this.percentLength = percentLength; - } - - public String toString() { - return levelCompType + " (" + FORMATTER.format(percentLength * 100) + "%)"; - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/grammar/ProductionRule.java b/src/dk/itu/mario/level/grammar/ProductionRule.java deleted file mode 100644 index 53bac19..0000000 --- a/src/dk/itu/mario/level/grammar/ProductionRule.java +++ /dev/null @@ -1,23 +0,0 @@ -package dk.itu.mario.level.grammar; - -public class ProductionRule { - private Variable lhs; - private Clause rhs; - - public ProductionRule(Variable lhs, Clause... rhs) { - this.lhs = lhs; - if (rhs.length == 1) { - this.rhs = rhs[0]; - } else { - this.rhs = new AndClause(rhs); - } - } - - public Variable getLHS() { - return lhs; - } - - public Clause getRHS() { - return rhs; - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/grammar/Variable.java b/src/dk/itu/mario/level/grammar/Variable.java deleted file mode 100644 index ebc3551..0000000 --- a/src/dk/itu/mario/level/grammar/Variable.java +++ /dev/null @@ -1,62 +0,0 @@ -package dk.itu.mario.level.grammar; - -import dk.itu.mario.level.LevelComponent; - -public class Variable implements Clause, Comparable { - private boolean terminal; - private LevelComponent.TYPE type; - private String value; - - public Variable(String value, LevelComponent.TYPE type) { - this.value = value; - this.terminal = (value.toLowerCase().equals(value)); - this.type = type; - } - - public LevelComponent.TYPE getType() { - return type; - } - - public String getValue() { - return value; - } - - public boolean isTerminal() { - return terminal; - } - - @Override - public String toString() { - return value; - } - - @Override - public int compareTo(Variable o) { - return this.value.compareTo(o.value); - } - - @Override - public Clause getSubClause(int index) { - throw new UnsupportedOperationException(); - } - - @Override - public int getNumSubClauses() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isChoice() { - return false; - } - - @Override - public Clause makeRandomChoice() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isVariable() { - return true; - } -} \ No newline at end of file diff --git a/src/dk/itu/mario/level/matcher/ArchetypeMatcher.java b/src/dk/itu/mario/level/matcher/ArchetypeMatcher.java deleted file mode 100644 index a597c4f..0000000 --- a/src/dk/itu/mario/level/matcher/ArchetypeMatcher.java +++ /dev/null @@ -1,48 +0,0 @@ -package dk.itu.mario.level.matcher; - -import dk.itu.mario.level.LevelArchetype; -import dk.itu.mario.level.LevelArchetype.TYPE; -import dk.itu.mario.level.PlayerProfile; - -public class ArchetypeMatcher { - public static LevelArchetype getMatchingArchetype( - PlayerProfile playerProfile) { - System.out - .println("Selecting PlayerProfile based on GamePlay metrics, DataRecorder logs."); - - TYPE levelType; - int primarySkill; - - switch (playerProfile.getType()) { - case BUMPER: - levelType = TYPE.OVERGROUND; - primarySkill = (int) Math - .round(playerProfile.getBumpSkill() / 10.0); - break; - case COLLECTOR: - levelType = TYPE.UNDERGROUND; - primarySkill = (int) Math - .round(playerProfile.getCollectSkill() / 10.0); - break; - case JUMPER: - levelType = TYPE.CASTLE; - primarySkill = (int) Math - .round(playerProfile.getJumpSkill() / 10.0); - break; - case RUNNER: - levelType = TYPE.OVERGROUND; - primarySkill = (int) Math.round(playerProfile.getRunSkill() / 10.0); - break; - case SHOOTER: - levelType = TYPE.UNDERGROUND; - primarySkill = (int) Math - .round(playerProfile.getShootSkill() / 10.0); - break; - default: - levelType = TYPE.CASTLE; - primarySkill = 1; - } - - return new LevelArchetype(levelType, Math.max(primarySkill,1)); - } -} diff --git a/src/dk/itu/mario/level/matcher/ProfileMatcher.java b/src/dk/itu/mario/level/matcher/ProfileMatcher.java deleted file mode 100644 index 5bcfc4f..0000000 --- a/src/dk/itu/mario/level/matcher/ProfileMatcher.java +++ /dev/null @@ -1,350 +0,0 @@ -package dk.itu.mario.level.matcher; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.level.PlayerProfile; -import dk.itu.mario.level.PlayerProfile.SKILL_LEVEL; -import dk.itu.mario.level.PlayerProfile.TYPE; - -public class ProfileMatcher { - public enum SKILL { - BUMP, COLLECT, JUMP, RUN, SHOOT, STOMP - } - - private static Map> referenceMetrics = new HashMap>(); - - static { - Map canonicalVector = new HashMap(); - canonicalVector.put(SKILL.BUMP, 100); - canonicalVector.put(SKILL.COLLECT, 50); - canonicalVector.put(SKILL.JUMP, 50); - canonicalVector.put(SKILL.RUN, 0); - canonicalVector.put(SKILL.SHOOT, 0); - canonicalVector.put(SKILL.STOMP, 0); - referenceMetrics.put(PlayerProfile.TYPE.BUMPER, canonicalVector); - - canonicalVector = new HashMap(); - canonicalVector.put(SKILL.BUMP, 50); - canonicalVector.put(SKILL.COLLECT, 100); - canonicalVector.put(SKILL.JUMP, 50); - canonicalVector.put(SKILL.RUN, 0); - canonicalVector.put(SKILL.SHOOT, 0); - canonicalVector.put(SKILL.STOMP, 0); - referenceMetrics.put(PlayerProfile.TYPE.COLLECTOR, canonicalVector); - - canonicalVector = new HashMap(); - canonicalVector.put(SKILL.BUMP, 50); - canonicalVector.put(SKILL.COLLECT, 0); - canonicalVector.put(SKILL.JUMP, 100); - canonicalVector.put(SKILL.RUN, 25); - canonicalVector.put(SKILL.SHOOT, 0); - canonicalVector.put(SKILL.STOMP, 0); - referenceMetrics.put(PlayerProfile.TYPE.JUMPER, canonicalVector); - - canonicalVector = new HashMap(); - canonicalVector.put(SKILL.BUMP, 0); - canonicalVector.put(SKILL.COLLECT, 0); - canonicalVector.put(SKILL.JUMP, 25); - canonicalVector.put(SKILL.RUN, 100); - canonicalVector.put(SKILL.SHOOT, 25); - canonicalVector.put(SKILL.STOMP, 0); - referenceMetrics.put(PlayerProfile.TYPE.RUNNER, canonicalVector); - - canonicalVector = new HashMap(); - canonicalVector.put(SKILL.BUMP, 0); - canonicalVector.put(SKILL.COLLECT, 0); - canonicalVector.put(SKILL.JUMP, 25); - canonicalVector.put(SKILL.RUN, 50); - canonicalVector.put(SKILL.SHOOT, 100); - canonicalVector.put(SKILL.STOMP, 0); - referenceMetrics.put(PlayerProfile.TYPE.SHOOTER, canonicalVector); - } - - public static PlayerProfile getMatchingProfile(GamePlay playerMetrics, - DataRecorder detailedInfo) { - System.out - .println("Selecting PlayerProfile based on GamePlay metrics, DataRecorder logs."); - // GAP comes from jump skill and jumper type. - // ENEMY comes from run skill and runner type and stomp skill. - // HARDER_ENEMY comes from shooting skill and shooting type. - // JUMP comes from jump skill and jumper type. - // BLOCK comes from bump skill and bumper type. - // COIN comes from collect skill and collector type. - // POWERUP comes from rote skill level. - - SKILL_LEVEL skillLevel = null; - TYPE type = null; - HashMap skillVector = new HashMap(); - - if (playerMetrics.isDefault) { - skillLevel = SKILL_LEVEL.BEGINNER; - type = TYPE.RUNNER; - - skillVector.put(SKILL.BUMP, new Integer(25)); - skillVector.put(SKILL.COLLECT, new Integer(25)); - skillVector.put(SKILL.JUMP, new Integer(25)); - skillVector.put(SKILL.RUN, new Integer(25)); - skillVector.put(SKILL.SHOOT, new Integer(25)); - skillVector.put(SKILL.STOMP, new Integer(25)); - - PlayerProfile ret = new PlayerProfile(skillLevel, type, skillVector); - return ret; - } - - int skillHolder; - - // Get bump skills. - // Relevant to: BLOCK. - skillHolder = (int) (100 * ((playerMetrics.percentageEmptyBlockesDestroyed - + playerMetrics.percentageCoinBlocksDestroyed + playerMetrics.percentagePowerBlockDestroyed) / 3)); - skillVector.put(SKILL.BUMP, new Integer(skillHolder)); - - // Get collect skills. - // Relevant to: COIN. - skillHolder = (int) (100 * (((((double) playerMetrics.coinsCollected) / playerMetrics.totalCoins) + playerMetrics.percentageCoinBlocksDestroyed) / 2)); - skillVector.put(SKILL.COLLECT, new Integer(skillHolder)); - - // Get jump skills. - // Relevant to: GAP, JUMP. - // A high percentage of your kills were by stomping and a low percentage - // of your deaths were by plummeting... - - int deaths = playerMetrics.timesOfDeathByArmoredTurtle - + playerMetrics.timesOfDeathByCannonBall - + playerMetrics.timesOfDeathByChompFlower - + (int) playerMetrics.timesOfDeathByFallingIntoGap - + playerMetrics.timesOfDeathByGoomba - + playerMetrics.timesOfDeathByGreenTurtle - + playerMetrics.timesOfDeathByJumpFlower - + playerMetrics.timesOfDeathByArmoredTurtle; - int kills = playerMetrics.ArmoredTurtlesKilled - + playerMetrics.CannonBallKilled - + playerMetrics.ChompFlowersKilled - + playerMetrics.GoombasKilled - + playerMetrics.GreenTurtlesKilled - + playerMetrics.JumpFlowersKilled - + playerMetrics.RedTurtlesKilled; - skillHolder = (int) (100 * (((1 - ((playerMetrics.aimlessJumps / playerMetrics.jumpsNumber))) - + ((kills - playerMetrics.enemyKillByFire - playerMetrics.enemyKillByKickingShell) / (double) kills) + (1 - (playerMetrics.timesOfDeathByFallingIntoGap / deaths))) / 3)); - skillVector.put(SKILL.JUMP, new Integer(skillHolder)); - - // Get run skills. - // Relevant to: ENEMY. - skillHolder = (int) (100 * ((((double) playerMetrics.timeSpentRunning) - / playerMetrics.totalTime + (playerMetrics.timesPressedRun / 75 > 1 ? 0 - : 1 - (playerMetrics.timesPressedRun / 200))) / 2)); - skillVector.put(SKILL.RUN, new Integer(skillHolder)); - - // Get shoot skills. - skillHolder = (int) (100 * (((((double) playerMetrics.totalTimeFireMode) / playerMetrics.totalTime) + (((double) playerMetrics.enemyKillByFire) / kills)) / 2)); - skillVector.put(SKILL.SHOOT, new Integer(skillHolder)); - - // Get stomp skills. - // ((kills - playerMetrics.enemyKillByFire - - // playerMetrics.enemyKillByKickingShell) / (double) kills) - // playerMetrics.aimlessJumps. - skillHolder = (int) (100 * ((kills - playerMetrics.enemyKillByFire - playerMetrics.enemyKillByKickingShell) / (double) kills)); - skillVector.put(SKILL.STOMP, new Integer(skillHolder)); - - // Determine type. - skillHolder = skillVector.get(SKILL.BUMP).intValue(); - type = TYPE.BUMPER; - - if (skillHolder < skillVector.get(SKILL.COLLECT).intValue()) { - skillHolder = skillVector.get(SKILL.COLLECT).intValue(); - type = TYPE.COLLECTOR; - } - - if (skillHolder < skillVector.get(SKILL.JUMP).intValue()) { - skillHolder = skillVector.get(SKILL.JUMP).intValue(); - type = TYPE.JUMPER; - } - - if (skillHolder < skillVector.get(SKILL.RUN).intValue()) { - skillHolder = skillVector.get(SKILL.RUN).intValue(); - type = TYPE.RUNNER; - } - - if (skillHolder < skillVector.get(SKILL.SHOOT).intValue()) { - skillHolder = skillVector.get(SKILL.SHOOT).intValue(); - type = TYPE.SHOOTER; - } - - if (skillHolder < skillVector.get(SKILL.STOMP).intValue()) { - type = TYPE.JUMPER; - } - - // Determine rote level. - skillHolder = 0; - Entry hold; - for (Iterator> i = skillVector.entrySet() - .iterator(); i.hasNext();) { - hold = i.next(); - if (hold.getValue().intValue() > 100) { - skillVector.put(hold.getKey(), 100); - } else if (hold.getValue().intValue() > 0) { - skillVector.put(hold.getKey(), 0); - } - - skillHolder += skillVector.get(hold.getKey()).intValue(); - } - - skillHolder /= skillVector.size(); - - skillHolder = (skillHolder + ((int) (100 * ((double) playerMetrics.timesSwichingPower / (playerMetrics.totalpowerBlocks * 2))))) / 2; - - double timeWeight = (playerMetrics.completionTime / 200); - - timeWeight = (timeWeight <= 0) ? .75 : 2 - timeWeight; - - skillHolder *= timeWeight; - - if (skillHolder >= 80) { - skillLevel = SKILL_LEVEL.EXPERT; - } - - else if (skillHolder >= 60) { - skillLevel = SKILL_LEVEL.PROFICIENT; - } - - else if (skillHolder >= 40) { - skillLevel = SKILL_LEVEL.COMPETENT; - } - - else if (skillHolder >= 20) { - skillLevel = SKILL_LEVEL.BEGINNER; - } - - else { - skillLevel = SKILL_LEVEL.NOVICE; - } - - return new PlayerProfile(skillLevel, type, skillVector); - - // None of this is wrong necessarily. I just want to try some other - // stuff. - // int bumperScore = 0; - // int collectorScore = 0; - // int jumperScore = 0; - // int runnerScore = 0; - // int shooterScore = 0; - // int stomperScore = 0; - // - // bumperScore += playerMetrics.percentageBlocksDestroyed * 20; - // bumperScore += playerMetrics.percentageCoinBlocksDestroyed * 20; - // bumperScore += playerMetrics.percentageEmptyBlockesDestroyed * 20; - // bumperScore += playerMetrics.percentagePowerBlockDestroyed * 20; - // bumperScore += 4 * Math.min(5, playerMetrics.kickedShells); - // - // collectorScore += playerMetrics.coinsCollected / 35.0; - // - // jumperScore = Math.min(100, playerMetrics.jumpsNumber); - // - // runnerScore = playerMetrics.timeRunningRight / - // playerMetrics.totalTime; - // - // shooterScore += 10 * Math.min(10, playerMetrics.enemyKillByFire / - // 10.0); - // - // stomperScore += Math - // .min(100, - // 2 * (playerMetrics.GoombasKilled - // + playerMetrics.GreenTurtlesKilled + - // playerMetrics.RedTurtlesKilled)); - // - // clampToPercentRange(bumperScore); - // clampToPercentRange(collectorScore); - // clampToPercentRange(jumperScore); - // clampToPercentRange(runnerScore); - // clampToPercentRange(shooterScore); - // clampToPercentRange(stomperScore); - // - // System.out.println("bumperScore: " + bumperScore); - // System.out.println("collectorScore: " + collectorScore); - // System.out.println("jumperScore: " + jumperScore); - // System.out.println("shooterScore: " + shooterScore); - // System.out.println("stomperScore: " + stomperScore); - // - // Map playerProfileVector = new HashMap(); - // playerProfileVector.put(SKILL.BUMP, bumperScore); - // playerProfileVector.put(SKILL.COLLECT, collectorScore); - // playerProfileVector.put(SKILL.JUMP, jumperScore); - // playerProfileVector.put(SKILL.RUN, runnerScore); - // playerProfileVector.put(SKILL.SHOOT, shooterScore); - // playerProfileVector.put(SKILL.STOMP, stomperScore); - // - // double minDist = Double.MAX_VALUE; - // PlayerProfile.TYPE closestMatch = PlayerProfile.TYPE.RUNNER; - // - // for (PlayerProfile.TYPE type : PlayerProfile.TYPE.values()) { - // Map canonicalVector = ProfileMatcher.referenceMetrics - // .get(type); - // double distance = 0.0; - // for (SKILL skill : SKILL.values()) { - // distance += Math.pow(canonicalVector.get(skill) - // - playerProfileVector.get(skill), 2); - // } - // if (distance < minDist) { - // minDist = distance; - // closestMatch = type; - // } - // } - // - // SKILL_LEVEL skillLevel; - // - // int keyScore = getKeyScore(playerProfileVector, closestMatch); - // - // if (keyScore <= 20) { - // skillLevel = SKILL_LEVEL.NOVICE; - // } else if (keyScore <= 40) { - // skillLevel = SKILL_LEVEL.BEGINNER; - // } else if (keyScore <= 60) { - // skillLevel = SKILL_LEVEL.COMPETENT; - // } else if (keyScore <= 80) { - // skillLevel = SKILL_LEVEL.PROFICIENT; - // } else { - // skillLevel = SKILL_LEVEL.EXPERT; - // } - // - // System.out.println("Skill level for this " + closestMatch + " is " - // + skillLevel + " (based on a score of " + keyScore - // + " out of 100.)"); - // - // return new PlayerProfile(skillLevel, closestMatch, - // playerProfileVector); - } - - private static int getKeyScore(Map playerProfileVector, - PlayerProfile.TYPE playerProfileType) { - switch (playerProfileType) { - case BUMPER: - return playerProfileVector.get(SKILL.BUMP); - case COLLECTOR: - return playerProfileVector.get(SKILL.COLLECT); - case JUMPER: - return playerProfileVector.get(SKILL.JUMP); - case RUNNER: - return playerProfileVector.get(SKILL.RUN); - case SHOOTER: - return playerProfileVector.get(SKILL.SHOOT); - default: - return 0; - } - } - - private static int clampToPercentRange(int value) { - if (value < 0) { - return 0; - } else if (value > 100) { - return 100; - } else { - return value; - } - } -} diff --git a/src/dk/itu/mario/scene/.DS_Store b/src/dk/itu/mario/scene/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/src/dk/itu/mario/scene/.DS_Store and /dev/null differ diff --git a/src/dk/itu/mario/scene/LevelScene.java b/src/dk/itu/mario/scene/LevelScene.java deleted file mode 100644 index 6c512de..0000000 --- a/src/dk/itu/mario/scene/LevelScene.java +++ /dev/null @@ -1,601 +0,0 @@ -package dk.itu.mario.scene; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.GraphicsConfiguration; -import java.awt.Image; -import java.awt.event.MouseEvent; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -import dk.itu.mario.engine.Art; -import dk.itu.mario.engine.BgRenderer; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.engine.LevelRenderer; -import dk.itu.mario.engine.MarioComponent; -import dk.itu.mario.engine.sonar.FixedSoundSource; -import dk.itu.mario.engine.sprites.BulletBill; -import dk.itu.mario.engine.sprites.CoinAnim; -import dk.itu.mario.engine.sprites.FireFlower; -import dk.itu.mario.engine.sprites.Fireball; -import dk.itu.mario.engine.sprites.Mario; -import dk.itu.mario.engine.sprites.Mushroom; -import dk.itu.mario.engine.sprites.Particle; -import dk.itu.mario.engine.sprites.Shell; -import dk.itu.mario.engine.sprites.Sparkle; -import dk.itu.mario.engine.sprites.Sprite; -import dk.itu.mario.engine.sprites.SpriteContext; -import dk.itu.mario.engine.sprites.SpriteTemplate; -import dk.itu.mario.level.Level; - -public class LevelScene extends Scene implements SpriteContext { - protected List sprites = new ArrayList(); - protected List spritesToAdd = new ArrayList(); - protected List spritesToRemove = new ArrayList(); - - public Level level; - public Mario mario; - public float xCam, yCam, xCamO, yCamO; - public static Image tmpImage; - protected int tick; - - protected LevelRenderer layer; - protected BgRenderer[] bgLayer = new BgRenderer[2]; - protected Level currentLevel; - protected GraphicsConfiguration graphicsConfiguration; - - public boolean paused = false; - public int startTime = 0; - public int timeLeft; - - protected long levelSeed; - protected MarioComponent marioComponent; - //protected int levelType; - //protected int levelDifficulty; - - public static DataRecorder recorder; - - public boolean gameStarted; - - public static boolean bothPlayed = false; - - private int[] xPositionsArrow; - private int[] yPositionsArrow; - private int widthArrow, heightArrow, tipWidthArrow; - private int xArrow, yArrow; - - public LevelScene(GraphicsConfiguration graphicsConfiguration, - MarioComponent renderer, long seed/*, int levelDifficulty, int type*/) { - this.graphicsConfiguration = graphicsConfiguration; - this.levelSeed = seed; - this.marioComponent = renderer; - //this.levelDifficulty = levelDifficulty; - //this.levelType = type; - - widthArrow = 25; - tipWidthArrow = 10; - heightArrow = 20; - - xArrow = 160; - yArrow = 40; - - xPositionsArrow = new int[] { xArrow + -widthArrow / 2, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + widthArrow / 2, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + -widthArrow / 2 }; - yPositionsArrow = new int[] { yArrow + -heightArrow / 4, - yArrow + -heightArrow / 4, yArrow + -heightArrow / 2, - yArrow + 0, yArrow + heightArrow / 2, yArrow + heightArrow / 4, - yArrow + heightArrow / 4 }; - } - - public void init() { - - } - - public int fireballsOnScreen = 0; - - List shellsToCheck = new ArrayList(); - - public void checkShellCollide(Shell shell) { - shellsToCheck.add(shell); - } - - List fireballsToCheck = new ArrayList(); - - public void checkFireballCollide(Fireball fireball) { - fireballsToCheck.add(fireball); - } - - public void tick() { - timeLeft--; - - if (widthArrow < 0) { - widthArrow *= -1; - tipWidthArrow *= -1; - - xPositionsArrow = new int[] { xArrow + -widthArrow / 2, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + widthArrow / 2, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + widthArrow / 2 - tipWidthArrow, - xArrow + -widthArrow / 2 }; - yPositionsArrow = new int[] { yArrow + -heightArrow / 4, - yArrow + -heightArrow / 4, yArrow + -heightArrow / 2, - yArrow + 0, yArrow + heightArrow / 2, - yArrow + heightArrow / 4, yArrow + heightArrow / 4 }; - - } - - if (timeLeft == 0) { - mario.dieTime(); - } - - xCamO = xCam; - yCamO = yCam; - - if (startTime > 0) { - startTime++; - } - - float targetXCam = mario.x - 160; - - xCam = targetXCam; - - if (xCam < 0) - xCam = 0; - if (xCam > level.getWidth() * 16 - 320) - xCam = level.getWidth() * 16 - 320; - - /* - * if (recorder != null) { recorder.addTick(mario.getKeyMask()); } - * - * if (replayer!=null) { mario.setKeys(replayer.nextTick()); } - */ - - fireballsOnScreen = 0; - - for (Sprite sprite : sprites) { - if (sprite != mario) { - float xd = sprite.x - xCam; - float yd = sprite.y - yCam; - if (xd < -64 || xd > 320 + 64 || yd < -64 || yd > 240 + 64) { - removeSprite(sprite); - } else { - if (sprite instanceof Fireball) { - fireballsOnScreen++; - } - } - } - } - - if (paused) { - for (Sprite sprite : sprites) { - if (sprite == mario) { - sprite.tick(); - } else { - sprite.tickNoMove(); - } - } - } else { - - tick++; - level.tick(); - - boolean hasShotCannon = false; - int xCannon = 0; - - for (int x = (int) xCam / 16 - 1; x <= (int) (xCam + layer.width) / 16 + 1; x++) - for (int y = (int) yCam / 16 - 1; y <= (int) (yCam + layer.height) / 16 + 1; y++) { - int dir = 0; - - if (x * 16 + 8 > mario.x + 16) - dir = -1; - if (x * 16 + 8 < mario.x - 16) - dir = 1; - - SpriteTemplate st = level.getSpriteTemplate(x, y); - - if (st != null) { - if (st.lastVisibleTick != tick - 1) { - if (st.sprite == null - || !sprites.contains(st.sprite)) { - st.spawn(this, x, y, dir); - - } - } - - st.lastVisibleTick = tick; - } - - if (dir != 0) { - byte b = level.getBlock(x, y); - if (((Level.TILE_BEHAVIORS[b & 0xff]) & Level.BIT_ANIMATED) > 0) { - if ((b % 16) / 4 == 3 && b / 16 == 0) { - if ((tick - x * 2) % 100 == 0) { - xCannon = x; - for (int i = 0; i < 8; i++) { - addSprite(new Sparkle(x * 16 + 8, y - * 16 - + (int) (Math.random() * 16), - (float) Math.random() * dir, 0, - 0, 1, 5)); - } - addSprite(new BulletBill(this, x * 16 + 8 - + dir * 8, y * 16 + 15, dir)); - hasShotCannon = true; - } - } - } - } - } - - if (hasShotCannon) { - sound.play(Art.samples[Art.SAMPLE_CANNON_FIRE], - new FixedSoundSource(xCannon * 16, yCam + 120), 1, 1, 1); - } - - for (Sprite sprite : sprites) { - sprite.tick(); - } - - for (Sprite sprite : sprites) { - sprite.collideCheck(); - } - - for (Shell shell : shellsToCheck) { - for (Sprite sprite : sprites) { - if (sprite != shell && !shell.dead) { - if (sprite.shellCollideCheck(shell)) { - if (mario.carried == shell && !shell.dead) { - mario.carried = null; - shell.die(); - } - } - } - } - } - shellsToCheck.clear(); - - for (Fireball fireball : fireballsToCheck) { - for (Sprite sprite : sprites) { - if (sprite != fireball && !fireball.dead) { - if (sprite.fireballCollideCheck(fireball)) { - fireball.die(); - } - } - } - } - fireballsToCheck.clear(); - } - - sprites.addAll(0, spritesToAdd); - sprites.removeAll(spritesToRemove); - spritesToAdd.clear(); - spritesToRemove.clear(); - } - - private DecimalFormat df = new DecimalFormat("00"); - private DecimalFormat df2 = new DecimalFormat("000"); - - public void render(Graphics g, float alpha) { - int xCam = (int) (mario.xOld + (mario.x - mario.xOld) * alpha) - 160; - int yCam = (int) (mario.yOld + (mario.y - mario.yOld) * alpha) - 120; - - if (xCam < 0) - xCam = 0; - if (yCam < 0) - yCam = 0; - if (xCam > level.getWidth() * 16 - 320) - xCam = level.getWidth() * 16 - 320; - if (yCam > level.getHeight() * 16 - 240) - yCam = level.getHeight() * 16 - 240; - - // g.drawImage(Art.background, 0, 0, null); - - for (int i = 0; i < 2; i++) { - bgLayer[i].setCam(xCam, yCam); - bgLayer[i].render(g, tick, alpha); - } - - g.translate(-xCam, -yCam); - for (Sprite sprite : sprites) { - if (sprite.layer == 0) - sprite.render(g, alpha); - } - g.translate(xCam, yCam); - - // //////////THIS RENDERS THE LEVEL - layer.setCam(xCam, yCam); - layer.render(g, tick, paused ? 0 : alpha); - layer.renderExit0(g, tick, paused ? 0 : alpha, mario.winTime == 0); - // //////////END OF LEVEL RENDER - - // //////////RENDERS SPRITES - g.translate(-xCam, -yCam); - for (Sprite sprite : sprites) { - if (sprite.layer == 1) - sprite.render(g, alpha); - } - g.translate(xCam, yCam); - g.setColor(Color.BLACK); - layer.renderExit1(g, tick, paused ? 0 : alpha); - // //////////END OF SPRITE RENDERING - - drawStringDropShadow(g, "MARIO " + df.format(Mario.lives), 0, 0, 7); - // drawStringDropShadow(g, "00000000", 0, 1, 7); - - drawStringDropShadow(g, "COIN", 14, 0, 7); - drawStringDropShadow(g, " " + df.format(Mario.coins), 14, 1, 7); - - drawStringDropShadow(g, "WORLD", 24, 0, 7); - drawStringDropShadow(g, " " + Mario.levelString, 24, 1, 7); - - drawStringDropShadow(g, "TIME", 35, 0, 7); - int time = (timeLeft + 15 - 1) / 15; - if (time < 0) - time = 0; - drawStringDropShadow(g, " " + df2.format(time), 35, 1, 7); - - renderDirectionArrow(g); - - if (startTime > 0) { - float t = startTime + alpha - 2; - t = t * t * 0.6f; - renderBlackout(g, 160, 120, (int) (t)); - } - // mario.x>level.xExit*16 - if (mario.winTime > 0) { - float t = mario.winTime + alpha; - t = t * t * 0.2f; - - if (t > 0) { - if (recorder != null) { - recorder.stopRecord(); - recorder.levelWon(); - // recorder.printAll(); - } - - } - - if (t > 900) { - - winActions(); - return; - - // replayer = new Replayer(recorder.getBytes()); - // init(); - } - - renderBlackout(g, (int) (mario.xDeathPos - xCam), - (int) (mario.yDeathPos - yCam), (int) (320 - t)); - } - - if (mario.deathTime > 0) { - g.setColor(Color.BLACK); - float t = mario.deathTime + alpha; - t = t * t * 0.4f; - - if (t > 0 && Mario.lives <= 0) { - if (recorder != null) { - recorder.stopRecord(); - } - } - - if (t > 1800) { - Mario.lives--; - deathActions(); - } - - renderBlackout(g, (int) (mario.xDeathPos - xCam), - (int) (mario.yDeathPos - yCam), (int) (320 - t)); - } - } - - public void winActions() { - - } - - public void deathActions() { - - } - - protected void reset() { - paused = false; - Sprite.spriteContext = this; - sprites.clear(); - - try { - level = currentLevel.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - level.resetSpriteTemplate(); - - layer = new LevelRenderer(level, graphicsConfiguration, 320, 240); - - mario = new Mario(this); - sprites.add(mario); - startTime = 1; - - timeLeft = 200 * 15; - Art.startMusic(1); - tick = 0; - - if (recorder != null) { - recorder.detailedLog = ""; - } - gameStarted = false; - } - - private void renderDirectionArrow(Graphics g) { - if (widthArrow < 0) - g.setColor(new Color(0, 0, 255, 150)); - else - g.setColor(new Color(255, 0, 0, 150)); - - g.fillPolygon(xPositionsArrow, yPositionsArrow, - Math.min(xPositionsArrow.length, yPositionsArrow.length)); - g.setColor(new Color(0, 0, 0, 255)); - g.drawPolygon(xPositionsArrow, yPositionsArrow, - Math.min(xPositionsArrow.length, yPositionsArrow.length)); - } - - private void drawStringDropShadow(Graphics g, String text, int x, int y, - int c) { - drawString(g, text, x * 8 + 5, y * 8 + 5, 0); - drawString(g, text, x * 8 + 4, y * 8 + 4, c); - } - - private void drawString(Graphics g, String text, int x, int y, int c) { - char[] ch = text.toCharArray(); - for (int i = 0; i < ch.length; i++) { - g.drawImage(Art.font[ch[i] - 32][c], x + i * 8, y, null); - } - } - - float decrease = (float) 0.03; - float factor = 0; - boolean in = true; - String flipText = "FLIP! MOVE THE OTHER WAY!"; - - private void renderBlackout(Graphics g, int x, int y, int radius) { - if (radius > 320) - return; - - int[] xp = new int[20]; - int[] yp = new int[20]; - for (int i = 0; i < 16; i++) { - xp[i] = x + (int) (Math.cos(i * Math.PI / 15) * radius); - yp[i] = y + (int) (Math.sin(i * Math.PI / 15) * radius); - } - xp[16] = 320; - yp[16] = y; - xp[17] = 320; - yp[17] = 240; - xp[18] = 0; - yp[18] = 240; - xp[19] = 0; - yp[19] = y; - g.fillPolygon(xp, yp, xp.length); - - for (int i = 0; i < 16; i++) { - xp[i] = x - (int) (Math.cos(i * Math.PI / 15) * radius); - yp[i] = y - (int) (Math.sin(i * Math.PI / 15) * radius); - } - xp[16] = 320; - yp[16] = y; - xp[17] = 320; - yp[17] = 0; - xp[18] = 0; - yp[18] = 0; - xp[19] = 0; - yp[19] = y; - - g.fillPolygon(xp, yp, xp.length); - } - - public void addSprite(Sprite sprite) { - spritesToAdd.add(sprite); - sprite.tick(); - } - - public void removeSprite(Sprite sprite) { - spritesToRemove.add(sprite); - } - - public float getX(float alpha) { - int xCam = (int) (mario.xOld + (mario.x - mario.xOld) * alpha) - 160; - - if (xCam < 0) - xCam = 0; - - return xCam + 160; - } - - public float getY(float alpha) { - return 0; - } - - public void bump(int x, int y, boolean canBreakBricks) { - byte block = level.getBlock(x, y); - - if ((Level.TILE_BEHAVIORS[block & 0xff] & Level.BIT_BUMPABLE) > 0) { - bumpInto(x, y - 1); - level.setBlock(x, y, (byte) 4); - - if (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_SPECIAL) > 0) { - sound.play(Art.samples[Art.SAMPLE_ITEM_SPROUT], - new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1); - if (!Mario.large) { - addSprite(new Mushroom(this, x * 16 + 8, y * 16 + 8)); - } else { - addSprite(new FireFlower(this, x * 16 + 8, y * 16 + 8)); - } - - if (recorder != null) { - recorder.blockPowerDestroyRecord(); - } - } else { - if (recorder != null) { - recorder.blockCoinDestroyRecord(); - } - - Mario.getCoin(); - sound.play(Art.samples[Art.SAMPLE_GET_COIN], - new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1); - addSprite(new CoinAnim(x, y)); - } - } - - if ((Level.TILE_BEHAVIORS[block & 0xff] & Level.BIT_BREAKABLE) > 0) { - bumpInto(x, y - 1); - if (canBreakBricks) { - if (recorder != null) { - recorder.blockEmptyDestroyRecord(); - } - - sound.play(Art.samples[Art.SAMPLE_BREAK_BLOCK], - new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1); - level.setBlock(x, y, (byte) 0); - for (int xx = 0; xx < 2; xx++) - for (int yy = 0; yy < 2; yy++) - addSprite(new Particle(x * 16 + xx * 8 + 4, y * 16 + yy - * 8 + 4, (xx * 2 - 1) * 4, (yy * 2 - 1) * 4 - 8)); - } - - } - } - - public void bumpInto(int x, int y) { - byte block = level.getBlock(x, y); - if (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_PICKUPABLE) > 0) { - Mario.getCoin(); - sound.play(Art.samples[Art.SAMPLE_GET_COIN], new FixedSoundSource( - x * 16 + 8, y * 16 + 8), 1, 1, 1); - level.setBlock(x, y, (byte) 0); - addSprite(new CoinAnim(x, y + 1)); - - // TODO no idea when this happens... maybe remove coin count - if (recorder != null) - recorder.recordCoin(); - } - - for (Sprite sprite : sprites) { - sprite.bumpCheck(x, y); - } - } - - public void setLevel(Level level) { - this.level = level; - } - - @Override - public void mouseClicked(MouseEvent me) { - } -} diff --git a/src/dk/itu/mario/scene/LevelSceneCustom.java b/src/dk/itu/mario/scene/LevelSceneCustom.java deleted file mode 100644 index 8fdd030..0000000 --- a/src/dk/itu/mario/scene/LevelSceneCustom.java +++ /dev/null @@ -1,206 +0,0 @@ -package dk.itu.mario.scene; - -import java.awt.GraphicsConfiguration; -import java.io.DataInputStream; -import java.io.File; -import java.io.IOException; - -import dk.itu.mario.MarioInterface.GamePlay; -import dk.itu.mario.MarioInterface.LevelGenerator; -import dk.itu.mario.engine.Art; -import dk.itu.mario.engine.BgRenderer; -import dk.itu.mario.engine.DataRecorder; -import dk.itu.mario.engine.LevelRenderer; -import dk.itu.mario.engine.MarioComponent; -import dk.itu.mario.engine.sonar.FixedSoundSource; -import dk.itu.mario.engine.sprites.CoinAnim; -import dk.itu.mario.engine.sprites.FireFlower; -import dk.itu.mario.engine.sprites.Mario; -import dk.itu.mario.engine.sprites.Mushroom; -import dk.itu.mario.engine.sprites.Particle; -import dk.itu.mario.engine.sprites.Sprite; -import dk.itu.mario.engine.util.FileHandler; -import dk.itu.mario.level.BgLevelGenerator; -import dk.itu.mario.level.Level; -import dk.itu.mario.level.RandomLevel; - -public class LevelSceneCustom extends LevelScene { - private boolean isCustom; - private LevelGenerator clg; - - public LevelSceneCustom(GraphicsConfiguration graphicsConfiguration, - MarioComponent renderer, long seed, int levelDifficulty, int type, - boolean isCustom, LevelGenerator levelGenerator) { - super(graphicsConfiguration, renderer, seed/*, levelDifficulty, type*/); - this.isCustom = isCustom; - this.clg = levelGenerator; - } - - public void init() { - try { - Level.loadBehaviors(new DataInputStream(LevelSceneCustom.class - .getResourceAsStream("/res/tiles.dat"))); - } catch (IOException e) { - e.printStackTrace(); - System.exit(0); - } - - GamePlay gp = GamePlay.read("player.txt"); - File xmlInfoFile = new File("DetailedInfo.xml"); - DataRecorder dataRecorder; - if (xmlInfoFile.exists()) { - try { - dataRecorder = DataRecorder.fromXML(xmlInfoFile); - } catch (IOException ioe) { - System.out.println("Reading from DataRecorder failed due to: "); - ioe.printStackTrace(System.out); - System.out.println("Initializing blank record"); - dataRecorder = DataRecorder.BLANK_RECORD; - } - } else { - dataRecorder = DataRecorder.BLANK_RECORD;; - String detailedInfo = FileHandler.readFile("DetailedInfo.txt"); - System.out.println("Read detailedInfo from DetailedInfo.txt (not parsed): "); - System.out.println(detailedInfo); - } - - int levelType = clg.generateLevelType(gp,dataRecorder); - currentLevel = (Level) clg.generateLevel(gp,dataRecorder); - - try { - level = currentLevel.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - - Art.startMusic(levelType); - - paused = false; - Sprite.spriteContext = this; - sprites.clear(); - - layer = new LevelRenderer(level, graphicsConfiguration, 320, 240); - for (int i = 0; i < 2; i++) { - int scrollSpeed = 4 >> i; - int w = ((level.getWidth() * 16) - 320) / scrollSpeed + 320; - int h = ((level.getHeight() * 16) - 240) / scrollSpeed + 240; - Level bgLevel = BgLevelGenerator.createLevel(w / 32 + 1, - h / 32 + 1, i == 0, levelType); - bgLayer[i] = new BgRenderer(bgLevel, graphicsConfiguration, 320, - 240, scrollSpeed); - } - - mario = new Mario(this); - sprites.add(mario); - startTime = 1; - - timeLeft = 200 * 15; - - tick = 0; - - if (!isCustom && recorder == null) - recorder = new DataRecorder(this, (RandomLevel) level, keys); - - gameStarted = false; - } - - public void tick() { - super.tick(); - - if (recorder != null && !gameStarted) { - recorder.startLittleRecord(); - recorder.startTime(); - gameStarted = true; - } - if (recorder != null) - recorder.tickRecord(); - } - - public void winActions() { - if (recorder != null) - recorder.fillGamePlayMetrics((RandomLevel) level); - - marioComponent.win(); - } - - public void deathActions() { - if (Mario.lives <= 0) {// has no more lives - if (recorder != null) - recorder.fillGamePlayMetrics((RandomLevel) level); - marioComponent.lose(); - } else - // mario still has lives to play :)--> have a new beginning - reset(); - } - - public void bump(int x, int y, boolean canBreakBricks) { - byte block = level.getBlock(x, y); - - if ((Level.TILE_BEHAVIORS[block & 0xff] & Level.BIT_BUMPABLE) > 0) { - bumpInto(x, y - 1); - level.setBlock(x, y, (byte) 4); - - if (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_SPECIAL) > 0) { - sound.play(Art.samples[Art.SAMPLE_ITEM_SPROUT], - new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1); - if (!Mario.large) { - addSprite(new Mushroom(this, x * 16 + 8, y * 16 + 8)); - } else { - addSprite(new FireFlower(this, x * 16 + 8, y * 16 + 8)); - } - - if (recorder != null) { - recorder.blockPowerDestroyRecord(); - } - } else { - // TODO should only record hidden coins (in boxes) - if (recorder != null) { - recorder.blockCoinDestroyRecord(); - } - - Mario.getCoin(); - sound.play(Art.samples[Art.SAMPLE_GET_COIN], - new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1); - addSprite(new CoinAnim(x, y)); - } - } - - if ((Level.TILE_BEHAVIORS[block & 0xff] & Level.BIT_BREAKABLE) > 0) { - bumpInto(x, y - 1); - if (canBreakBricks) { - if (recorder != null) { - recorder.blockEmptyDestroyRecord(); - } - - sound.play(Art.samples[Art.SAMPLE_BREAK_BLOCK], - new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1); - level.setBlock(x, y, (byte) 0); - for (int xx = 0; xx < 2; xx++) - for (int yy = 0; yy < 2; yy++) - addSprite(new Particle(x * 16 + xx * 8 + 4, y * 16 + yy - * 8 + 4, (xx * 2 - 1) * 4, (yy * 2 - 1) * 4 - 8)); - } - - } - } - - public void bumpInto(int x, int y) { - byte block = level.getBlock(x, y); - if (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_PICKUPABLE) > 0) { - Mario.getCoin(); - sound.play(Art.samples[Art.SAMPLE_GET_COIN], new FixedSoundSource( - x * 16 + 8, y * 16 + 8), 1, 1, 1); - level.setBlock(x, y, (byte) 0); - addSprite(new CoinAnim(x, y + 1)); - - // TODO no idea when this happens... maybe remove coin count - if (recorder != null) - recorder.recordCoin(); - } - - for (Sprite sprite : sprites) { - sprite.bumpCheck(x, y); - } - } - -} \ No newline at end of file diff --git a/src/dk/itu/mario/scene/LoseScene.java b/src/dk/itu/mario/scene/LoseScene.java deleted file mode 100644 index 9f344fe..0000000 --- a/src/dk/itu/mario/scene/LoseScene.java +++ /dev/null @@ -1,62 +0,0 @@ -package dk.itu.mario.scene; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.event.MouseEvent; - -import dk.itu.mario.engine.Art; -import dk.itu.mario.engine.sprites.Mario; - -public class LoseScene extends Scene { - - private int tick; - private String scrollMessage = "Game over!"; - - public LoseScene() { - } - - public void init() { - } - - public void render(Graphics g, float alpha) { - g.setColor(Color.decode("#a07070")); - g.fillRect(0, 0, 320, 240); - int f = tick / 3 % 10; - if (f >= 6) - f = 10 - f; - g.drawImage(Art.gameOver[f][0], 160 - 48, 100 - 32, null); - drawString(g, scrollMessage, 160 - scrollMessage.length() * 4, 160, 0); - } - - private void drawString(Graphics g, String text, int x, int y, int c) { - char[] ch = text.toCharArray(); - for (int i = 0; i < ch.length; i++) { - g.drawImage(Art.font[ch[i] - 32][c], x + i * 8, y, null); - } - } - - private boolean wasDown = true; - - public void tick() { - tick++; - if (!wasDown && keys[Mario.KEY_JUMP]) { - // component.toTitle(); - } - if (keys[Mario.KEY_JUMP]) { - wasDown = false; - } - } - - public float getX(float alpha) { - return 0; - } - - public float getY(float alpha) { - return 0; - } - - @Override - public void mouseClicked(MouseEvent me) { - // TODO Auto-generated method stub - } -} diff --git a/src/dk/itu/mario/scene/Scene.java b/src/dk/itu/mario/scene/Scene.java deleted file mode 100644 index ac31f8c..0000000 --- a/src/dk/itu/mario/scene/Scene.java +++ /dev/null @@ -1,43 +0,0 @@ -package dk.itu.mario.scene; - -import java.awt.Graphics; -import java.awt.event.MouseEvent; - - -import dk.itu.mario.engine.sonar.SonarSoundEngine; -import dk.itu.mario.engine.sonar.SoundListener; - - -public abstract class Scene implements SoundListener -{ - public SonarSoundEngine sound; - public static boolean[] keys = new boolean[16]; - - public static final int COLOR_BLACK = 0; - public static final int COLOR_RED = 1; - public static final int COLOR_GREEN = 2; - public static final int COLOR_BLUE = 3; - public static final int COLOR_YELLOW = 4; - public static final int COLOR_PURPLE = 5; - public static final int COLOR_LIGHTBLUE = 6; - public static final int COLOR_WHITE = 7; - - public void toggleKey(int key, boolean isPressed) - { - keys[key] = isPressed; - } - - public final void setSound(SonarSoundEngine sound) - { - sound.setListener(this); - this.sound = sound; - } - - public abstract void mouseClicked(MouseEvent me); - - public abstract void init(); - - public abstract void tick(); - - public abstract void render(Graphics og, float alpha); -} \ No newline at end of file diff --git a/src/dk/itu/mario/scene/WinScene.java b/src/dk/itu/mario/scene/WinScene.java deleted file mode 100644 index 7649460..0000000 --- a/src/dk/itu/mario/scene/WinScene.java +++ /dev/null @@ -1,58 +0,0 @@ -package dk.itu.mario.scene; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.event.MouseEvent; - -import dk.itu.mario.engine.Art; -import dk.itu.mario.engine.sprites.Mario; - -public class WinScene extends Scene { - private int tick; - private String scrollMessage = "Thank you for saving me, Mario!"; - - public WinScene() { - } - - public void init() { - } - - public void render(Graphics g, float alpha) { - g.setColor(Color.decode("#8080a0")); - g.fillRect(0, 0, 320, 240); - g.drawImage(Art.endScene[tick / 24 % 2][0], 160 - 48, 100 - 48, null); - drawString(g, scrollMessage, 160 - scrollMessage.length() * 4, 160, 0); - } - - private void drawString(Graphics g, String text, int x, int y, int c) { - char[] ch = text.toCharArray(); - for (int i = 0; i < ch.length; i++) { - g.drawImage(Art.font[ch[i] - 32][c], x + i * 8, y, null); - } - } - - private boolean wasDown = true; - - public void tick() { - tick++; - if (!wasDown && keys[Mario.KEY_JUMP]) { - // component.toTitle(); - } - if (keys[Mario.KEY_JUMP]) { - wasDown = false; - } - } - - public float getX(float alpha) { - return 0; - } - - public float getY(float alpha) { - return 0; - } - - @Override - public void mouseClicked(MouseEvent me) { - // TODO Auto-generated method stub - } -} \ No newline at end of file diff --git a/test/dk/itu/mario/level/MyLevelTest.java b/test/dk/itu/mario/level/MyLevelTest.java deleted file mode 100644 index 4c737ec..0000000 --- a/test/dk/itu/mario/level/MyLevelTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package dk.itu.mario.level; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class MyLevelTest { - - @Test - public void test() { - fail("Not yet implemented"); - } - -} diff --git a/test/dk/itu/mario/level/grammar/LevelGrammarFactoryTest.java b/test/dk/itu/mario/level/grammar/LevelGrammarFactoryTest.java deleted file mode 100644 index 561ba7d..0000000 --- a/test/dk/itu/mario/level/grammar/LevelGrammarFactoryTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package dk.itu.mario.level.grammar; - -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import org.junit.Test; - -public class LevelGrammarFactoryTest { - @Test - public void testCreateGrammar() { - LevelGrammar levelGrammar = LevelGrammarFactory.createGrammar(); - assertNotNull(levelGrammar); - System.out.println(levelGrammar.toString()); - } - - @Test - public void testReadFile() throws Exception { - File grammarFile = new File("grammars/overland.grm"); - LevelGrammar levelGrammar = LevelGrammarFactory.createGrammar(grammarFile); - assertNotNull(levelGrammar); - System.out.println("Read Grammar from file:"); - System.out.println(levelGrammar.toString()); - } -} diff --git a/writeup/CS8803_P3.aux b/writeup/CS8803_P3.aux deleted file mode 100644 index 4449262..0000000 --- a/writeup/CS8803_P3.aux +++ /dev/null @@ -1,20 +0,0 @@ -\relax -\citation{zimmerman} -\citation{bartle} -\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}} -\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Adaptive Mario in action}}{1}} -\newlabel{img:mario-ex}{{1}{1}} -\@writefile{toc}{\contentsline {section}{\numberline {2}Related Works}{1}} -\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Flow State: Game Difficulty vs. Player Skill}}{2}} -\newlabel{img:flow-state}{{2}{2}} -\@writefile{toc}{\contentsline {section}{\numberline {3}Approach}{2}} -\citation{forgy} -\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces A Simple Overland Level Grammar}}{3}} -\newlabel{img:stochastic-grammar}{{3}{3}} -\@writefile{toc}{\contentsline {section}{\numberline {4}Evaluation}{4}} -\@writefile{toc}{\contentsline {section}{\numberline {5}Conclusion}{4}} -\bibstyle{unsrt} -\bibdata{p3refs} -\bibcite{zimmerman}{1} -\bibcite{bartle}{2} -\bibcite{forgy}{3} diff --git a/writeup/CS8803_P3.bbl b/writeup/CS8803_P3.bbl deleted file mode 100644 index b8765a4..0000000 --- a/writeup/CS8803_P3.bbl +++ /dev/null @@ -1,20 +0,0 @@ -\begin{thebibliography}{1} - -\bibitem{zimmerman} -K.~Salen and E.~Zimmerman. -\newblock {\em Rules of Play}. -\newblock The MIT Press, 2004. - -\bibitem{bartle} -Richard Bartle. -\newblock Hearts, clubs, diamonds, spades: Players who suit {MUDs}. -\newblock http://aigamedev.com/open/interviews/mario-ai/, 1996. -\newblock [Online; accessed 18-March-2012]. - -\bibitem{forgy} -C.~Forgy. -\newblock Rete: A fast algorithm for the many pattern/many object pattern match - problem. -\newblock {\em Artificial Intelligence}, 19:17--37, 1982. - -\end{thebibliography} diff --git a/writeup/CS8803_P3.blg b/writeup/CS8803_P3.blg deleted file mode 100644 index 44fa952..0000000 --- a/writeup/CS8803_P3.blg +++ /dev/null @@ -1,3 +0,0 @@ -This is BibTeX, Version 0.99dThe top-level auxiliary file: CS8803_P3.aux -The style file: unsrt.bst -Database file #1: p3refs.bib diff --git a/writeup/CS8803_P3.log b/writeup/CS8803_P3.log deleted file mode 100644 index 8779b6f..0000000 --- a/writeup/CS8803_P3.log +++ /dev/null @@ -1,264 +0,0 @@ -This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9) (preloaded format=pdflatex 2012.1.11) 18 MAR 2012 23:05 -entering extended mode -**D:/workspace/cs8803p3/writeup/CS8803_P3.tex -(D:/workspace/cs8803p3/writeup/CS8803_P3.tex -LaTeX2e <2011/06/27> -Babel and hyphenation patterns for english, afrikaans, ancientgreek, ar -abic, armenian, assamese, basque, bengali, bokmal, bulgarian, catalan, coptic, -croatian, czech, danish, dutch, esperanto, estonian, farsi, finnish, french, ga -lician, german, german-x-2009-06-19, greek, gujarati, hindi, hungarian, iceland -ic, indonesian, interlingua, irish, italian, kannada, kurmanji, lao, latin, lat -vian, lithuanian, malayalam, marathi, mongolian, mongolianlmc, monogreek, ngerm -an, ngerman-x-2009-06-19, nynorsk, oriya, panjabi, pinyin, polish, portuguese, -romanian, russian, sanskrit, serbian, slovak, slovenian, spanish, swedish, swis -sgerman, tamil, telugu, turkish, turkmen, ukenglish, ukrainian, uppersorbian, u -senglishmax, welsh, loaded. -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\base\article.cls" -Document Class: article 2007/10/19 v1.4h Standard LaTeX document class -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\base\size10.clo" -File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\titlesec\titlesec.sty" -Package: titlesec 2011/12/15 v2.10.0 Sectioning titles -\ttl@box=\box26 -\beforetitleunit=\skip43 -\aftertitleunit=\skip44 -\ttl@plus=\dimen103 -\ttl@minus=\dimen104 -\ttl@toksa=\toks14 -\titlewidth=\dimen105 -\titlewidthlast=\dimen106 -\titlewidthfirst=\dimen107 -) -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\geometry\geometry.sty" -Package: geometry 2010/09/12 v5.6 Page Geometry - -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\graphics\keyval.sty" -Package: keyval 1999/03/16 v1.13 key=value parser (DPC) -\KV@toks@=\toks15 -) -("C:\Program Files (x86)\MiKTeX 2.9\tex\generic\oberdiek\ifpdf.sty" -Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) -Package ifpdf Info: pdfTeX in PDF mode is detected. -) -("C:\Program Files (x86)\MiKTeX 2.9\tex\generic\oberdiek\ifvtex.sty" -Package: ifvtex 2010/03/01 v1.5 Switches for detecting VTeX and its modes (HO) -Package ifvtex Info: VTeX not detected. -) -("C:\Program Files (x86)\MiKTeX 2.9\tex\generic\ifxetex\ifxetex.sty" -Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional -) -\Gm@cnth=\count87 -\Gm@cntv=\count88 -\c@Gm@tempcnt=\count89 -\Gm@bindingoffset=\dimen108 -\Gm@wd@mp=\dimen109 -\Gm@odd@mp=\dimen110 -\Gm@even@mp=\dimen111 -\Gm@layoutwidth=\dimen112 -\Gm@layoutheight=\dimen113 -\Gm@layouthoffset=\dimen114 -\Gm@layoutvoffset=\dimen115 -\Gm@dimlist=\toks16 - -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\geometry\geometry.cfg")) -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\graphics\graphicx.sty" -Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) - -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\graphics\graphics.sty" -Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR) - -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\graphics\trig.sty" -Package: trig 1999/03/16 v1.09 sin cos tan (DPC) -) -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\00miktex\graphics.cfg" -File: graphics.cfg 2007/01/18 v1.5 graphics configuration of teTeX/TeXLive -) -Package graphics Info: Driver file: pdftex.def on input line 91. - -("C:\Program Files (x86)\MiKTeX 2.9\tex\latex\pdftex-def\pdftex.def" -File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX - -("C:\Program Files (x86)\MiKTeX 2.9\tex\generic\oberdiek\infwarerr.sty" -Package: infwarerr 2010/04/08 v1.3 Providing info/warning/message (HO) -) -("C:\Program Files (x86)\MiKTeX 2.9\tex\generic\oberdiek\ltxcmds.sty" -Package: ltxcmds 2011/04/18 v1.20 LaTeX kernel commands for general use (HO) -) -\Gread@gobject=\count90 -)) -\Gin@req@height=\dimen116 -\Gin@req@width=\dimen117 -) -(D:\workspace\cs8803p3\writeup\CS8803_P3.aux) -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 9. -LaTeX Font Info: ... okay on input line 9. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 9. -LaTeX Font Info: ... okay on input line 9. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 9. -LaTeX Font Info: ... okay on input line 9. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 9. -LaTeX Font Info: ... okay on input line 9. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 9. -LaTeX Font Info: ... okay on input line 9. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 9. -LaTeX Font Info: ... okay on input line 9. - -*geometry* driver: auto-detecting -*geometry* detected driver: pdftex -*geometry* verbose mode - [ preamble ] result: -* driver: pdftex -* paper: letterpaper -* layout: -* layoutoffset:(h,v)=(0.0pt,0.0pt) -* modes: -* h-part:(L,W,R)=(36.135pt, 542.02501pt, 36.135pt) -* v-part:(T,H,B)=(36.135pt, 722.7pt, 36.135pt) -* \paperwidth=614.295pt -* \paperheight=794.96999pt -* \textwidth=542.02501pt -* \textheight=722.7pt -* \oddsidemargin=-36.135pt -* \evensidemargin=-36.135pt -* \topmargin=-73.135pt -* \headheight=12.0pt -* \headsep=25.0pt -* \topskip=10.0pt -* \footskip=30.0pt -* \marginparwidth=65.0pt -* \marginparsep=11.0pt -* \columnsep=10.0pt -* \skip\footins=9.0pt plus 4.0pt minus 2.0pt -* \hoffset=0.0pt -* \voffset=0.0pt -* \mag=1000 -* \@twocolumnfalse -* \@twosidefalse -* \@mparswitchfalse -* \@reversemarginfalse -* (1in=72.27pt=25.4mm, 1cm=28.453pt) - -("C:\Program Files (x86)\MiKTeX 2.9\tex\context\base\supp-pdf.mkii" -[Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count91 -\scratchdimen=\dimen118 -\scratchbox=\box27 -\nofMPsegments=\count92 -\nofMParguments=\count93 -\everyMPshowfont=\toks17 -\MPscratchCnt=\count94 -\MPscratchDim=\dimen119 -\MPnumerator=\count95 -\makeMPintoPDFobject=\count96 -\everyMPtoPDFconversion=\toks18 -) -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <12> on input line 16. -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <8> on input line 16. -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <6> on input line 16. - - -LaTeX Warning: Reference `mario-ex' on page 1 undefined on input line 23. - -Missing character: There is no â in font cmr10! -Missing character: There is no € in font cmr10! -Missing character: There is no ™ in font cmr10! - -File: mario_example.png Graphic file (type png) - -Package pdftex.def Info: mario_example.png used on input line 27. -(pdftex.def) Requested size: 216.80669pt x 162.60416pt. - - -File: mario_underground.png Graphic file (type png) - -Package pdftex.def Info: mario_underground.png used on input line 28. -(pdftex.def) Requested size: 216.80669pt x 162.60416pt. -Missing character: There is no Ă in font cmr10! -Missing character: There is no ˇ in font cmr10! -Missing character: There is no Ă in font cmr10! -Missing character: There is no ­ in font cmr10! -Missing character: There is no Ă in font cmr10! -Missing character: There is no ˇ in font cmr10! - - -File: flow-state.png Graphic file (type png) - -Package pdftex.def Info: flow-state.png used on input line 40. -(pdftex.def) Requested size: 271.0125pt x 198.33125pt. -Missing character: There is no â in font cmr10! -Missing character: There is no € in font cmr10! -Missing character: There is no ™ in font cmr10! - [1 - -{C:/ProgramData/MiKTeX/2.9/pdftex/config/pdftex.map} ] -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <7> on input line 49. -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <5> on input line 49. -Missing character: There is no â in font cmr10! -Missing character: There is no € in font cmr10! -Missing character: There is no ™ in font cmr10! - [2 ] - -File: StochasticGrammar.png Graphic file (type png) - - -Package pdftex.def Info: StochasticGrammar.png used on input line 93. -(pdftex.def) Requested size: 406.51875pt x 206.62346pt. -Missing character: There is no â in font cmr10! -Missing character: There is no € in font cmr10! -Missing character: There is no ™ in font cmr10! - [3 ] -Missing character: There is no â in font cmr10! -Missing character: There is no € in font cmr10! -Missing character: There is no ™ in font cmr10! -Missing character: There is no â in font cmr10! -Missing character: There is no € in font cmr10! -Missing character: There is no ™ in font cmr10! -Missing character: There is no â in font cmr10! -Missing character: There is no € in font cmr10! -Missing character: There is no ™ in font cmr10! - [4] (D:\workspace\cs8803p3\writeup\CS8803_P3.bbl) [5] -(D:\workspace\cs8803p3\writeup\CS8803_P3.aux) - -LaTeX Warning: There were undefined references. - - ) -Here is how much of TeX's memory you used: - 1919 strings out of 494045 - 26282 string characters out of 3145969 - 90718 words of memory out of 3000000 - 5224 multiletter control sequences out of 15000+200000 - 7804 words of font info for 28 fonts, out of 3000000 for 9000 - 715 hyphenation exceptions out of 8191 - 27i,7n,32p,1715b,220s stack positions out of 5000i,500n,10000p,200000b,50000s - - -Output written on CS8803_P3.pdf (5 pages, 155888 bytes). -PDF statistics: - 50 PDF objects out of 1000 (max. 8388607) - 0 named destinations out of 1000 (max. 500000) - 21 words of extra memory for PDF output out of 10000 (max. 10000000) - diff --git a/writeup/CS8803_P3.pdf b/writeup/CS8803_P3.pdf deleted file mode 100644 index 63bb09d..0000000 Binary files a/writeup/CS8803_P3.pdf and /dev/null differ diff --git a/writeup/CS8803_P3.synctex.gz b/writeup/CS8803_P3.synctex.gz deleted file mode 100644 index a25b433..0000000 Binary files a/writeup/CS8803_P3.synctex.gz and /dev/null differ diff --git a/writeup/CS8803_P3.tex b/writeup/CS8803_P3.tex deleted file mode 100644 index f210775..0000000 --- a/writeup/CS8803_P3.tex +++ /dev/null @@ -1,147 +0,0 @@ -\documentclass[letterpaper,10pt]{article} - -\usepackage{titlesec} -\usepackage[margin=0.5in]{geometry} -\usepackage{graphicx} - -\titleformat{\section}{\large\bfseries}{\thesection}{1em}{} - -\begin{document} -\pagestyle{empty} - -\title{Adaptive Mario : CS8803 Game AI Project 3} -\author{Woody Folsom and Marshall Gillson} -\date{March 18, 2012} - -\maketitle - -\section{Introduction} -The game mechanics of the Super Mario world are celebrated and well-understood. Indeed, even in this age of super-computer graphics and Hollywood-level production values, few games can match the pure enjoyment delivered by this simple 8-bit Nintendo platform jumper. Here, we endeavor not to change that formula, but to imbue it with a modern, artificial-intelligence driven approach to enhance the game-play experience. - -In creating Adaptive Mario, we use several procedural content generation (PCG) techniques built upon this simple platform-jumper engine. Our algorithms adjust to player preferences and skills, and guide players toward an ideal game-play experience. Our design is intended to ensure that the maximum amount of replay value is delivered, considering the limited multimedia assets and game-play mechanics of the Infinite Mario engine on which it is based. - -Every Mario level has the implicit goal of progressing from left to right until the completion gate appears, all the while keeping Mario safe. A number of more esoteric subgoals also arise, such as destroying enemies, collecting coins, and minimizing time of completion. Our conceptual design goal, however, was a bit different. As shown in Figure \ref{mario-ex} we aim to provide players with different styles of play and skill levels with distinct and customized game-play experience from the moment the level begins. The process of generating a level consists of a number of steps. First, a player profile is drawn based on the player’s performance in an average, non-customized level. That data is fed into our generation engine to guide the creation of subsequent levels. The level generation pipe-line is explained in full detail in \emph{Section 3 Approach}. - -\begin{figure}[h!] -\centering -\includegraphics[width=0.4 \textwidth]{mario_example.png} -\includegraphics[width=0.4 \textwidth]{mario_underground.png} -\caption{Adaptive Mario in action} -\label{img:mario-ex} -\end{figure} - -As shown in Figure \ref{img:mario-ex}, the conceptual goal is that players with different play styles and skill levels should have a very different game-play experience from the moment the level begins. The very first time Adaptive Mario is run in a new environment, a random level is presented based on an a priori model of an 'average' player. A high degree of randomness at this point allows the player to freely choose a game-play style rather than being constrained by a prefabricated environment. - -\section{Related Works} -A fundamental concept in the design of Adaptive Mario is \emph{flow}. As defined by Mihály CsĂ­kszentmihályi, according to Salen and Zimmerman \cite{zimmerman}, flow is a state of total immersion and concentration in which the player believes he or she is overcoming obstacles by the narrowest margins. As shown in Figure \ref{img:flow-state}, achieving this state involves a delicate balance between the difficulty of the game and the degree of the player's skill. If the game is too hard, the player will become frustrated. On the other hand, most players will become bored if the game is too easy. Our overarching goal was to facilitate a flow state by giving the player sufficient challenge and variety without rapidly becoming too difficult. - -\begin{figure}%[h!] -\centering -\includegraphics[width=0.5 \textwidth]{flow-state.png} -\caption{Flow State: Game Difficulty vs. Player Skill} -\label{img:flow-state} -\end{figure} - -This theory presents two variables: challenge and skill. Adapting the difficulty of a level is well within our purview as game designers, but the level of difficulty required to generate flow state depends on the player’s skill level. We therefore first developed a model of player psychology and ability. Numerous such models have been proposed since Richard Bartle's 1996 study of MUD (Multi-User Dungeon) players \cite{bartle}, all of which attempt to classify a player into a category or type. In developing our model, we considered some notable examples: - -\begin{table}[ht] -\centering -\begin{tabular}{ | l | l | } -\hline -Author & Player Model\\ \hline -Richard Bartle & Killer, Socializer, Achiever, Explorer\\ \hline -Nick Yee & Relationships, Immersion, Grief, Achievement, Leadership \\ \hline -John Radoff & Immersion, Cooperation, Achievement, Competition \\ \hline -\end{tabular} -\end{table} - -The Adaptive Mario PlayerProfileMatcher class assigns the player one of five roles based on past performance: BUMPER, COLLECTOR, JUMPER, RUNNER or SHOOTER. This model is loosely based on Bartle's extended model, with BUMPER corresponding to Planner, in the sense that the player is observed to interact with the environment by bumping bricks and throwing shells. However, our model necessarily differs somewhat from the above examples, as Adaptive Mario is a single-player game with no social element. - -\section{Approach} -The Adaptive Mario level generator functions as a 4-stage pipeline composed of a Profile Matcher, Level Archetype Selector, Level Generator and Challenge Component Creator. - -\subsection*{Profile Matcher} -The first step of the level generation process is to evaluate the player's style and skill level. Adaptive Mario uses the output file ``player.txt'' generated by the GamePlay class during the most recent game, if available. If no player data is available, as in a first run of the game, a simple, un-weighted level is generated, to assist in collecting baseline player data for future runs. More detailed statistics from the DataRecorder class are preserved as XML and are used by some components of the level generator. The ProfileMatcher scores aspects of game-play such as number of kills, jumps, and coins collected in order to evaluate the player's skill in the five identified areas of competency and generate a vector of skill values, within a range of 1 -- 100. The relative weight of each different skill is maintained by the player profile for reference by later segments of the level creation process. Here, the player is also assigned a type based on his or her most dominant trait, and an overall skill level: expert, proficient, competent, beginner, or novice. A player’s skill level is based on a number of different factors. First of all, his or her average skill level across the skill vector is included. The speed with which the previous level was completed is integrated, as a player who finds a level too easy can complete it quickly and without error. Finally, the number of times their power-up state changed; if a player is not being threatened or hurt will tend to remain in one power-up state through much of a level, with few changes. A weighted overall skill score is produced and mapped to one of the five skill levels as shown below. - -\begin{table}[ht] -\centering -\begin{tabular}{ | l | l | l | } -\hline -Score & Skill Level & Attributes\\ \hline -20\% & Novice & Low situational awareness, Reflexive responses\\ \hline -40\% & Beginner & Uses judgment to react to challenges, Limited awareness \\ \hline -60\% & Competent & Copes with multiple challenges, Uses sound strategy \\ \hline -80\% & Proficient & Makes rapid decisions, Prioritizes goals \\ \hline -100\% & Expert & Intuitively solves challenges, Pushes limits \\ \hline -\end{tabular} -\end{table} - -These categories are based on the Dreyfus model of skill acquisition with each successive level representing an achievement of 20\% of the Profile's key skill maximum score, before penalties. Actions such as dying or making unnecessary jumps negatively impact the skill assessment. - -\subsection*{Level Archetype Selection} -The Level Archetype selector picks an overall macro-form for the level based on the player's profile and skill level. As there are five categories and only three distinct environments in the Inifinite Mario engine (Overland, Underground and Castle), different profiles cause similar Level Archetypes to be generated. However, this does provide the opportunity to indicate to the player what types of challenges lie ahead and may serve to enhance immersion. - -Next, the Level Archetype is further customized for the player by disabling challenges and enabling rewards according to a predefined set of rules. In order to allow the rule set to be easily customized and extended, Adaptive Mario uses Drools, an implementation of Charles Forgy's 1982 Rete algorithm \cite{forgy}. Once the appropriate rules have fired, level generation proceeds to the third stage: macro-structure generation. - -\subsection*{Level Generation: Macro-structure} -The task of the macro-structure generator is to deliver a list of sequential Mario level design elements (LevelComponents) based on a high level description similar to ``Overland level with gaps but no pipes, difficulty 5/10''. Several algorithms were considered during the planning phase of this module. A Genetic Algorithm approach could potentially produce novel levels, but judging the relative fitness of candidate levels could be problematic. Hierarchical task networks (HTNs) and rhythm-based approaches have also been used, but tend to generate levels with a very uniform structure in a single pass. For ease of modification and to leverage the authors' design intuition, a context-free grammar (CFG) was implemented instead. - -Given a suitable array of predefined LevelComponent types, each of which corresponds to one or more Infinite Mario game sprites, the structure of a level archetype can be completely specified in the form of a file-based CFG. As shown in the following example, the OR clauses are assigned probability values, giving a stochastic property to the generated level structure. - -\begin{figure}[h!] -\centering -\includegraphics[width=0.75 \textwidth]{StochasticGrammar.png} -\caption{A Simple Overland Level Grammar} -\label{img:stochastic-grammar} -\end{figure} - -One potential pitfall of using a CFG for this purpose is that the generated level may be over-specified (containing too many elements) and hence too crowded, or under-specified and nearly empty. To mitigate this problem, a fitness evaluation function iteratively invokes the LevelGrammar class's generateRandomTree() method, rejecting proposed levels with too many or too few LevelComponents. - -\subsection*{Challenge Components: Micro-structure} -Challenge components are the building blocks of an Adaptive Mario level. Each challenge component represents a small puzzle or level element. Each level consists of a sequence of challenge components. Through only a small number of these components, we have achieved a wide variety of possible levels. In fact, the challenge components induce variety and adapt to the player’s style in the following ways. - -First, the selection of components plays a large role in defining the character of a level. Many challenges are better suited for different play styles, based on the skills they require to traverse or the rewards they cause a player to incur. This allows a level to shift toward a more engaging landscape for a player of a particular style. Second, each challenge component dynamically adjusts its difficulty based on the player’s skill level. The player’s skill competencies affect the number of enemies they encounter, the number of power-ups they are offered, the number of coins placed on a level, the difficulty of the enemies they face, the size and number of pits in a level, and the types of terrain encountered. Because challenge components are so dynamic, even a single challenge element encountered repeatedly can present and engaging challenge. - -An additional benefit of challenge components is their modularity. Though we have implemented a strong suite of challenges, innumerable more are possible. With the implementation of a function and slight modification of the level generation grammar, new challenges can be added to Adaptive Mario to make it even more variable and extend its replay value further. - -\begin{table}[ht] -\centering -\begin{tabular}{ | l | l | l | } -\hline -Difficulty & Challenge Component & Description \\ \hline -1 & Coin Dive & Some empty blocks, coins line the path to the ground.\\ \hline -2 & Free power-up & Sets the player up to get a power-up with little or no challenge.\\ \hline -3 & Straight & A straight stretch of land with maybe one enemy and maybe some coins or blocks\\ \hline -4 & Single Pit & A pit that the user must jump over; rocks on either side.\\ \hline -5 & Bowling Alley & A red koopa right before a long line of enemies. Kill them all!\\ \hline -6 & Cannon Line & A stack of 2 or 3 cannons.\\ \hline -7 & Maze & A maze of indestructible blocks, with enemies.\\ \hline -8 & Lemming Trap & A little pit with a few enemies that jump down into it.\\ \hline -9 & Platform Jump & A bunch of platforms to jump between.\\ \hline -10 & Pipe Jump & A bunch of thin pipes to jump between.\\ \hline -\end{tabular} -\end{table} - -\section{Evaluation} -Developing Adaptive Mario presented several challenges. From a technical standpoint, finding a Java-compatible Rete rule engine became a time-consuming effort, due mostly to the large number of third-party JAR dependencies. Ultimately, we were able to incorporate the Drools engine into our code base. The amount of time, however, that was invested in doing so forced the minimization of role of the rules engine. It therefore makes only basic alterations to random levels based on the player profile. - -Randomized level generation using a stochastic CFG was largely successful, however. Not only can our very simple grammar generate a huge variety of levels, the implementation of a parser for the rule set allows future designers to make meaningful content changes without needing to recompile source code. Such grammars are, of course, limited to some degree. The grammar by definition lacks any contextual awareness. It therefore does nothing to avoid awkward juxtaposition of challenge components. Though challenge components are self-contained such that transition between any two should not present a problem, we nonetheless recognize this stratification as a limitation of our architecture. - -Perhaps the most challenging aspect of our development process was the creation of the PlayerProfile. Each level is generated based on player data from only the single previous level traversal. Thus, the terrain of a previous level may have an inordinate effect on the evaluation of a player’s current tastes. We built our ProfileMatcher to minimize this possibility, but it nonetheless exists. A more complex version of Adaptive Mario would benefit greatly from a more iterative and flexible approach to player modeling, perhaps by employing an artificial neural network or Bayesian inference. These techniques would allow for more accurate and therefore useful scoring values, but would require more involved modification of the game engine. - -\section{Conclusion} -It seems clear from these results that the framework of Adaptive Mario has the potential to guide the player toward his or her own idealized version of a platform game, while still presenting a reasonable level of challenge. Not only does difficulty scale in proportion to the player's performance (preventing frustration), but care is taken in the design of the level grammar to avoid repeatedly giving the player 'more of the same' (leading to boredom). We certainly recognize many areas ripe for improvement (such as the limited level grammar), yet Adaptive Mario as currently implemented represents a robust engine. It provides tools for the adaptive content designer and new experiences for the consumer. It certainly adds a novel twist on the genre for any platform gaming enthusiast. - -\section*{Appendix A: Building the Game} -Building the Project 3 executable requires a Java SDK version 1.6+ and Apache Ant. - -To build the game, execute \texttt{ant clean} followed by \texttt{ant} from the main project directory. - -\section*{Appendix B: Running the Game} - -To run the game, change to the `dist' subdirectory following a successful build and execute \texttt{java -jar CS8803\_P3.jar}. - -\bibliographystyle{unsrt} -\bibliography{p3refs} - -\end{document} \ No newline at end of file diff --git a/writeup/p3refs.bib b/writeup/p3refs.bib deleted file mode 100644 index 04b24bd..0000000 --- a/writeup/p3refs.bib +++ /dev/null @@ -1,53 +0,0 @@ -@BOOK{russelnorvig, - title = {Artificial Intelligence; A Modern Approach}, - author = {Russel, S. and Norvig, P.}, - publisher = {Prentice Hall}, - edition = {Third}, - year = 2010 -} - -@BOOK{millington, - title = {Artificial Intelligence for Games}, - author = {Millington, I. and Funge, J.}, - publisher = {Morgan Kaufmann}, - year = 2009 -} - -@BOOK{buckland, - title = {Programming Game AI by Example}, - author = {Mat Buckland}, - publisher = {Wordware Publishing, Inc.}, - year = 2005 -} - -@MISC{champ, - AUTHOR = "Alex Champandard", - TITLE = "Infinite {Mario} {AI} {using} {A*} {Search}", - HOWPUBLISHED = "http://aigamedev.com/open/interviews/mario-ai/", - YEAR = 2009, - NOTE = "[Online; accessed 18-Feburary-2012]" -} - -@MISC{bartle, - AUTHOR = "Richard Bartle", - TITLE = "Hearts, Clubs, Diamonds, Spades: Players Who suit {MUDs}", - HOWPUBLISHED = "http://aigamedev.com/open/interviews/mario-ai/", - YEAR = 1996, - NOTE = "[Online; accessed 18-March-2012]" -} - -@BOOK{zimmerman, - title = {Rules of Play}, - author = {Salen, K. and Zimmerman, E.}, - publisher = {The MIT Press}, - year = 2004 -} - -@ARTICLE{forgy, - AUTHOR = "Forgy, C.", - TITLE = "RETE: A fast algorithm for the many pattern/many object pattern match problem", - YEAR = "1982", - JOURNAL = "Artificial Intelligence", - VOLUME = "19", - PAGES = "17-37" -} \ No newline at end of file diff --git a/writeup/p3refs.log b/writeup/p3refs.log deleted file mode 100644 index 534357a..0000000 --- a/writeup/p3refs.log +++ /dev/null @@ -1,11 +0,0 @@ -This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9) (preloaded format=pdftex 2012.1.30) 18 MAR 2012 19:56 -entering extended mode -**D:/workspace/cs8803p3/writeup/p3refs.bib -(D:/workspace/cs8803p3/writeup/p3refs.bib) -* -! Emergency stop. -<*> D:/workspace/cs8803p3/writeup/p3refs.bib - -End of file on the terminal! - -! ==> Fatal error occurred, no output PDF file produced!